Changes in src/libcfa/iostream.c [53ba273:6ba0659]
- File:
-
- 1 edited
-
src/libcfa/iostream.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/iostream.c
r53ba273 r6ba0659 7 7 // iostream.c -- 8 8 // 9 // Author : Peter A. Buhr9 // Author : Richard C. Bilson 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Apr 6 16:13:29201613 // Update Count : 27812 // Last Modified On : Wed Feb 17 14:19:56 2016 13 // Update Count : 76 14 14 // 15 15 … … 21 21 #include <float.h> // DBL_DIG, LDBL_DIG 22 22 #include <complex.h> // creal, cimag 23 #include <ctype.h> // isspace, ispunct24 23 } 25 24 26 25 forall( dtype ostype | ostream( ostype ) ) 27 26 ostype * ?|?( ostype *os, char c ) { 28 prtfmt( os, "%c", c ); 29 sepOff( os ); 30 return os; 31 } // ?|? 32 33 forall( dtype ostype | ostream( ostype ) ) 34 ostype * ?|?( ostype *os, short int si ) { 35 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); 36 sepReset( os ); 37 prtfmt( os, "%hd", si ); 38 return os; 39 } // ?|? 40 41 forall( dtype ostype | ostream( ostype ) ) 42 ostype * ?|?( ostype *os, unsigned short int usi ) { 43 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); 44 sepReset( os ); 45 prtfmt( os, "%hu", usi ); 46 return os; 27 return write( os, &c, 1 ); 47 28 } // ?|? 48 29 49 30 forall( dtype ostype | ostream( ostype ) ) 50 31 ostype * ?|?( ostype *os, int i ) { 51 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); 52 sepReset( os ); 53 prtfmt( os, "%d", i ); 54 return os; 32 char buffer[32]; 33 return write( os, buffer, sprintf( buffer, "%d", i ) ); 55 34 } // ?|? 56 35 57 36 forall( dtype ostype | ostream( ostype ) ) 58 ostype * ?|?( ostype *os, unsigned int ui ) { 59 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); 60 sepReset( os ); 61 prtfmt( os, "%u", ui ); 62 return os; 37 ostype * ?|?( ostype *os, unsigned int i ) { 38 char buffer[32]; 39 return write( os, buffer, sprintf( buffer, "%u", i ) ); 63 40 } // ?|? 64 41 65 42 forall( dtype ostype | ostream( ostype ) ) 66 ostype * ?|?( ostype *os, long int li ) { 67 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); 68 sepReset( os ); 69 prtfmt( os, "%ld", li ); 70 return os; 43 ostype * ?|?( ostype *os, long int i ) { 44 char buffer[32]; 45 return write( os, buffer, sprintf( buffer, "%ld", i ) ); 71 46 } // ?|? 72 47 73 48 forall( dtype ostype | ostream( ostype ) ) 74 ostype * ?|?( ostype *os, unsigned long int uli ) { 75 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); 76 sepReset( os ); 77 prtfmt( os, "%lu", uli ); 78 return os; 49 ostype * ?|?( ostype *os, long long int i ) { 50 char buffer[32]; 51 return write( os, buffer, sprintf( buffer, "%lld", i ) ); 79 52 } // ?|? 80 53 81 54 forall( dtype ostype | ostream( ostype ) ) 82 ostype * ?|?( ostype *os, long long int lli ) { 83 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); 84 sepReset( os ); 85 prtfmt( os, "%lld", lli ); 86 return os; 55 ostype * ?|?( ostype *os, unsigned long int i ) { 56 char buffer[32]; 57 return write( os, buffer, sprintf( buffer, "%lu", i ) ); 87 58 } // ?|? 88 59 89 60 forall( dtype ostype | ostream( ostype ) ) 90 ostype * ?|?( ostype *os, unsigned long long int ulli ) { 91 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); 92 sepReset( os ); 93 prtfmt( os, "%llu", ulli ); 94 return os; 61 ostype * ?|?( ostype *os, unsigned long long int i ) { 62 char buffer[32]; 63 return write( os, buffer, sprintf( buffer, "%llu", i ) ); 95 64 } // ?|? 96 65 97 66 forall( dtype ostype | ostream( ostype ) ) 98 67 ostype * ?|?( ostype *os, float f ) { 99 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); 100 sepReset( os ); 101 prtfmt( os, "%g", f ); 102 return os; 68 char buffer[32]; 69 return write( os, buffer, sprintf( buffer, "%g", f ) ); 103 70 } // ?|? 104 71 105 72 forall( dtype ostype | ostream( ostype ) ) 106 73 ostype * ?|?( ostype *os, double d ) { 107 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); 108 sepReset( os ); 109 prtfmt( os, "%.*lg", DBL_DIG, d ); 110 return os; 74 char buffer[32]; 75 return write( os, buffer, sprintf( buffer, "%.*lg", DBL_DIG, d ) ); 111 76 } // ?|? 112 77 113 78 forall( dtype ostype | ostream( ostype ) ) 114 ostype * ?|?( ostype *os, long double ld ) { 115 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); 116 sepReset( os ); 117 prtfmt( os, "%.*Lg", LDBL_DIG, ld ); 118 return os; 79 ostype * ?|?( ostype *os, long double d ) { 80 char buffer[32]; 81 return write( os, buffer, sprintf( buffer, "%.*Lg", LDBL_DIG, d ) ); 119 82 } // ?|? 120 83 121 84 forall( dtype ostype | ostream( ostype ) ) 122 ostype * ?|?( ostype *os, float _Complex fc ) { 123 os | crealf( fc ); 124 _Bool temp = sepDisable( os ); // disable separators within complex value 125 if ( cimagf( fc ) >= 0 ) os | '+'; // negative value prints '-' 126 os | cimagf( fc ) | 'i'; 127 sepReset( os, temp ); // reset separator 128 return os; 85 ostype * ?|?( ostype *os, float _Complex c ) { 86 return os | crealf( c ) | (cimagf( c ) < 0 ? "" : "+") | cimagf( c ) | 'i'; 129 87 } // ?|? 130 88 131 89 forall( dtype ostype | ostream( ostype ) ) 132 ostype * ?|?( ostype *os, double _Complex dc ) { 133 os | creal( dc ); 134 _Bool temp = sepDisable( os ); // disable separators within complex value 135 if ( cimag( dc ) >= 0 ) os | '+'; // negative value prints '-' 136 os | cimag( dc ) | 'i'; 137 sepReset( os, temp ); // reset separator 138 return os; 90 ostype * ?|?( ostype *os, double _Complex c ) { 91 return os | creal( c ) | (cimag( c ) < 0 ? "" : "+") | cimag( c ) | 'i'; 139 92 } // ?|? 140 93 141 94 forall( dtype ostype | ostream( ostype ) ) 142 ostype * ?|?( ostype *os, long double _Complex ldc ) { 143 os | creall( ldc ); 144 _Bool temp = sepDisable( os ); // disable separators within complex value 145 if ( cimagl( ldc ) >= 0 ) os | '+'; // negative value prints '-' 146 os | cimagl( ldc ) | 'i'; 147 sepReset( os, temp ); // reset separator 148 return os; 95 ostype * ?|?( ostype *os, long double _Complex c ) { 96 return os | creall( c ) | (cimagl( c ) < 0 ? "" : "+") | cimagl( c ) | 'i'; 97 } // ?|? 98 99 forall( dtype ostype | ostream( ostype ) ) 100 ostype * ?|?( ostype *os, const void *p ) { 101 char buffer[32]; 102 return write( os, buffer, sprintf( buffer, "%p", p ) ); 149 103 } // ?|? 150 104 151 105 forall( dtype ostype | ostream( ostype ) ) 152 106 ostype * ?|?( ostype *os, const char *cp ) { 153 enum { Open = 1, Close, OpenClose }; 154 static const unsigned char mask[256] = { 155 // opening delimiters 156 ['('] : Open, ['['] : Open, ['{'] : Open, 157 ['$'] : Open, [(unsigned char)'£'] : Open, [(unsigned char)'¥'] : Open, [(unsigned char)'¿'] : Open, [(unsigned char)'«'] : Open, 158 // closing delimiters 159 [','] : Close, ['.'] : Close, [':'] : Close, [';'] : Close, ['!'] : Close, ['?'] : Close, 160 [')'] : Close, [']'] : Close, ['}'] : Close, 161 ['%'] : Close, [(unsigned char)'¢'] : Close, [(unsigned char)'»'] : Close, 162 // opening-closing delimiters 163 ['\''] : OpenClose, ['`'] : OpenClose, ['"'] : OpenClose, 164 ['\f'] : OpenClose, ['\n'] : OpenClose, ['\r'] : OpenClose, ['\t'] : OpenClose, ['\v'] : OpenClose, // isspace 165 }; // mask 166 167 int len = strlen( cp ); 168 // null string => no separator 169 if ( len == 0 ) { sepOff( os ); return os; } 170 // first character IS NOT spacing or closing punctuation => add left separator 171 unsigned char ch = cp[0]; // must make unsigned 172 if ( sepPrt( os ) && mask[ ch ] != Close && mask[ ch ] != OpenClose ) { 173 prtfmt( os, "%s", sepGet( os ) ); 174 } // if 175 // last character IS spacing or opening punctuation => turn off separator for next item 176 unsigned int posn = len - 1; 177 ch = cp[posn]; // must make unsigned 178 if ( mask[ ch ] == Open || mask[ ch ] == OpenClose ) { 179 sepOff( os ); 180 } else { 181 sepOn( os ); 182 } // if 183 return write( os, cp, len ); 184 } // ?|? 185 186 forall( dtype ostype | ostream( ostype ) ) 187 ostype * ?|?( ostype *os, const void *p ) { 188 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); 189 sepReset( os ); 190 prtfmt( os, "%p", p ); 191 return os; 107 return write( os, cp, strlen( cp ) ); 192 108 } // ?|? 193 109 194 110 195 forall( dtype ostype | ostream(ostype ) )196 ostype * ?|?( ostype *os, ostype * (* manip)( ostype *) ) {197 return manip( os );198 } // ?|?111 forall( dtype ostype, dtype retostype | ostream( ostype ) | ostream( retostype ) ) 112 retostype * ?|?( ostype *os, retostype * (*manip)(ostype*) ) { 113 return manip( os ); 114 } 199 115 200 116 forall( dtype ostype | ostream( ostype ) ) 201 117 ostype * endl( ostype * os ) { 202 os | '\n';118 os | "\n"; 203 119 flush( os ); 204 sepOff( os );205 120 return os; 206 121 } // endl 207 122 208 forall( dtype ostype | ostream( ostype ) )209 ostype * sepOn( ostype * os ) {210 sepOn( os );211 return os;212 } // sepOn213 214 forall( dtype ostype | ostream( ostype ) )215 ostype * sepOff( ostype * os ) {216 sepOff( os );217 return os;218 } // sepOff219 220 forall( dtype ostype | ostream( ostype ) )221 ostype * sepEnable( ostype * os ) {222 sepEnable( os );223 return os;224 } // sepEnable225 226 forall( dtype ostype | ostream( ostype ) )227 ostype * sepDisable( ostype * os ) {228 sepDisable( os );229 return os;230 } // sepDisable231 232 123 //--------------------------------------- 233 124 234 forall( otype elttype | writeable( elttype ), otype iteratortype | iterator( iteratortype, elttype ), dtype ostype | ostream( ostype ) ) 235 void write( iteratortype begin, iteratortype end, ostype *os ) { 236 void print( elttype i ) { os | i; } 125 forall( type elt_type | writeable( elt_type ), type iterator_type | iterator( iterator_type, elt_type ), 126 dtype os_type | ostream( os_type ) ) 127 void write( iterator_type begin, iterator_type end, os_type *os ) { 128 void print( elt_type i ) { os | i | ' '; } 237 129 for_each( begin, end, print ); 238 130 } // ?|? 239 131 240 forall( otype elttype | writeable( elttype ), otype iteratortype | iterator( iteratortype, elttype ), dtype ostype | ostream( ostype ) ) 241 void write_reverse( iteratortype begin, iteratortype end, ostype *os ) { 242 void print( elttype i ) { os | i; } 132 forall( type elt_type | writeable( elt_type ), type iterator_type | iterator( iterator_type, elt_type ), 133 dtype os_type | ostream( os_type ) ) 134 void write_reverse( iterator_type begin, iterator_type end, os_type *os ) { 135 void print( elt_type i ) { os | i | ' '; } 243 136 for_each_reverse( begin, end, print ); 244 137 } // ?|? … … 247 140 248 141 forall( dtype istype | istream( istype ) ) 249 istype * ?|?( istype * is, char * c ) { 250 scanfmt( is, "%c", c ); 251 return is; 142 istype * ?|?( istype *is, char *cp ) { 143 return read( is, cp, 1 ); 252 144 } // ?|? 253 145 254 146 forall( dtype istype | istream( istype ) ) 255 istype * ?|?( istype * is, short int * si ) { 256 scanfmt( is, "%hd", si ); 257 return is; 147 istype * ?|?( istype *is, int *ip ) { 148 return get( is, ip ); 258 149 } // ?|? 259 260 forall( dtype istype | istream( istype ) )261 istype * ?|?( istype * is, unsigned short int * usi ) {262 scanfmt( is, "%hu", usi );263 return is;264 } // ?|?265 266 forall( dtype istype | istream( istype ) )267 istype * ?|?( istype * is, int * i ) {268 scanfmt( is, "%d", i );269 return is;270 } // ?|?271 272 forall( dtype istype | istream( istype ) )273 istype * ?|?( istype * is, unsigned int * ui ) {274 scanfmt( is, "%u", ui );275 return is;276 } // ?|?277 278 forall( dtype istype | istream( istype ) )279 istype * ?|?( istype * is, long int * li ) {280 scanfmt( is, "%ld", li );281 return is;282 } // ?|?283 284 forall( dtype istype | istream( istype ) )285 istype * ?|?( istype * is, unsigned long int * ulli ) {286 scanfmt( is, "%lu", ulli );287 return is;288 } // ?|?289 290 forall( dtype istype | istream( istype ) )291 istype * ?|?( istype * is, long long int * lli ) {292 scanfmt( is, "%lld", lli );293 return is;294 } // ?|?295 296 forall( dtype istype | istream( istype ) )297 istype * ?|?( istype * is, unsigned long long int * ulli ) {298 scanfmt( is, "%llu", ulli );299 return is;300 } // ?|?301 302 303 forall( dtype istype | istream( istype ) )304 istype * ?|?( istype * is, float * f ) {305 scanfmt( is, "%f", f );306 return is;307 } // ?|?308 309 forall( dtype istype | istream( istype ) )310 istype * ?|?( istype * is, double * d ) {311 scanfmt( is, "%lf", d );312 return is;313 } // ?|?314 315 forall( dtype istype | istream( istype ) )316 istype * ?|?( istype * is, long double * ld ) {317 scanfmt( is, "%Lf", ld );318 return is;319 } // ?|?320 321 322 forall( dtype istype | istream( istype ) )323 istype * ?|?( istype * is, float _Complex * fc ) {324 float re, im;325 scanfmt( is, "%g%gi", &re, &im );326 *fc = re + im * _Complex_I;327 return is;328 } // ?|?329 330 forall( dtype istype | istream( istype ) )331 istype * ?|?( istype * is, double _Complex * dc ) {332 double re, im;333 scanfmt( is, "%lf%lfi", &re, &im );334 *dc = re + im * _Complex_I;335 return is;336 } // ?|?337 338 forall( dtype istype | istream( istype ) )339 istype * ?|?( istype * is, long double _Complex * ldc ) {340 long double re, im;341 scanfmt( is, "%Lf%Lfi", &re, &im );342 *ldc = re + im * _Complex_I;343 return is;344 } // ?|?345 346 _Istream_cstrUC cstr( char * s ) { _Istream_cstrUC s = { s }; return s; }347 forall( dtype istype | istream( istype ) )348 istype * ?|?( istype * is, _Istream_cstrUC cstr ) {349 scanfmt( is, "%s", cstr.s );350 return is;351 } // cstr352 353 _Istream_cstrC cstr( char * s, int size ) { _Istream_cstrC s = { s, size }; return s; }354 forall( dtype istype | istream( istype ) )355 istype * ?|?( istype * is, _Istream_cstrC cstr ) {356 char buf[16];357 sprintf( buf, "%%%ds", cstr.size );358 scanfmt( is, buf, cstr.s );359 return is;360 } // cstr361 150 362 151 // Local Variables: //
Note:
See TracChangeset
for help on using the changeset viewer.