Changeset 36ebd03 for src/libcfa/fstream.c
- Timestamp:
- Mar 3, 2016, 1:28:56 PM (10 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:
- 3627356
- Parents:
- 9d7b3ea (diff), 4040425 (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
-
src/libcfa/fstream.c
r9d7b3ea r36ebd03 7 7 // fstream.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:03:05201613 // Update Count : 7612 // Last Modified On : Mon Feb 29 18:41:10 2016 13 // Update Count : 162 14 14 // 15 15 … … 17 17 18 18 extern "C" { 19 #include <stdio.h> 20 #include <stdlib.h> 19 #include <stdio.h> // vfprintf, vfscanf 20 #include <stdlib.h> // exit 21 #include <stdarg.h> // varargs 22 #include <string.h> // strlen 23 #include <float.h> // DBL_DIG, LDBL_DIG 24 #include <complex.h> // creal, cimag 21 25 } 22 23 struct ofstream {24 FILE *file;25 };26 26 27 27 #define IO_MSG "I/O error " 28 28 29 _Bool sepPrt( ofstream * os ) { return os->separate == 1; } 30 void sepOn( ofstream * os ) { if ( os->separate != 2 ) os->separate = 1; } 31 void sepOff( ofstream * os ) { if ( os->separate != 2 ) os->separate = 0; } 32 void sepSet( ofstream * os, const char * s ) { 33 strncpy( &(os->separator[0]), s, separateSize - 1 ); 34 os->separator[separateSize - 1] = '\0'; 35 } // sepSet 36 const char * sepGet( ofstream * os ) { return &(os->separator[0]); } 37 void sepDisable( ofstream *os ) { os->separate = 2; } 38 void sepEnable( ofstream *os ) { os->separate = 0; } 39 29 40 int fail( ofstream * os ) { 30 return ferror( os->file);41 return ferror( (FILE *)(os->file) ); 31 42 } // fail 32 43 33 44 int flush( ofstream * os ) { 34 return fflush( os->file);45 return fflush( (FILE *)(os->file) ); 35 46 } // flush 36 47 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 successful48 void open( ofstream * os, const char * name, const char * mode ) { 49 FILE *file = fopen( name, mode ); 50 if ( file == 0 ) { // do not change unless successful 40 51 perror( IO_MSG "open output" ); 41 52 exit( EXIT_FAILURE ); 42 53 } // if 43 (*os)->file = t; 54 os->file = file; 55 sepOff( os ); 56 sepSet( os, " " ); 44 57 } // open 45 58 46 59 void close( ofstream * os ) { 47 if ( os->file == stdout || os->file== stderr ) return;60 if ( (FILE *)(os->file) == stdout || (FILE *)(os->file) == stderr ) return; 48 61 49 if ( fclose( os->file) == EOF ) {62 if ( fclose( (FILE *)(os->file) ) == EOF ) { 50 63 perror( IO_MSG "close output" ); 51 64 } // if 52 65 } // close 53 66 54 ofstream * write( ofstream * os, const char * data, streamsize_typesize ) {67 ofstream * write( ofstream * os, const char * data, unsigned long int size ) { 55 68 if ( fail( os ) ) { 56 69 fprintf( stderr, "attempt write I/O on failed stream\n" ); … … 58 71 } // if 59 72 60 if ( fwrite( data, 1, size, os->file) != size ) {73 if ( fwrite( data, 1, size, (FILE *)(os->file) ) != size ) { 61 74 perror( IO_MSG "write" ); 62 75 exit( EXIT_FAILURE ); … … 65 78 } // write 66 79 67 static ofstream soutFile = { (FILE *)(&_IO_2_1_stdout_) }; 80 int prtfmt( ofstream * os, const char fmt[], ... ) { 81 va_list args; 82 83 va_start( args, fmt ); 84 int len = vfprintf( (FILE *)(os->file), fmt, args ); 85 if ( len == EOF ) { 86 if ( ferror( (FILE *)(os->file) ) ) { 87 fprintf( stderr, "invalid write\n" ); 88 exit( EXIT_FAILURE ); 89 } // if 90 } // if 91 va_end( args ); 92 return len; 93 } // prtfmt 94 95 96 static ofstream soutFile = { (FILE *)(&_IO_2_1_stdout_), 0, { ' ', '\0' } }; 68 97 ofstream *sout = &soutFile; 69 static ofstream serrFile = { (FILE *)(&_IO_2_1_stderr_) };98 static ofstream serrFile = { (FILE *)(&_IO_2_1_stderr_), 0, { ' ', '\0' } }; 70 99 ofstream *serr = &serrFile; 100 71 101 72 102 //--------------------------------------- 73 103 74 struct ifstream {75 FILE *file;76 };77 104 78 105 int fail( ifstream * is ) { 79 return ferror( is->file);106 return ferror( (FILE *)(is->file) ); 80 107 } // fail 81 108 82 109 int eof( ifstream * is ) { 83 return feof( is->file);110 return feof( (FILE *)(is->file) ); 84 111 } // eof 85 112 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 113 void open( ifstream * is, const char * name, const char * mode ) { 114 FILE *t = fopen( name, mode ); 115 if ( t == 0 ) { // do not change unless successful 116 perror( IO_MSG "open input" ); 117 exit( EXIT_FAILURE ); 92 118 } // if 93 return is;94 } // read119 is->file = t; 120 } // open 95 121 96 ifstream * read( ifstream * is, char * data, streamsize_type size ) { 122 void close( ifstream * is ) { 123 if ( (FILE *)(is->file) == stdin ) return; 124 125 if ( fclose( (FILE *)(is->file) ) == EOF ) { 126 perror( IO_MSG "close input" ); 127 } // if 128 } // close 129 130 ifstream * read( ifstream * is, char * data, unsigned long int size ) { 97 131 if ( fail( is ) ) { 98 132 fprintf( stderr, "attempt read I/O on failed stream\n" ); … … 100 134 } // if 101 135 102 if ( fread( data, size, 1, is->file) == 0 ) {136 if ( fread( data, size, 1, (FILE *)(is->file) ) == 0 ) { 103 137 perror( IO_MSG "read" ); 104 138 exit( EXIT_FAILURE ); … … 113 147 } // if 114 148 115 if ( ungetc( c, is->file) == EOF ) {149 if ( ungetc( c, (FILE *)(is->file) ) == EOF ) { 116 150 perror( IO_MSG "ungetc" ); 117 151 exit( EXIT_FAILURE ); … … 120 154 } // ungetc 121 155 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 ); 156 int scanfmt( ifstream * is, const char fmt[], ... ) { 157 va_list args; 158 159 va_start( args, fmt ); 160 int len = vfscanf( (FILE *)(is->file), fmt, args ); 161 if ( len == EOF ) { 162 if ( ferror( (FILE *)(is->file) ) ) { 163 fprintf( stderr, "invalid read\n" ); 164 exit( EXIT_FAILURE ); 165 } // if 127 166 } // if 128 (*is)->file = t; 129 } // open 167 va_end( args ); 168 return len; 169 } // prtfmt 130 170 131 void close( ifstream * is ) {132 if ( is->file == stdin ) return;133 134 if ( fclose( is->file ) == EOF ) {135 perror( IO_MSG "close input" );136 } // if137 } // close138 171 139 172 static ifstream sinFile = { (FILE *)(&_IO_2_1_stdin_) };
Note:
See TracChangeset
for help on using the changeset viewer.