Changeset 6ba0659 for src/libcfa
- Timestamp:
- Feb 17, 2016, 2:22:22 PM (9 years ago)
- Branches:
- ADT, aaron-thesis, arm-eh, ast-experimental, cleanup-dtors, ctor, deferred_resn, demangler, enum, forall-pointer-decay, gc_noraii, jacob/cs343-translation, jenkins-sandbox, master, memory, new-ast, new-ast-unique-expr, new-env, no_list, persistent-indexer, pthread-emulation, qualifiedEnum, resolv-new, string, with_gc
- Children:
- 658f6de0
- Parents:
- 52f85e0
- Location:
- src/libcfa
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/fstream
r52f85e0 r6ba0659 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Wed Jan 27 23:47:41 201613 // Update Count : 312 // Last Modified On : Wed Feb 17 14:02:01 2016 13 // Update Count : 22 14 14 // 15 15 … … 19 19 #include "iostream" 20 20 21 typedef struct ofstream ofstream; 21 // implement context ostream 22 struct ofstream; 22 23 23 // implement context ostream 24 ofstream *write( ofstream *, const char *, streamsize_type ); 25 int fail( ofstream * ); 24 int fail( ofstream * os ); 25 int flush( ofstream * os ); 26 void open( ofstream ** os, const char * name, const char * mode ); 27 void close( ofstream * os ); 28 ofstream * write( ofstream * os, const char * data, streamsize_type size ); 26 29 27 ofstream *ofstream_stdout(); 28 ofstream *ofstream_stderr(); 29 ofstream *ofstream_fromfile( const char *name ); 30 void ofstream_close( ofstream *os ); 31 32 typedef struct ifstream ifstream; 30 extern ofstream * sout, * serr; 33 31 34 32 // implement context istream 35 ifstream *read( ifstream *, char *, streamsize_type ); 36 ifstream *unread( ifstream *, char ); 37 int fail( ifstream * ); 38 int eof( ifstream * ); 33 struct ifstream; 39 34 40 ifstream *ifstream_stdin(); 41 ifstream *ifstream_fromfile( const char *name ); 35 int fail( ifstream * is ); 36 int eof( ifstream * is ); 37 void open( ifstream ** is, const char * name, const char * mode ); 38 void close( ifstream * is ); 39 ifstream * get( ifstream * is, int * data ); 40 ifstream * read( ifstream * is, char * data, streamsize_type size ); 41 ifstream * ungetc( ifstream * is, char c ); 42 43 extern ifstream *sin; 42 44 43 45 #endif // __FSTREAM_H__ -
src/libcfa/fstream.c
r52f85e0 r6ba0659 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Tue Jan 26 17:12:59201613 // Update Count : 612 // Last Modified On : Wed Feb 17 14:03:05 2016 13 // Update Count : 76 14 14 // 15 15 … … 23 23 struct ofstream { 24 24 FILE *file; 25 int fail;26 25 }; 27 26 28 ofstream *write( ofstream *os, const char *data, streamsize_type size ) { 29 if ( ! os->fail ) { 30 fwrite( data, size, 1, os->file ); 31 os->fail = ferror( os->file ); 27 #define IO_MSG "I/O error " 28 29 int fail( ofstream * os ) { 30 return ferror( os->file ); 31 } // fail 32 33 int flush( ofstream * os ) { 34 return fflush( os->file ); 35 } // flush 36 37 void open( ofstream ** os, const char * name, const char * mode ) { 38 FILE *t = fopen( name, mode ); 39 if ( t == 0 ) { // do not change unless successful 40 perror( IO_MSG "open output" ); 41 exit( EXIT_FAILURE ); 42 } // if 43 (*os)->file = t; 44 } // open 45 46 void close( ofstream * os ) { 47 if ( os->file == stdout || os->file == stderr ) return; 48 49 if ( fclose( os->file ) == EOF ) { 50 perror( IO_MSG "close output" ); 51 } // if 52 } // close 53 54 ofstream * write( ofstream * os, const char * data, streamsize_type size ) { 55 if ( fail( os ) ) { 56 fprintf( stderr, "attempt write I/O on failed stream\n" ); 57 exit( EXIT_FAILURE ); 58 } // if 59 60 if ( fwrite( data, 1, size, os->file ) != size ) { 61 perror( IO_MSG "write" ); 62 exit( EXIT_FAILURE ); 32 63 } // if 33 64 return os; 34 65 } // write 35 66 36 int fail( ofstream *os ) { 37 return os->fail; 38 } // fail 67 static ofstream soutFile = { (FILE *)(&_IO_2_1_stdout_) }; 68 ofstream *sout = &soutFile; 69 static ofstream serrFile = { (FILE *)(&_IO_2_1_stderr_) }; 70 ofstream *serr = &serrFile; 39 71 40 static ofstream *make_ofstream() { 41 ofstream *new_stream = malloc( sizeof( ofstream ) ); 42 new_stream->fail = 0; 43 return new_stream; 44 } // make_ofstream 45 46 ofstream *ofstream_stdout() { 47 ofstream *stdout_stream = make_ofstream(); 48 stdout_stream->file = stdout; 49 return stdout_stream; 50 } // ofstream_stdout 51 52 ofstream *ofstream_stderr() { 53 ofstream *stderr_stream = make_ofstream(); 54 stderr_stream->file = stderr; 55 return stderr_stream; 56 } // ofstream_stderr 57 58 ofstream *ofstream_fromfile( const char *name ) { 59 ofstream *file_stream = make_ofstream(); 60 file_stream->file = fopen( name, "w" ); 61 file_stream->fail = file_stream->file == 0; 62 return file_stream; 63 } 64 65 void ofstream_close( ofstream *os ) { 66 if ( os->file != stdout && os->file != stderr ) { 67 os->fail = fclose( os->file ); 68 } 69 free( os ); 70 } 72 //--------------------------------------- 71 73 72 74 struct ifstream { 73 75 FILE *file; 74 int fail;75 int eof;76 76 }; 77 77 78 ifstream *read( ifstream *is, char *data, streamsize_type size ) { 79 if ( ! is->fail && ! is->eof ) { 80 fread( data, size, 1, is->file ); 81 is->fail = ferror( is->file ); 82 is->eof = feof( is->file ); 83 } 78 int fail( ifstream * is ) { 79 return ferror( is->file ); 80 } // fail 81 82 int eof( ifstream * is ) { 83 return feof( is->file ); 84 } // eof 85 86 ifstream * get( ifstream * is, int * data ) { 87 if ( fscanf( is->file, "%d", data ) == EOF ) { 88 if ( ferror( is->file ) ) { 89 fprintf( stderr, "invalid int read\n" ); 90 exit( EXIT_FAILURE ); 91 } // if 92 } // if 84 93 return is; 85 } 94 } // read 95 96 ifstream * read( ifstream * is, char * data, streamsize_type size ) { 97 if ( fail( is ) ) { 98 fprintf( stderr, "attempt read I/O on failed stream\n" ); 99 exit( EXIT_FAILURE ); 100 } // if 101 102 if ( fread( data, size, 1, is->file ) == 0 ) { 103 perror( IO_MSG "read" ); 104 exit( EXIT_FAILURE ); 105 } // if 106 return is; 107 } // read 86 108 87 ifstream *unread( ifstream *is, char c ) { 88 if ( ! is->fail ) { 89 if ( ! EOF == ungetc( c, is->file ) ) { 90 is->fail = 1; 91 } 92 } 109 ifstream *ungetc( ifstream * is, char c ) { 110 if ( fail( is ) ) { 111 fprintf( stderr, "attempt ungetc I/O on failed stream\n" ); 112 exit( EXIT_FAILURE ); 113 } // if 114 115 if ( ungetc( c, is->file ) == EOF ) { 116 perror( IO_MSG "ungetc" ); 117 exit( EXIT_FAILURE ); 118 } // if 93 119 return is; 94 } 120 } // ungetc 95 121 96 int fail( ifstream *is ) { 97 return is->fail; 98 } 122 void open( ifstream ** is, const char * name, const char * mode ) { 123 FILE *t = fopen( name, mode ); 124 if ( t == 0 ) { // do not change unless successful 125 perror( IO_MSG "open input" ); 126 exit( EXIT_FAILURE ); 127 } // if 128 (*is)->file = t; 129 } // open 99 130 100 int eof( ifstream *is ) { 101 return is->eof; 102 } 131 void close( ifstream * is ) { 132 if ( is->file == stdin ) return; 103 133 104 static ifstream *make_ifstream() { 105 ifstream *new_stream = malloc( sizeof( ifstream ) ); 106 new_stream->fail = 0; 107 new_stream->eof = 0; 108 return new_stream; 109 } 134 if ( fclose( is->file ) == EOF ) { 135 perror( IO_MSG "close input" ); 136 } // if 137 } // close 110 138 111 ifstream *ifstream_stdin() { 112 ifstream *stdin_stream = make_ifstream(); 113 stdin_stream->file = stdin; 114 return stdin_stream; 115 } 116 117 ifstream *ifstream_fromfile( const char *name ) { 118 ifstream *file_stream = make_ifstream(); 119 file_stream->file = fopen( name, "r" ); 120 file_stream->fail = file_stream->file == 0; 121 return file_stream; 122 } 139 static ifstream sinFile = { (FILE *)(&_IO_2_1_stdin_) }; 140 ifstream *sin = &sinFile; 123 141 124 142 // Local Variables: // -
src/libcfa/iostream
r52f85e0 r6ba0659 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Fri Jan 29 15:50:36201613 // Update Count : 2912 // Last Modified On : Wed Feb 17 14:04:24 2016 13 // Update Count : 32 14 14 // 15 15 … … 22 22 23 23 context ostream( dtype ostype ) { 24 ostype *write( ostype *, const char *, streamsize_type );25 24 int fail( ostype * ); 25 int flush( ostype * ); 26 ostype * write( ostype *, const char *, streamsize_type ); 26 27 }; 27 28 28 context writeable( type T ) { 29 29 forall( dtype ostype | ostream( ostype ) ) ostype * ?|?( ostype *, T ); … … 52 52 53 53 // writes the range [begin, end) to the given stream 54 forall( type elt_type | writeable( elt_type ), 55 type iterator_type | iterator( iterator_type, elt_type ), 56 dtype os_type | ostream( os_type ) ) 54 forall( type elt_type | writeable( elt_type ), type iterator_type | iterator( iterator_type, elt_type ), dtype os_type | ostream( os_type ) ) 57 55 void write( iterator_type begin, iterator_type end, os_type *os ); 58 56 59 forall( type elt_type | writeable( elt_type ), 60 type iterator_type | iterator( iterator_type, elt_type ), 61 dtype os_type | ostream( os_type ) ) 57 forall( type elt_type | writeable( elt_type ), type iterator_type | iterator( iterator_type, elt_type ), dtype os_type | ostream( os_type ) ) 62 58 void write_reverse( iterator_type begin, iterator_type end, os_type *os ); 63 59 64 // ******************************************************************************60 //--------------------------------------- 65 61 66 62 context istream( dtype istype ) { 67 istype *read( istype *, char *, streamsize_type );68 istype *unread( istype *, char );69 63 int fail( istype * ); 70 64 int eof( istype * ); 65 istype * get( istype *, int * ); 66 istype * read( istype *, char *, streamsize_type ); 67 istype * ungetc( istype *, char ); 71 68 }; 72 69 -
src/libcfa/iostream.c
r52f85e0 r6ba0659 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 1 0 15:48:46 201613 // Update Count : 6612 // Last Modified On : Wed Feb 17 14:19:56 2016 13 // Update Count : 76 14 14 // 15 15 … … 111 111 forall( dtype ostype, dtype retostype | ostream( ostype ) | ostream( retostype ) ) 112 112 retostype * ?|?( ostype *os, retostype * (*manip)(ostype*) ) { 113 return manip( os);113 return manip( os ); 114 114 } 115 115 116 116 forall( dtype ostype | ostream( ostype ) ) 117 117 ostype * endl( ostype * os ) { 118 119 // flush 120 118 os | "\n"; 119 flush( os ); 120 return os; 121 121 } // endl 122 122 123 forall( type elt_type | writeable( elt_type ), 124 type iterator_type | iterator( iterator_type, elt_type ), 123 //--------------------------------------- 124 125 forall( type elt_type | writeable( elt_type ), type iterator_type | iterator( iterator_type, elt_type ), 125 126 dtype os_type | ostream( os_type ) ) 126 127 void write( iterator_type begin, iterator_type end, os_type *os ) { 127 void print( elt_type i ) { 128 os | i | ' '; 129 } 128 void print( elt_type i ) { os | i | ' '; } 130 129 for_each( begin, end, print ); 131 130 } // ?|? 132 131 133 forall( type elt_type | writeable( elt_type ), 134 type iterator_type | iterator( iterator_type, elt_type ), 132 forall( type elt_type | writeable( elt_type ), type iterator_type | iterator( iterator_type, elt_type ), 135 133 dtype os_type | ostream( os_type ) ) 136 134 void write_reverse( iterator_type begin, iterator_type end, os_type *os ) { … … 139 137 } // ?|? 140 138 139 //--------------------------------------- 141 140 142 141 forall( dtype istype | istream( istype ) ) … … 147 146 forall( dtype istype | istream( istype ) ) 148 147 istype * ?|?( istype *is, int *ip ) { 149 char cur; 150 151 // skip some whitespace 152 do { 153 is | &cur; 154 if ( fail( is ) || eof( is ) ) return is; 155 } while ( !( cur >= '0' && cur <= '9' ) ); 156 157 // accumulate digits 158 *ip = 0; 159 while ( cur >= '0' && cur <= '9' ) { 160 *ip = *ip * 10 + ( cur - '0' ); 161 is | &cur; 162 if ( fail( is ) || eof( is ) ) return is; 163 } 164 165 unread( is, cur ); 166 return is; 148 return get( is, ip ); 167 149 } // ?|? 168 150
Note: See TracChangeset
for help on using the changeset viewer.