Changes in src/libcfa/iostream.c [6ba0659:53ba273]
- File:
-
- 1 edited
-
src/libcfa/iostream.c (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/iostream.c
r6ba0659 r53ba273 7 7 // iostream.c -- 8 8 // 9 // Author : Richard C. Bilson9 // Author : Peter A. Buhr 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Feb 17 14:19:56201613 // Update Count : 7612 // Last Modified On : Wed Apr 6 16:13:29 2016 13 // Update Count : 278 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, ispunct 23 24 } 24 25 25 26 forall( dtype ostype | ostream( ostype ) ) 26 27 ostype * ?|?( ostype *os, char c ) { 27 return write( os, &c, 1 ); 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; 28 47 } // ?|? 29 48 30 49 forall( dtype ostype | ostream( ostype ) ) 31 50 ostype * ?|?( ostype *os, int i ) { 32 char buffer[32]; 33 return write( os, buffer, sprintf( buffer, "%d", i ) ); 34 } // ?|? 35 36 forall( dtype ostype | ostream( ostype ) ) 37 ostype * ?|?( ostype *os, unsigned int i ) { 38 char buffer[32]; 39 return write( os, buffer, sprintf( buffer, "%u", i ) ); 40 } // ?|? 41 42 forall( dtype ostype | ostream( ostype ) ) 43 ostype * ?|?( ostype *os, long int i ) { 44 char buffer[32]; 45 return write( os, buffer, sprintf( buffer, "%ld", i ) ); 46 } // ?|? 47 48 forall( dtype ostype | ostream( ostype ) ) 49 ostype * ?|?( ostype *os, long long int i ) { 50 char buffer[32]; 51 return write( os, buffer, sprintf( buffer, "%lld", i ) ); 52 } // ?|? 53 54 forall( dtype ostype | ostream( ostype ) ) 55 ostype * ?|?( ostype *os, unsigned long int i ) { 56 char buffer[32]; 57 return write( os, buffer, sprintf( buffer, "%lu", i ) ); 58 } // ?|? 59 60 forall( dtype ostype | ostream( ostype ) ) 61 ostype * ?|?( ostype *os, unsigned long long int i ) { 62 char buffer[32]; 63 return write( os, buffer, sprintf( buffer, "%llu", i ) ); 51 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); 52 sepReset( os ); 53 prtfmt( os, "%d", i ); 54 return os; 55 } // ?|? 56 57 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; 63 } // ?|? 64 65 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; 71 } // ?|? 72 73 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; 79 } // ?|? 80 81 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; 87 } // ?|? 88 89 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; 64 95 } // ?|? 65 96 66 97 forall( dtype ostype | ostream( ostype ) ) 67 98 ostype * ?|?( ostype *os, float f ) { 68 char buffer[32]; 69 return write( os, buffer, sprintf( buffer, "%g", f ) ); 99 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); 100 sepReset( os ); 101 prtfmt( os, "%g", f ); 102 return os; 70 103 } // ?|? 71 104 72 105 forall( dtype ostype | ostream( ostype ) ) 73 106 ostype * ?|?( ostype *os, double d ) { 74 char buffer[32]; 75 return write( os, buffer, sprintf( buffer, "%.*lg", DBL_DIG, d ) ); 76 } // ?|? 77 78 forall( dtype ostype | ostream( ostype ) ) 79 ostype * ?|?( ostype *os, long double d ) { 80 char buffer[32]; 81 return write( os, buffer, sprintf( buffer, "%.*Lg", LDBL_DIG, d ) ); 82 } // ?|? 83 84 forall( dtype ostype | ostream( ostype ) ) 85 ostype * ?|?( ostype *os, float _Complex c ) { 86 return os | crealf( c ) | (cimagf( c ) < 0 ? "" : "+") | cimagf( c ) | 'i'; 87 } // ?|? 88 89 forall( dtype ostype | ostream( ostype ) ) 90 ostype * ?|?( ostype *os, double _Complex c ) { 91 return os | creal( c ) | (cimag( c ) < 0 ? "" : "+") | cimag( c ) | 'i'; 92 } // ?|? 93 94 forall( dtype ostype | ostream( ostype ) ) 95 ostype * ?|?( ostype *os, long double _Complex c ) { 96 return os | creall( c ) | (cimagl( c ) < 0 ? "" : "+") | cimagl( c ) | 'i'; 107 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); 108 sepReset( os ); 109 prtfmt( os, "%.*lg", DBL_DIG, d ); 110 return os; 111 } // ?|? 112 113 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; 119 } // ?|? 120 121 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; 129 } // ?|? 130 131 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; 139 } // ?|? 140 141 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; 149 } // ?|? 150 151 forall( dtype ostype | ostream( ostype ) ) 152 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 ); 97 184 } // ?|? 98 185 99 186 forall( dtype ostype | ostream( ostype ) ) 100 187 ostype * ?|?( ostype *os, const void *p ) { 101 char buffer[32]; 102 return write( os, buffer, sprintf( buffer, "%p", p ) ); 103 } // ?|? 104 105 forall( dtype ostype | ostream( ostype ) ) 106 ostype * ?|?( ostype *os, const char *cp ) { 107 return write( os, cp, strlen( cp ) ); 108 } // ?|? 109 110 111 forall( dtype ostype, dtype retostype | ostream( ostype ) | ostream( retostype ) ) 112 retostype * ?|?( ostype *os, retostype * (*manip)(ostype*) ) { 113 return manip( os ); 114 } 188 if ( sepPrt( os ) ) prtfmt( os, "%s", sepGet( os ) ); 189 sepReset( os ); 190 prtfmt( os, "%p", p ); 191 return os; 192 } // ?|? 193 194 195 forall( dtype ostype | ostream( ostype ) ) 196 ostype * ?|?( ostype *os, ostype * (* manip)( ostype * ) ) { 197 return manip( os ); 198 } // ?|? 115 199 116 200 forall( dtype ostype | ostream( ostype ) ) 117 201 ostype * endl( ostype * os ) { 118 os | "\n";202 os | '\n'; 119 203 flush( os ); 204 sepOff( os ); 120 205 return os; 121 206 } // endl 122 207 208 forall( dtype ostype | ostream( ostype ) ) 209 ostype * sepOn( ostype * os ) { 210 sepOn( os ); 211 return os; 212 } // sepOn 213 214 forall( dtype ostype | ostream( ostype ) ) 215 ostype * sepOff( ostype * os ) { 216 sepOff( os ); 217 return os; 218 } // sepOff 219 220 forall( dtype ostype | ostream( ostype ) ) 221 ostype * sepEnable( ostype * os ) { 222 sepEnable( os ); 223 return os; 224 } // sepEnable 225 226 forall( dtype ostype | ostream( ostype ) ) 227 ostype * sepDisable( ostype * os ) { 228 sepDisable( os ); 229 return os; 230 } // sepDisable 231 123 232 //--------------------------------------- 124 233 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 | ' '; } 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; } 129 237 for_each( begin, end, print ); 130 238 } // ?|? 131 239 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 | ' '; } 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; } 136 243 for_each_reverse( begin, end, print ); 137 244 } // ?|? … … 140 247 141 248 forall( dtype istype | istream( istype ) ) 142 istype * ?|?( istype *is, char *cp ) { 143 return read( is, cp, 1 ); 144 } // ?|? 145 146 forall( dtype istype | istream( istype ) ) 147 istype * ?|?( istype *is, int *ip ) { 148 return get( is, ip ); 149 } // ?|? 249 istype * ?|?( istype * is, char * c ) { 250 scanfmt( is, "%c", c ); 251 return is; 252 } // ?|? 253 254 forall( dtype istype | istream( istype ) ) 255 istype * ?|?( istype * is, short int * si ) { 256 scanfmt( is, "%hd", si ); 257 return is; 258 } // ?|? 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 } // cstr 352 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 } // cstr 150 361 151 362 // Local Variables: //
Note:
See TracChangeset
for help on using the changeset viewer.