Changes in libcfa/src/fstream.cfa [ba0d2ea:52e311a]
- File:
-
- 1 edited
-
libcfa/src/fstream.cfa (modified) (14 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/fstream.cfa
rba0d2ea r52e311a 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Thu Jul 29 22:34:10202113 // Update Count : 45412 // Last Modified On : Sun Oct 10 11:23:05 2021 13 // Update Count : 512 14 14 // 15 15 … … 28 28 #define IO_MSG "I/O error: " 29 29 30 void ?{}( ofstream & os, void * file ) { 31 os.file$ = file; 32 os.sepDefault$ = true;33 os.sepOnOff$ = false;34 os.nlOnOff$ = true;35 os.prt$ = false;36 os.sawNL$ = false;37 os.acquired$ = false;30 // private 31 void ?{}( ofstream & os, void * file ) with( os ) { 32 file$ = file; 33 sepDefault$ = true; 34 sepOnOff$ = false; 35 nlOnOff$ = true; 36 prt$ = false; 37 sawNL$ = false; 38 38 sepSetCur$( os, sepGet( os ) ); 39 39 sepSet( os, " " ); … … 41 41 } // ?{} 42 42 43 // private 44 bool sepPrt$( ofstream & os ) { setNL$( os, false ); return os.sepOnOff$; } 45 void sepReset$( ofstream & os ) { os.sepOnOff$ = os.sepDefault$; } 46 void sepReset$( ofstream & os, bool reset ) { os.sepDefault$ = reset; os.sepOnOff$ = os.sepDefault$; } 47 const char * sepGetCur$( ofstream & os ) { return os.sepCur$; } 48 void sepSetCur$( ofstream & os, const char sepCur[] ) { os.sepCur$ = sepCur; } 49 bool getNL$( ofstream & os ) { return os.sawNL$; } 50 void setNL$( ofstream & os, bool state ) { os.sawNL$ = state; } 51 bool getANL$( ofstream & os ) { return os.nlOnOff$; } 52 bool getPrt$( ofstream & os ) { return os.prt$; } 53 void setPrt$( ofstream & os, bool state ) { os.prt$ = state; } 43 inline bool sepPrt$( ofstream & os ) { setNL$( os, false ); return os.sepOnOff$; } 44 inline void sepReset$( ofstream & os ) { os.sepOnOff$ = os.sepDefault$; } 45 inline void sepReset$( ofstream & os, bool reset ) { os.sepDefault$ = reset; os.sepOnOff$ = os.sepDefault$; } 46 inline const char * sepGetCur$( ofstream & os ) { return os.sepCur$; } 47 inline void sepSetCur$( ofstream & os, const char sepCur[] ) { os.sepCur$ = sepCur; } 48 inline bool getNL$( ofstream & os ) { return os.sawNL$; } 49 inline void setNL$( ofstream & os, bool state ) { os.sawNL$ = state; } 50 inline bool getANL$( ofstream & os ) { return os.nlOnOff$; } 51 inline bool getPrt$( ofstream & os ) { return os.prt$; } 52 inline void setPrt$( ofstream & os, bool state ) { os.prt$ = state; } 53 54 inline void lock( ofstream & os ) with( os ) { lock( os.lock$ ); } 55 inline void unlock( ofstream & os ) { unlock( os.lock$ ); } 54 56 55 57 // public 56 58 void ?{}( ofstream & os ) { os.file$ = 0p; } 57 58 void ?{}( ofstream & os, const char name[], const char mode[] ) { 59 open( os, name, mode ); 60 } // ?{} 61 62 void ?{}( ofstream & os, const char name[] ) { 63 open( os, name, "w" ); 64 } // ?{} 65 66 void ^?{}( ofstream & os ) { 67 close( os ); 68 } // ^?{} 59 void ?{}( ofstream & os, const char name[], const char mode[] ) { open( os, name, mode ); } 60 void ?{}( ofstream & os, const char name[] ) { open( os, name, "w" ); } 61 void ^?{}( ofstream & os ) { close( os ); } 69 62 70 63 void sepOn( ofstream & os ) { os.sepOnOff$ = ! getNL$( os ); } … … 107 100 if ( &os == &exit ) exit( EXIT_FAILURE ); 108 101 if ( &os == &abort ) abort(); 109 if ( os.acquired$ ) { os.acquired$ = false; release( os ); }110 102 } // ends 111 103 112 bool fail( ofstream & os ) { 113 return os.file$ == 0 || ferror( (FILE *)(os.file$) ); 114 } // fail 115 116 void clear( ofstream & os ) { 117 clearerr( (FILE *)(os.file$) ); 118 } // clear 119 120 int flush( ofstream & os ) { 121 return fflush( (FILE *)(os.file$) ); 122 } // flush 104 bool fail( ofstream & os ) { return os.file$ == 0 || ferror( (FILE *)(os.file$) ); } 105 void clear( ofstream & os ) { clearerr( (FILE *)(os.file$) ); } 106 int flush( ofstream & os ) { return fflush( (FILE *)(os.file$) ); } 123 107 124 108 void open( ofstream & os, const char name[], const char mode[] ) { 125 FILE * file = fopen( name, mode ); 126 #ifdef __CFA_DEBUG__ 109 FILE * file; 110 for ( cnt; 10 ) { 111 errno = 0; 112 file = fopen( name, mode ); 113 if ( file != 0p || errno != EINTR ) break; // timer interrupt ? 114 if ( cnt == 9 ) abort( "ofstream open EINTR spinning exceeded" ); 115 } // for 127 116 if ( file == 0p ) { 128 117 throw (Open_Failure){ os }; 129 118 // abort | IO_MSG "open output file \"" | name | "\"" | nl | strerror( errno ); 130 119 } // if 131 #endif // __CFA_DEBUG__ 132 (os){ file }; 120 (os){ file }; // initialize 133 121 } // open 134 122 135 void open( ofstream & os, const char name[] ) { 136 open( os, name, "w" ); 137 } // open 138 139 void close( ofstream & os ) { 140 if ( (FILE *)(os.file$) == 0p ) return; 141 if ( (FILE *)(os.file$) == (FILE *)stdout || (FILE *)(os.file$) == (FILE *)stderr ) return; 142 143 if ( fclose( (FILE *)(os.file$) ) == EOF ) { 123 void open( ofstream & os, const char name[] ) { open( os, name, "w" ); } 124 125 void close( ofstream & os ) with( os ) { 126 if ( (FILE *)(file$) == 0p ) return; 127 if ( (FILE *)(file$) == (FILE *)stdout || (FILE *)(file$) == (FILE *)stderr ) return; 128 129 int ret; 130 for ( cnt; 10 ) { 131 errno = 0; 132 ret = fclose( (FILE *)(file$) ); 133 if ( ret != EOF || errno != EINTR ) break; // timer interrupt ? 134 if ( cnt == 9 ) abort( "ofstream open EINTR spinning exceeded" ); 135 } // for 136 if ( ret == EOF ) { 144 137 throw (Close_Failure){ os }; 145 138 // abort | IO_MSG "close output" | nl | strerror( errno ); 146 139 } // if 147 os.file$ = 0p;140 file$ = 0p; // safety after close 148 141 } // close 149 142 … … 164 157 va_list args; 165 158 va_start( args, format ); 166 int len = vfprintf( (FILE *)(os.file$), format, args ); 159 160 int len; 161 for ( cnt; 10 ) { 162 errno = 0; 163 len = vfprintf( (FILE *)(os.file$), format, args ); 164 if ( len != EOF || errno != EINTR ) break; // timer interrupt ? 165 if ( cnt == 9 ) abort( "ofstream fmt EINTR spinning exceeded" ); 166 } // for 167 167 if ( len == EOF ) { 168 168 if ( ferror( (FILE *)(os.file$) ) ) { … … 177 177 } // fmt 178 178 179 inline void acquire( ofstream & os ) {180 lock( os.lock$ );181 if ( ! os.acquired$ ) os.acquired$ = true;182 else unlock( os.lock$ );183 } // acquire184 185 inline void release( ofstream & os ) {186 unlock( os.lock$ );187 } // release188 189 void ?{}( osacquire & acq, ofstream & os ) { &acq.os = &os; lock( os.lock$ ); }190 void ^?{}( osacquire & acq ) { release( acq.os ); }191 192 179 static ofstream soutFile = { (FILE *)stdout }; 193 180 ofstream & sout = soutFile, & stdout = soutFile; … … 207 194 flush( os ); 208 195 return os; 209 // (ofstream &)(os | '\n');210 // setPrt$( os, false ); // turn off211 // setNL$( os, true );212 // flush( os );213 // return sepOff( os ); // prepare for next line214 196 } // nl 215 197 … … 219 201 220 202 // private 221 void ?{}( ifstream & is, void * file ) { 222 is.file$ = file; 223 is.nlOnOff$ = false; 224 is.acquired$ = false; 225 } // ?{} 203 void ?{}( ifstream & is, void * file ) with( is ) { 204 file$ = file; 205 nlOnOff$ = false; 206 } // ?{} 207 208 bool getANL$( ifstream & os ) { return os.nlOnOff$; } 209 210 inline void lock( ifstream & os ) with( os ) { lock( os.lock$ ); } 211 inline void unlock( ifstream & os ) { unlock( os.lock$ ); } 226 212 227 213 // public 228 214 void ?{}( ifstream & is ) { is.file$ = 0p; } 229 230 void ?{}( ifstream & is, const char name[], const char mode[] ) { 231 open( is, name, mode ); 232 } // ?{} 233 234 void ?{}( ifstream & is, const char name[] ) { 235 open( is, name, "r" ); 236 } // ?{} 237 238 void ^?{}( ifstream & is ) { 239 close( is ); 240 } // ^?{} 215 void ?{}( ifstream & is, const char name[], const char mode[] ) { open( is, name, mode ); } 216 void ?{}( ifstream & is, const char name[] ) { open( is, name, "r" ); } 217 void ^?{}( ifstream & is ) { close( is ); } 218 219 bool fail( ifstream & is ) { return is.file$ == 0p || ferror( (FILE *)(is.file$) ); } 220 void clear( ifstream & is ) { clearerr( (FILE *)(is.file$) ); } 241 221 242 222 void nlOn( ifstream & os ) { os.nlOnOff$ = true; } 243 223 void nlOff( ifstream & os ) { os.nlOnOff$ = false; } 244 bool getANL( ifstream & os ) { return os.nlOnOff$; } 245 246 bool fail( ifstream & is ) { 247 return is.file$ == 0p || ferror( (FILE *)(is.file$) ); 248 } // fail 249 250 void clear( ifstream & is ) { 251 clearerr( (FILE *)(is.file$) ); 252 } // clear 253 254 void ends( ifstream & is ) { 255 if ( is.acquired$ ) { is.acquired$ = false; release( is ); } 256 } // ends 257 258 bool eof( ifstream & is ) { 259 return feof( (FILE *)(is.file$) ); 260 } // eof 224 225 void ends( ifstream & is ) {} 226 227 bool eof( ifstream & is ) { return feof( (FILE *)(is.file$) ) != 0; } 261 228 262 229 void open( ifstream & is, const char name[], const char mode[] ) { 263 FILE * file = fopen( name, mode ); 264 #ifdef __CFA_DEBUG__ 230 FILE * file; 231 for ( cnt; 10 ) { 232 errno = 0; 233 file = fopen( name, mode ); 234 if ( file != 0p || errno != EINTR ) break; // timer interrupt ? 235 if ( cnt == 9 ) abort( "ifstream open EINTR spinning exceeded" ); 236 } // for 265 237 if ( file == 0p ) { 266 238 throw (Open_Failure){ is }; 267 239 // abort | IO_MSG "open input file \"" | name | "\"" | nl | strerror( errno ); 268 240 } // if 269 #endif // __CFA_DEBUG__ 270 is.file$ = file; 241 (is){ file }; // initialize 271 242 } // open 272 243 273 void open( ifstream & is, const char name[] ) { 274 open( is, name, "r" ); 275 } // open 276 277 void close( ifstream & is ) { 278 if ( (FILE *)(is.file$) == 0p ) return; 279 if ( (FILE *)(is.file$) == (FILE *)stdin ) return; 280 281 if ( fclose( (FILE *)(is.file$) ) == EOF ) { 244 void open( ifstream & is, const char name[] ) { open( is, name, "r" ); } 245 246 void close( ifstream & is ) with( is ) { 247 if ( (FILE *)(file$) == 0p ) return; 248 if ( (FILE *)(file$) == (FILE *)stdin ) return; 249 250 int ret; 251 for ( cnt; 10 ) { 252 errno = 0; 253 ret = fclose( (FILE *)(file$) ); 254 if ( ret != EOF || errno != EINTR ) break; // timer interrupt ? 255 if ( cnt == 9 ) abort( "ifstream close EINTR spinning exceeded" ); 256 } // for 257 if ( ret == EOF ) { 282 258 throw (Close_Failure){ is }; 283 259 // abort | IO_MSG "close input" | nl | strerror( errno ); 284 260 } // if 285 is.file$ = 0p;261 file$ = 0p; // safety after close 286 262 } // close 287 263 … … 312 288 int fmt( ifstream & is, const char format[], ... ) { 313 289 va_list args; 314 315 290 va_start( args, format ); 316 int len = vfscanf( (FILE *)(is.file$), format, args ); 291 292 int len; 293 for () { // no check for EINTR limit waiting for keyboard input 294 errno = 0; 295 len = vfscanf( (FILE *)(is.file$), format, args ); 296 if ( len != EOF || errno != EINTR ) break; // timer interrupt ? 297 } // for 317 298 if ( len == EOF ) { 318 299 if ( ferror( (FILE *)(is.file$) ) ) { … … 324 305 } // fmt 325 306 326 inline void acquire( ifstream & is ) {327 lock( is.lock$ );328 if ( ! is.acquired$ ) is.acquired$ = true;329 else unlock( is.lock$ );330 } // acquire331 332 inline void release( ifstream & is ) {333 unlock( is.lock$ );334 } // release335 336 void ?{}( isacquire & acq, ifstream & is ) { &acq.is = &is; lock( is.lock$ ); }337 void ^?{}( isacquire & acq ) { release( acq.is ); }338 339 307 static ifstream sinFile = { (FILE *)stdin }; 340 308 ifstream & sin = sinFile, & stdin = sinFile; … … 347 315 348 316 // exception I/O constructors 349 void ?{}( Open_Failure & this, ofstream & ostream) {350 this.virtual_table = &Open_Failure_vt;351 this.ostream = &ostream;352 t his.tag = 1;353 } // ?{} 354 355 void ?{}( Open_Failure & this, ifstream & istream) {356 this.virtual_table = &Open_Failure_vt;357 this.istream = &istream;358 t his.tag = 0;317 void ?{}( Open_Failure & ex, ofstream & ostream ) with(ex) { 318 virtual_table = &Open_Failure_vt; 319 ostream = &ostream; 320 tag = 1; 321 } // ?{} 322 323 void ?{}( Open_Failure & ex, ifstream & istream ) with(ex) { 324 virtual_table = &Open_Failure_vt; 325 istream = &istream; 326 tag = 0; 359 327 } // ?{} 360 328 … … 363 331 364 332 // exception I/O constructors 365 void ?{}( Close_Failure & this, ofstream & ostream) {366 this.virtual_table = &Close_Failure_vt;367 this.ostream = &ostream;368 t his.tag = 1;369 } // ?{} 370 371 void ?{}( Close_Failure & this, ifstream & istream) {372 this.virtual_table = &Close_Failure_vt;373 this.istream = &istream;374 t his.tag = 0;333 void ?{}( Close_Failure & ex, ofstream & ostream ) with(ex) { 334 virtual_table = &Close_Failure_vt; 335 ostream = &ostream; 336 tag = 1; 337 } // ?{} 338 339 void ?{}( Close_Failure & ex, ifstream & istream ) with(ex) { 340 virtual_table = &Close_Failure_vt; 341 istream = &istream; 342 tag = 0; 375 343 } // ?{} 376 344 … … 379 347 380 348 // exception I/O constructors 381 void ?{}( Write_Failure & this, ofstream & ostream) {382 this.virtual_table = &Write_Failure_vt;383 this.ostream = &ostream;384 t his.tag = 1;385 } // ?{} 386 387 void ?{}( Write_Failure & this, ifstream & istream) {388 this.virtual_table = &Write_Failure_vt;389 this.istream = &istream;390 t his.tag = 0;349 void ?{}( Write_Failure & ex, ofstream & ostream ) with(ex) { 350 virtual_table = &Write_Failure_vt; 351 ostream = &ostream; 352 tag = 1; 353 } // ?{} 354 355 void ?{}( Write_Failure & ex, ifstream & istream ) with(ex) { 356 virtual_table = &Write_Failure_vt; 357 istream = &istream; 358 tag = 0; 391 359 } // ?{} 392 360 … … 395 363 396 364 // exception I/O constructors 397 void ?{}( Read_Failure & this, ofstream & ostream) {398 this.virtual_table = &Read_Failure_vt;399 this.ostream = &ostream;400 t his.tag = 1;401 } // ?{} 402 403 void ?{}( Read_Failure & this, ifstream & istream) {404 this.virtual_table = &Read_Failure_vt;405 this.istream = &istream;406 t his.tag = 0;365 void ?{}( Read_Failure & ex, ofstream & ostream ) with(ex) { 366 virtual_table = &Read_Failure_vt; 367 ostream = &ostream; 368 tag = 1; 369 } // ?{} 370 371 void ?{}( Read_Failure & ex, ifstream & istream ) with(ex) { 372 virtual_table = &Read_Failure_vt; 373 istream = &istream; 374 tag = 0; 407 375 } // ?{} 408 376
Note:
See TracChangeset
for help on using the changeset viewer.