source: src/libcfa/fstream.c @ b63e376

ADTaaron-thesisarm-ehast-experimentalcleanup-dtorsctordeferred_resndemanglerenumforall-pointer-decaygc_noraiijacob/cs343-translationjenkins-sandboxmemorynew-astnew-ast-unique-exprnew-envno_listpersistent-indexerpthread-emulationqualifiedEnumresolv-newstringwith_gc
Last change on this file since b63e376 was 90c3b1c, checked in by Peter A. Buhr <pabuhr@…>, 8 years ago

compile CFA with C++11, further update refrat with lstlisting macros, support varags, enumeration initialization, add implicit separators to output streams, update example programs that print

  • Property mode set to 100644
File size: 4.5 KB
Line 
1//
2// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
6//
7// fstream.c --
8//
9// Author           : Peter A. Buhr
10// Created On       : Wed May 27 17:56:53 2015
11// Last Modified By : Peter A. Buhr
12// Last Modified On : Mon Feb 29 18:41:10 2016
13// Update Count     : 162
14//
15
16#include "fstream"
17
18extern "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
25}
26
27#define IO_MSG "I/O error "
28
29_Bool sepPrt( ofstream * os ) { return os->separate == 1; }
30void sepOn( ofstream * os ) { if ( os->separate != 2 ) os->separate = 1; }
31void sepOff( ofstream * os ) { if ( os->separate != 2 ) os->separate = 0; }
32void sepSet( ofstream * os, const char * s ) {
33        strncpy( &(os->separator[0]), s, separateSize - 1 );
34        os->separator[separateSize - 1] = '\0';
35} // sepSet
36const char * sepGet( ofstream * os ) { return &(os->separator[0]); }
37void sepDisable( ofstream *os ) { os->separate = 2; }
38void sepEnable( ofstream *os ) { os->separate = 0; }
39
40int fail( ofstream * os ) {
41        return ferror( (FILE *)(os->file) );
42} // fail
43
44int flush( ofstream * os ) {
45        return fflush( (FILE *)(os->file) );
46} // flush
47
48void open( ofstream * os, const char * name, const char * mode ) {
49        FILE *file = fopen( name, mode );
50        if ( file == 0 ) {                                                                      // do not change unless successful
51                perror( IO_MSG "open output" );
52                exit( EXIT_FAILURE );
53        } // if
54        os->file = file;
55        sepOff( os );
56        sepSet( os, " " );
57} // open
58
59void close( ofstream * os ) {
60        if ( (FILE *)(os->file) == stdout || (FILE *)(os->file) == stderr ) return;
61
62        if ( fclose( (FILE *)(os->file) ) == EOF ) {
63                perror( IO_MSG "close output" );
64        } // if
65} // close
66
67ofstream * write( ofstream * os, const char * data, unsigned long int size ) {
68        if ( fail( os ) ) {
69                fprintf( stderr, "attempt write I/O on failed stream\n" );
70                exit( EXIT_FAILURE );
71        } // if
72
73        if ( fwrite( data, 1, size, (FILE *)(os->file) ) != size ) {
74                perror( IO_MSG "write" );
75                exit( EXIT_FAILURE );
76        } // if
77        return os;
78} // write
79
80int 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
96static ofstream soutFile = { (FILE *)(&_IO_2_1_stdout_), 0, { ' ', '\0' } };
97ofstream *sout = &soutFile;
98static ofstream serrFile = { (FILE *)(&_IO_2_1_stderr_), 0, { ' ', '\0' } };
99ofstream *serr = &serrFile;
100
101
102//---------------------------------------
103
104
105int fail( ifstream * is ) {
106        return ferror( (FILE *)(is->file) );
107} // fail
108
109int eof( ifstream * is ) {
110        return feof( (FILE *)(is->file) );
111} // eof
112
113void 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
122void 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
130ifstream * read( ifstream * is, char * data, unsigned long int size ) {
131        if ( fail( is ) ) {
132                fprintf( stderr, "attempt read I/O on failed stream\n" );
133                exit( EXIT_FAILURE );
134        } // if
135
136        if ( fread( data, size, 1, (FILE *)(is->file) ) == 0 ) {
137                perror( IO_MSG "read" );
138                exit( EXIT_FAILURE );
139        } // if
140        return is;
141} // read
142 
143ifstream *ungetc( ifstream * is, char c ) {
144        if ( fail( is ) ) {
145                fprintf( stderr, "attempt ungetc I/O on failed stream\n" );
146                exit( EXIT_FAILURE );
147        } // if
148
149        if ( ungetc( c, (FILE *)(is->file) ) == EOF ) {
150                perror( IO_MSG "ungetc" );
151                exit( EXIT_FAILURE );
152        } // if
153        return is;
154} // ungetc
155
156int 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
166        } // if
167    va_end( args );
168        return len;
169} // prtfmt
170
171
172static ifstream sinFile = { (FILE *)(&_IO_2_1_stdin_) };
173ifstream *sin = &sinFile;
174
175// Local Variables: //
176// tab-width: 4 //
177// compile-command: "cfa fstream.c" //
178// End: //
Note: See TracBrowser for help on using the repository browser.