Changes in src/libcfa/fstream.c [90c3b1c:6ba0659]
- File:
-
- 1 edited
-
src/libcfa/fstream.c (modified) (7 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/libcfa/fstream.c
r90c3b1c r6ba0659 7 7 // fstream.c -- 8 8 // 9 // Author : Peter A. Buhr9 // Author : Richard C. Bilson 10 10 // Created On : Wed May 27 17:56:53 2015 11 11 // Last Modified By : Peter A. Buhr 12 // Last Modified On : Mon Feb 29 18:41:10201613 // Update Count : 16212 // Last Modified On : Wed Feb 17 14:03:05 2016 13 // Update Count : 76 14 14 // 15 15 … … 17 17 18 18 extern "C" { 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 19 #include <stdio.h> 20 #include <stdlib.h> 25 21 } 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 } // sepSet36 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 40 29 int fail( ofstream * os ) { 41 return ferror( (FILE *)(os->file));30 return ferror( os->file ); 42 31 } // fail 43 32 44 33 int flush( ofstream * os ) { 45 return fflush( (FILE *)(os->file));34 return fflush( os->file ); 46 35 } // flush 47 36 48 void open( ofstream * os, const char * name, const char * mode ) {49 FILE * file= fopen( name, mode );50 if ( file == 0 ) {// do not change unless successful37 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 51 40 perror( IO_MSG "open output" ); 52 41 exit( EXIT_FAILURE ); 53 42 } // if 54 os->file = file; 55 sepOff( os ); 56 sepSet( os, " " ); 43 (*os)->file = t; 57 44 } // open 58 45 59 46 void close( ofstream * os ) { 60 if ( (FILE *)(os->file) == stdout || (FILE *)(os->file)== stderr ) return;47 if ( os->file == stdout || os->file == stderr ) return; 61 48 62 if ( fclose( (FILE *)(os->file)) == EOF ) {49 if ( fclose( os->file ) == EOF ) { 63 50 perror( IO_MSG "close output" ); 64 51 } // if 65 52 } // close 66 53 67 ofstream * write( ofstream * os, const char * data, unsigned long intsize ) {54 ofstream * write( ofstream * os, const char * data, streamsize_type size ) { 68 55 if ( fail( os ) ) { 69 56 fprintf( stderr, "attempt write I/O on failed stream\n" ); … … 71 58 } // if 72 59 73 if ( fwrite( data, 1, size, (FILE *)(os->file)) != size ) {60 if ( fwrite( data, 1, size, os->file ) != size ) { 74 61 perror( IO_MSG "write" ); 75 62 exit( EXIT_FAILURE ); … … 78 65 } // write 79 66 80 int prtfmt( ofstream * os, const char fmt[], ... ) { 81 va_list args; 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; 82 71 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" ); 72 //--------------------------------------- 73 74 struct ifstream { 75 FILE *file; 76 }; 77 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" ); 88 90 exit( EXIT_FAILURE ); 89 91 } // if 90 92 } // if 91 va_end( args ); 92 return len; 93 } // prtfmt 93 return is; 94 } // read 94 95 95 96 static ofstream soutFile = { (FILE *)(&_IO_2_1_stdout_), 0, { ' ', '\0' } }; 97 ofstream *sout = &soutFile; 98 static ofstream serrFile = { (FILE *)(&_IO_2_1_stderr_), 0, { ' ', '\0' } }; 99 ofstream *serr = &serrFile; 100 101 102 //--------------------------------------- 103 104 105 int fail( ifstream * is ) { 106 return ferror( (FILE *)(is->file) ); 107 } // fail 108 109 int eof( ifstream * is ) { 110 return feof( (FILE *)(is->file) ); 111 } // eof 112 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 ); 118 } // if 119 is->file = t; 120 } // open 121 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 ) { 96 ifstream * read( ifstream * is, char * data, streamsize_type size ) { 131 97 if ( fail( is ) ) { 132 98 fprintf( stderr, "attempt read I/O on failed stream\n" ); … … 134 100 } // if 135 101 136 if ( fread( data, size, 1, (FILE *)(is->file)) == 0 ) {102 if ( fread( data, size, 1, is->file ) == 0 ) { 137 103 perror( IO_MSG "read" ); 138 104 exit( EXIT_FAILURE ); … … 147 113 } // if 148 114 149 if ( ungetc( c, (FILE *)(is->file)) == EOF ) {115 if ( ungetc( c, is->file ) == EOF ) { 150 116 perror( IO_MSG "ungetc" ); 151 117 exit( EXIT_FAILURE ); … … 154 120 } // ungetc 155 121 156 int scanfmt( ifstream * is, const char fmt[], ... ) { 157 va_list args; 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 158 130 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 166 } // if 167 va_end( args ); 168 return len; 169 } // prtfmt 131 void close( ifstream * is ) { 132 if ( is->file == stdin ) return; 170 133 134 if ( fclose( is->file ) == EOF ) { 135 perror( IO_MSG "close input" ); 136 } // if 137 } // close 171 138 172 139 static ifstream sinFile = { (FILE *)(&_IO_2_1_stdin_) };
Note:
See TracChangeset
for help on using the changeset viewer.