Changeset eef8dfb for libcfa/src/fstream.cfa
- Timestamp:
- Jan 7, 2021, 2:55:57 PM (5 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 58fe85a
- Parents:
- bdfc032 (diff), 44e37ef (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the(diff)
links above to see all the changes relative to each parent. - File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/fstream.cfa
rbdfc032 reef8dfb 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Nov 29 06:56:46 201913 // Update Count : 3 5512 // Last Modified On : Fri Jun 19 16:24:54 2020 13 // Update Count : 384 14 14 // 15 15 … … 26 26 27 27 28 // *********************************** ofstream ***********************************28 // *********************************** ofstream *********************************** 29 29 30 30 … … 32 32 33 33 void ?{}( ofstream & os, void * file ) { 34 os.file = file; 35 os.sepDefault = true; 36 os.sepOnOff = false; 37 os.nlOnOff = true; 38 os.prt = false; 39 os.sawNL = false; 34 os.$file = file; 35 os.$sepDefault = true; 36 os.$sepOnOff = false; 37 os.$nlOnOff = true; 38 os.$prt = false; 39 os.$sawNL = false; 40 $sepSetCur( os, sepGet( os ) ); 40 41 sepSet( os, " " ); 41 sepSetCur( os, sepGet( os ) );42 42 sepSetTuple( os, ", " ); 43 43 } // ?{} 44 44 45 45 // private 46 bool sepPrt( ofstream & os ) { setNL( os, false ); return os.sepOnOff; }47 void sepReset( ofstream & os ) { os.sepOnOff = os.sepDefault; }48 void sepReset( ofstream & os, bool reset ) { os.sepDefault = reset; os.sepOnOff = os.sepDefault; }49 const char * sepGetCur( ofstream & os ) { return os.sepCur; }50 void sepSetCur( ofstream & os, const char * sepCur ) { os.sepCur = sepCur; }51 bool getNL( ofstream & os ) { return os.sawNL; }52 void setNL( ofstream & os, bool state ) { os.sawNL = state; }53 bool getANL( ofstream & os ) { return os.nlOnOff; }54 bool getPrt( ofstream & os ) { return os.prt; }55 void setPrt( ofstream & os, bool state ) { os.prt = state; }46 bool $sepPrt( ofstream & os ) { $setNL( os, false ); return os.$sepOnOff; } 47 void $sepReset( ofstream & os ) { os.$sepOnOff = os.$sepDefault; } 48 void $sepReset( ofstream & os, bool reset ) { os.$sepDefault = reset; os.$sepOnOff = os.$sepDefault; } 49 const char * $sepGetCur( ofstream & os ) { return os.$sepCur; } 50 void $sepSetCur( ofstream & os, const char sepCur[] ) { os.$sepCur = sepCur; } 51 bool $getNL( ofstream & os ) { return os.$sawNL; } 52 void $setNL( ofstream & os, bool state ) { os.$sawNL = state; } 53 bool $getANL( ofstream & os ) { return os.$nlOnOff; } 54 bool $getPrt( ofstream & os ) { return os.$prt; } 55 void $setPrt( ofstream & os, bool state ) { os.$prt = state; } 56 56 57 57 // public 58 void ?{}( ofstream & os ) { os. file = 0; }59 60 void ?{}( ofstream & os, const char * name, const char * mode) {58 void ?{}( ofstream & os ) { os.$file = 0p; } 59 60 void ?{}( ofstream & os, const char name[], const char mode[] ) { 61 61 open( os, name, mode ); 62 62 } // ?{} 63 63 64 void ?{}( ofstream & os, const char * name) {64 void ?{}( ofstream & os, const char name[] ) { 65 65 open( os, name, "w" ); 66 66 } // ?{} … … 70 70 } // ^?{} 71 71 72 void sepOn( ofstream & os ) { os. sepOnOff = !getNL( os ); }73 void sepOff( ofstream & os ) { os. sepOnOff = false; }72 void sepOn( ofstream & os ) { os.$sepOnOff = ! $getNL( os ); } 73 void sepOff( ofstream & os ) { os.$sepOnOff = false; } 74 74 75 75 bool sepDisable( ofstream & os ) { 76 bool temp = os. sepDefault;77 os. sepDefault = false;78 sepReset( os );76 bool temp = os.$sepDefault; 77 os.$sepDefault = false; 78 $sepReset( os ); 79 79 return temp; 80 80 } // sepDisable 81 81 82 82 bool sepEnable( ofstream & os ) { 83 bool temp = os. sepDefault;84 os. sepDefault = true;85 if ( os. sepOnOff ) sepReset( os );// start of line ?83 bool temp = os.$sepDefault; 84 os.$sepDefault = true; 85 if ( os.$sepOnOff ) $sepReset( os ); // start of line ? 86 86 return temp; 87 87 } // sepEnable 88 88 89 void nlOn( ofstream & os ) { os. nlOnOff = true; }90 void nlOff( ofstream & os ) { os. nlOnOff = false; }91 92 const char * sepGet( ofstream & os ) { return os. separator; }93 void sepSet( ofstream & os, const char * s) {89 void nlOn( ofstream & os ) { os.$nlOnOff = true; } 90 void nlOff( ofstream & os ) { os.$nlOnOff = false; } 91 92 const char * sepGet( ofstream & os ) { return os.$separator; } 93 void sepSet( ofstream & os, const char s[] ) { 94 94 assert( s ); 95 strncpy( os. separator, s, sepSize - 1 );96 os. separator[sepSize - 1] = '\0';95 strncpy( os.$separator, s, sepSize - 1 ); 96 os.$separator[sepSize - 1] = '\0'; 97 97 } // sepSet 98 98 99 const char * sepGetTuple( ofstream & os ) { return os. tupleSeparator; }100 void sepSetTuple( ofstream & os, const char * s) {99 const char * sepGetTuple( ofstream & os ) { return os.$tupleSeparator; } 100 void sepSetTuple( ofstream & os, const char s[] ) { 101 101 assert( s ); 102 strncpy( os. tupleSeparator, s, sepSize - 1 );103 os. tupleSeparator[sepSize - 1] = '\0';102 strncpy( os.$tupleSeparator, s, sepSize - 1 ); 103 os.$tupleSeparator[sepSize - 1] = '\0'; 104 104 } // sepSet 105 105 106 106 void ends( ofstream & os ) { 107 if ( getANL( os ) ) nl( os );108 else setPrt( os, false ); // turn off107 if ( $getANL( os ) ) nl( os ); 108 else $setPrt( os, false ); // turn off 109 109 if ( &os == &exit ) exit( EXIT_FAILURE ); 110 110 if ( &os == &abort ) abort(); … … 112 112 113 113 int fail( ofstream & os ) { 114 return os. file == 0 || ferror( (FILE *)(os.file) );114 return os.$file == 0 || ferror( (FILE *)(os.$file) ); 115 115 } // fail 116 116 117 117 int flush( ofstream & os ) { 118 return fflush( (FILE *)(os. file) );118 return fflush( (FILE *)(os.$file) ); 119 119 } // flush 120 120 121 void open( ofstream & os, const char * name, const char * mode) {121 void open( ofstream & os, const char name[], const char mode[] ) { 122 122 FILE * file = fopen( name, mode ); 123 123 #ifdef __CFA_DEBUG__ 124 if ( file == 0 ) { 125 abort | IO_MSG "open output file \"" | name | "\"" | nl | strerror( errno ); 124 if ( file == 0p ) { 125 throw (Open_Failure){ os }; 126 // abort | IO_MSG "open output file \"" | name | "\"" | nl | strerror( errno ); 126 127 } // if 127 128 #endif // __CFA_DEBUG__ … … 129 130 } // open 130 131 131 void open( ofstream & os, const char * name) {132 void open( ofstream & os, const char name[] ) { 132 133 open( os, name, "w" ); 133 134 } // open 134 135 135 136 void close( ofstream & os ) { 136 if ( (FILE *)(os.file) == stdout || (FILE *)(os.file) == stderr ) return; 137 138 if ( fclose( (FILE *)(os.file) ) == EOF ) { 137 if ( (FILE *)(os.$file) == 0p ) return; 138 if ( (FILE *)(os.$file) == (FILE *)stdout || (FILE *)(os.$file) == (FILE *)stderr ) return; 139 140 if ( fclose( (FILE *)(os.$file) ) == EOF ) { 139 141 abort | IO_MSG "close output" | nl | strerror( errno ); 140 142 } // if 143 os.$file = 0p; 141 144 } // close 142 145 143 ofstream & write( ofstream & os, const char * data, size_t size ) {146 ofstream & write( ofstream & os, const char data[], size_t size ) { 144 147 if ( fail( os ) ) { 145 148 abort | IO_MSG "attempt write I/O on failed stream"; 146 149 } // if 147 150 148 if ( fwrite( data, 1, size, (FILE *)(os. file) ) != size ) {151 if ( fwrite( data, 1, size, (FILE *)(os.$file) ) != size ) { 149 152 abort | IO_MSG "write" | nl | strerror( errno ); 150 153 } // if … … 155 158 va_list args; 156 159 va_start( args, format ); 157 int len = vfprintf( (FILE *)(os. file), format, args );160 int len = vfprintf( (FILE *)(os.$file), format, args ); 158 161 if ( len == EOF ) { 159 if ( ferror( (FILE *)(os. file) ) ) {162 if ( ferror( (FILE *)(os.$file) ) ) { 160 163 abort | IO_MSG "invalid write"; 161 164 } // if … … 163 166 va_end( args ); 164 167 165 setPrt( os, true );// called in output cascade166 sepReset( os );// reset separator168 $setPrt( os, true ); // called in output cascade 169 $sepReset( os ); // reset separator 167 170 return len; 168 171 } // fmt … … 179 182 180 183 181 // *********************************** ifstream ***********************************184 // *********************************** ifstream *********************************** 182 185 183 186 184 187 // private 185 188 void ?{}( ifstream & is, void * file ) { 186 is. file = file;187 is. nlOnOff = false;189 is.$file = file; 190 is.$nlOnOff = false; 188 191 } // ?{} 189 192 190 193 // public 191 void ?{}( ifstream & is ) { is.file = 0; }192 193 void ?{}( ifstream & is, const char * name, const char * mode) {194 void ?{}( ifstream & is ) { is.$file = 0p; } 195 196 void ?{}( ifstream & is, const char name[], const char mode[] ) { 194 197 open( is, name, mode ); 195 198 } // ?{} 196 199 197 void ?{}( ifstream & is, const char * name) {200 void ?{}( ifstream & is, const char name[] ) { 198 201 open( is, name, "r" ); 199 202 } // ?{} … … 203 206 } // ^?{} 204 207 205 void nlOn( ifstream & os ) { os. nlOnOff = true; }206 void nlOff( ifstream & os ) { os. nlOnOff = false; }207 bool getANL( ifstream & os ) { return os. nlOnOff; }208 void nlOn( ifstream & os ) { os.$nlOnOff = true; } 209 void nlOff( ifstream & os ) { os.$nlOnOff = false; } 210 bool getANL( ifstream & os ) { return os.$nlOnOff; } 208 211 209 212 int fail( ifstream & is ) { 210 return is. file == 0 || ferror( (FILE *)(is.file) );213 return is.$file == 0p || ferror( (FILE *)(is.$file) ); 211 214 } // fail 212 215 213 216 int eof( ifstream & is ) { 214 return feof( (FILE *)(is. file) );217 return feof( (FILE *)(is.$file) ); 215 218 } // eof 216 219 217 void open( ifstream & is, const char * name, const char * mode) {220 void open( ifstream & is, const char name[], const char mode[] ) { 218 221 FILE * file = fopen( name, mode ); 219 222 #ifdef __CFA_DEBUG__ 220 if ( file == 0 ) { 221 abort | IO_MSG "open input file \"" | name | "\"" | nl | strerror( errno ); 223 if ( file == 0p ) { 224 throw (Open_Failure){ is }; 225 // abort | IO_MSG "open input file \"" | name | "\"" | nl | strerror( errno ); 222 226 } // if 223 227 #endif // __CFA_DEBUG__ 224 is. file = file;228 is.$file = file; 225 229 } // open 226 230 227 void open( ifstream & is, const char * name) {231 void open( ifstream & is, const char name[] ) { 228 232 open( is, name, "r" ); 229 233 } // open 230 234 231 235 void close( ifstream & is ) { 232 if ( (FILE *)(is.file) == stdin ) return; 233 234 if ( fclose( (FILE *)(is.file) ) == EOF ) { 236 if ( (FILE *)(is.$file) == 0p ) return; 237 if ( (FILE *)(is.$file) == (FILE *)stdin ) return; 238 239 if ( fclose( (FILE *)(is.$file) ) == EOF ) { 235 240 abort | IO_MSG "close input" | nl | strerror( errno ); 236 241 } // if 242 is.$file = 0p; 237 243 } // close 238 244 … … 242 248 } // if 243 249 244 if ( fread( data, size, 1, (FILE *)(is. file) ) == 0 ) {250 if ( fread( data, size, 1, (FILE *)(is.$file) ) == 0 ) { 245 251 abort | IO_MSG "read" | nl | strerror( errno ); 246 252 } // if … … 253 259 } // if 254 260 255 if ( ungetc( c, (FILE *)(is. file) ) == EOF ) {261 if ( ungetc( c, (FILE *)(is.$file) ) == EOF ) { 256 262 abort | IO_MSG "ungetc" | nl | strerror( errno ); 257 263 } // if … … 263 269 264 270 va_start( args, format ); 265 int len = vfscanf( (FILE *)(is. file), format, args );271 int len = vfscanf( (FILE *)(is.$file), format, args ); 266 272 if ( len == EOF ) { 267 if ( ferror( (FILE *)(is. file) ) ) {273 if ( ferror( (FILE *)(is.$file) ) ) { 268 274 abort | IO_MSG "invalid read"; 269 275 } // if … … 276 282 ifstream & sin = sinFile, & stdin = sinFile; 277 283 284 285 // *********************************** exceptions *********************************** 286 287 288 void ?{}( Open_Failure & this, ofstream & ostream ) { 289 VTABLE_INIT(this, Open_Failure); 290 this.ostream = &ostream; 291 this.tag = 1; 292 } 293 void ?{}( Open_Failure & this, ifstream & istream ) { 294 VTABLE_INIT(this, Open_Failure); 295 this.istream = &istream; 296 this.tag = 0; 297 } 298 const char * Open_Failure_msg(Open_Failure * this) { 299 return "Open_Failure"; 300 } 301 VTABLE_INSTANCE(Open_Failure)(Open_Failure_msg); 302 void throwOpen_Failure( ofstream & ostream ) { 303 Open_Failure exc = { ostream }; 304 } 305 void throwOpen_Failure( ifstream & istream ) { 306 Open_Failure exc = { istream }; 307 } 308 278 309 // Local Variables: // 279 310 // tab-width: 4 //
Note:
See TracChangeset
for help on using the changeset viewer.