Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/fstream.cfa

    rf451177 r8d321f9  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue Apr 27 22:08:57 2021
    13 // Update Count     : 442
    14 //
    15 
    16 #include "fstream.hfa"                                                                  // also includes iostream.hfa
     12// Last Modified On : Fri Jun 19 16:24:54 2020
     13// Update Count     : 384
     14//
     15
     16#include "fstream.hfa"
    1717
    1818#include <stdio.h>                                                                              // vfprintf, vfscanf
    1919#include <stdlib.h>                                                                             // exit
    2020#include <stdarg.h>                                                                             // varargs
    21 #include <string.h>                                                                             // strncpy, strerror
     21#include <string.h>                                                                             // strlen
     22#include <float.h>                                                                              // DBL_DIG, LDBL_DIG
     23#include <complex.h>                                                                    // creal, cimag
    2224#include <assert.h>
    2325#include <errno.h>                                                                              // errno
    2426
     27
    2528// *********************************** ofstream ***********************************
    2629
     
    2932
    3033void ?{}( ofstream & os, void * file ) {
    31         os.file$ = file;
    32         os.sepDefault$ = true;
    33         os.sepOnOff$ = false;
    34         os.nlOnOff$ = true;
    35         os.prt$ = false;
    36         os.sawNL$ = false;
    37         os.acquired$ = false;
    38         sepSetCur$( os, sepGet( os ) );
     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 ) );
    3941        sepSet( os, " " );
    4042        sepSetTuple( os, ", " );
     
    4244
    4345// private
    44 bool sepPrt$( ofstream & os ) { setNL$( os, false ); return os.sepOnOff$; }
    45 void sepReset$( ofstream & os ) { os.sepOnOff$ = os.sepDefault$; }
    46 void sepReset$( ofstream & os, bool reset ) { os.sepDefault$ = reset; os.sepOnOff$ = os.sepDefault$; }
    47 const char * sepGetCur$( ofstream & os ) { return os.sepCur$; }
    48 void sepSetCur$( ofstream & os, const char sepCur[] ) { os.sepCur$ = sepCur; }
    49 bool getNL$( ofstream & os ) { return os.sawNL$; }
    50 void setNL$( ofstream & os, bool state ) { os.sawNL$ = state; }
    51 bool getANL$( ofstream & os ) { return os.nlOnOff$; }
    52 bool getPrt$( ofstream & os ) { return os.prt$; }
    53 void setPrt$( ofstream & os, bool state ) { os.prt$ = state; }
     46bool $sepPrt( ofstream & os ) { $setNL( os, false ); return os.$sepOnOff; }
     47void $sepReset( ofstream & os ) { os.$sepOnOff = os.$sepDefault; }
     48void $sepReset( ofstream & os, bool reset ) { os.$sepDefault = reset; os.$sepOnOff = os.$sepDefault; }
     49const char * $sepGetCur( ofstream & os ) { return os.$sepCur; }
     50void $sepSetCur( ofstream & os, const char sepCur[] ) { os.$sepCur = sepCur; }
     51bool $getNL( ofstream & os ) { return os.$sawNL; }
     52void $setNL( ofstream & os, bool state ) { os.$sawNL = state; }
     53bool $getANL( ofstream & os ) { return os.$nlOnOff; }
     54bool $getPrt( ofstream & os ) { return os.$prt; }
     55void $setPrt( ofstream & os, bool state ) { os.$prt = state; }
    5456
    5557// public
    56 void ?{}( ofstream & os ) { os.file$ = 0p; }
     58void ?{}( ofstream & os ) { os.$file = 0p; }
    5759
    5860void ?{}( ofstream & os, const char name[], const char mode[] ) {
     
    6870} // ^?{}
    6971
    70 void sepOn( ofstream & os ) { os.sepOnOff$ = ! getNL$( os ); }
    71 void sepOff( ofstream & os ) { os.sepOnOff$ = false; }
     72void sepOn( ofstream & os ) { os.$sepOnOff = ! $getNL( os ); }
     73void sepOff( ofstream & os ) { os.$sepOnOff = false; }
    7274
    7375bool sepDisable( ofstream & os ) {
    74         bool temp = os.sepDefault$;
    75         os.sepDefault$ = false;
    76         sepReset$( os );
     76        bool temp = os.$sepDefault;
     77        os.$sepDefault = false;
     78        $sepReset( os );
    7779        return temp;
    7880} // sepDisable
    7981
    8082bool sepEnable( ofstream & os ) {
    81         bool temp = os.sepDefault$;
    82         os.sepDefault$ = true;
    83         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 ?
    8486        return temp;
    8587} // sepEnable
    8688
    87 void nlOn( ofstream & os ) { os.nlOnOff$ = true; }
    88 void nlOff( ofstream & os ) { os.nlOnOff$ = false; }
    89 
    90 const char * sepGet( ofstream & os ) { return os.separator$; }
     89void nlOn( ofstream & os ) { os.$nlOnOff = true; }
     90void nlOff( ofstream & os ) { os.$nlOnOff = false; }
     91
     92const char * sepGet( ofstream & os ) { return os.$separator; }
    9193void sepSet( ofstream & os, const char s[] ) {
    9294        assert( s );
    93         strncpy( os.separator$, s, ofstream_sepSize - 1 );
    94         os.separator$[ofstream_sepSize - 1] = '\0';
     95        strncpy( os.$separator, s, sepSize - 1 );
     96        os.$separator[sepSize - 1] = '\0';
    9597} // sepSet
    9698
    97 const char * sepGetTuple( ofstream & os ) { return os.tupleSeparator$; }
     99const char * sepGetTuple( ofstream & os ) { return os.$tupleSeparator; }
    98100void sepSetTuple( ofstream & os, const char s[] ) {
    99101        assert( s );
    100         strncpy( os.tupleSeparator$, s, ofstream_sepSize - 1 );
    101         os.tupleSeparator$[ofstream_sepSize - 1] = '\0';
     102        strncpy( os.$tupleSeparator, s, sepSize - 1 );
     103        os.$tupleSeparator[sepSize - 1] = '\0';
    102104} // sepSet
    103105
    104106void ends( ofstream & os ) {
    105         if ( getANL$( os ) ) nl( os );
    106         else setPrt$( os, false );                                                      // turn off
     107        if ( $getANL( os ) ) nl( os );
     108        else $setPrt( os, false );                                                      // turn off
    107109        if ( &os == &exit ) exit( EXIT_FAILURE );
    108110        if ( &os == &abort ) abort();
    109         if ( os.acquired$ ) { os.acquired$ = false; release( os ); }
    110111} // ends
    111112
    112 bool fail( ofstream & os ) {
    113         return os.file$ == 0 || ferror( (FILE *)(os.file$) );
     113int fail( ofstream & os ) {
     114        return os.$file == 0 || ferror( (FILE *)(os.$file) );
    114115} // fail
    115116
    116117int flush( ofstream & os ) {
    117         return fflush( (FILE *)(os.file$) );
     118        return fflush( (FILE *)(os.$file) );
    118119} // flush
    119120
     
    134135
    135136void close( ofstream & os ) {
    136   if ( (FILE *)(os.file$) == 0p ) return;
    137   if ( (FILE *)(os.file$) == (FILE *)stdout || (FILE *)(os.file$) == (FILE *)stderr ) return;
    138 
    139         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 ) {
    140141                abort | IO_MSG "close output" | nl | strerror( errno );
    141142        } // if
    142         os.file$ = 0p;
     143        os.$file = 0p;
    143144} // close
    144145
     
    148149        } // if
    149150
    150         if ( fwrite( data, 1, size, (FILE *)(os.file$) ) != size ) {
     151        if ( fwrite( data, 1, size, (FILE *)(os.$file) ) != size ) {
    151152                abort | IO_MSG "write" | nl | strerror( errno );
    152153        } // if
     
    157158        va_list args;
    158159        va_start( args, format );
    159         int len = vfprintf( (FILE *)(os.file$), format, args );
     160        int len = vfprintf( (FILE *)(os.$file), format, args );
    160161        if ( len == EOF ) {
    161                 if ( ferror( (FILE *)(os.file$) ) ) {
     162                if ( ferror( (FILE *)(os.$file) ) ) {
    162163                        abort | IO_MSG "invalid write";
    163164                } // if
     
    165166        va_end( args );
    166167
    167         setPrt$( os, true );                                                            // called in output cascade
    168         sepReset$( os );                                                                        // reset separator
     168        $setPrt( os, true );                                                            // called in output cascade
     169        $sepReset( os );                                                                        // reset separator
    169170        return len;
    170171} // fmt
    171 
    172 inline void acquire( ofstream & os ) {
    173         lock( os.lock$ );
    174         if ( ! os.acquired$ ) os.acquired$ = true;
    175         else unlock( os.lock$ );
    176 } // acquire
    177 
    178 inline void release( ofstream & os ) {
    179         unlock( os.lock$ );
    180 } // release
    181 
    182 void ?{}( osacquire & acq, ofstream & os ) { &acq.os = &os; lock( os.lock$ ); }
    183 void ^?{}( osacquire & acq ) { release( acq.os ); }
    184172
    185173static ofstream soutFile = { (FILE *)stdout };
     
    188176ofstream & serr = serrFile, & stderr = serrFile;
    189177
    190 static ofstream lsoutFile = { (FILE *)stdout };
    191 ofstream & lsout = lsoutFile;
    192 
    193178static ofstream exitFile = { (FILE *)stdout };
    194179ofstream & exit = exitFile;
     
    196181ofstream & abort = abortFile;
    197182
    198 ofstream & nl( ofstream & os ) {
    199         nl$( os );                                                                                      // call basic_ostream nl
    200         flush( os );
    201         return os;
    202         // (ofstream &)(os | '\n');
    203         // setPrt$( os, false );                                                        // turn off
    204         // setNL$( os, true );
    205         // flush( os );
    206         // return sepOff( os );                                                 // prepare for next line
    207 } // nl
    208183
    209184// *********************************** ifstream ***********************************
     
    212187// private
    213188void ?{}( ifstream & is, void * file ) {
    214         is.file$ = file;
    215         is.nlOnOff$ = false;
    216         is.acquired$ = false;
     189        is.$file = file;
     190        is.$nlOnOff = false;
    217191} // ?{}
    218192
    219193// public
    220 void ?{}( ifstream & is ) { is.file$ = 0p; }
     194void ?{}( ifstream & is ) { is.$file = 0p; }
    221195
    222196void ?{}( ifstream & is, const char name[], const char mode[] ) {
     
    232206} // ^?{}
    233207
    234 void nlOn( ifstream & os ) { os.nlOnOff$ = true; }
    235 void nlOff( ifstream & os ) { os.nlOnOff$ = false; }
    236 bool getANL( ifstream & os ) { return os.nlOnOff$; }
    237 
    238 bool fail( ifstream & is ) {
    239         return is.file$ == 0p || ferror( (FILE *)(is.file$) );
     208void nlOn( ifstream & os ) { os.$nlOnOff = true; }
     209void nlOff( ifstream & os ) { os.$nlOnOff = false; }
     210bool getANL( ifstream & os ) { return os.$nlOnOff; }
     211
     212int fail( ifstream & is ) {
     213        return is.$file == 0p || ferror( (FILE *)(is.$file) );
    240214} // fail
    241215
    242 void ends( ifstream & is ) {
    243         if ( is.acquired$ ) { is.acquired$ = false; release( is ); }
    244 } // ends
    245 
    246216int eof( ifstream & is ) {
    247         return feof( (FILE *)(is.file$) );
     217        return feof( (FILE *)(is.$file) );
    248218} // eof
    249219
     
    256226        } // if
    257227        #endif // __CFA_DEBUG__
    258         is.file$ = file;
     228        is.$file = file;
    259229} // open
    260230
     
    264234
    265235void close( ifstream & is ) {
    266   if ( (FILE *)(is.file$) == 0p ) return;
    267   if ( (FILE *)(is.file$) == (FILE *)stdin ) return;
    268 
    269         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 ) {
    270240                abort | IO_MSG "close input" | nl | strerror( errno );
    271241        } // if
    272         is.file$ = 0p;
     242        is.$file = 0p;
    273243} // close
    274244
     
    278248        } // if
    279249
    280         if ( fread( data, size, 1, (FILE *)(is.file$) ) == 0 ) {
     250        if ( fread( data, size, 1, (FILE *)(is.$file) ) == 0 ) {
    281251                abort | IO_MSG "read" | nl | strerror( errno );
    282252        } // if
     
    289259        } // if
    290260
    291         if ( ungetc( c, (FILE *)(is.file$) ) == EOF ) {
     261        if ( ungetc( c, (FILE *)(is.$file) ) == EOF ) {
    292262                abort | IO_MSG "ungetc" | nl | strerror( errno );
    293263        } // if
     
    299269
    300270        va_start( args, format );
    301         int len = vfscanf( (FILE *)(is.file$), format, args );
     271        int len = vfscanf( (FILE *)(is.$file), format, args );
    302272        if ( len == EOF ) {
    303                 if ( ferror( (FILE *)(is.file$) ) ) {
     273                if ( ferror( (FILE *)(is.$file) ) ) {
    304274                        abort | IO_MSG "invalid read";
    305275                } // if
     
    309279} // fmt
    310280
    311 inline void acquire( ifstream & is ) {
    312         lock( is.lock$ );
    313         if ( ! is.acquired$ ) is.acquired$ = true;
    314         else unlock( is.lock$ );
    315 } // acquire
    316 
    317 inline void release( ifstream & is ) {
    318         unlock( is.lock$ );
    319 } // release
    320 
    321 void ?{}( isacquire & acq, ifstream & is ) { &acq.is = &is; lock( is.lock$ ); }
    322 void ^?{}( isacquire & acq ) { release( acq.is ); }
    323 
    324281static ifstream sinFile = { (FILE *)stdin };
    325282ifstream & sin = sinFile, & stdin = sinFile;
     
    329286
    330287
    331 EHM_VIRTUAL_TABLE(Open_Failure, Open_Failure_main_table);
    332288void ?{}( Open_Failure & this, ofstream & ostream ) {
    333         this.virtual_table = &Open_Failure_main_table;
     289        VTABLE_INIT(this, Open_Failure);
    334290        this.ostream = &ostream;
    335291        this.tag = 1;
    336292}
    337293void ?{}( Open_Failure & this, ifstream & istream ) {
    338         this.virtual_table = &Open_Failure_main_table;
     294        VTABLE_INIT(this, Open_Failure);
    339295        this.istream = &istream;
    340296        this.tag = 0;
    341297}
     298const char * Open_Failure_msg(Open_Failure * this) {
     299        return "Open_Failure";
     300}
     301VTABLE_INSTANCE(Open_Failure)(Open_Failure_msg);
    342302void throwOpen_Failure( ofstream & ostream ) {
    343303        Open_Failure exc = { ostream };
Note: See TracChangeset for help on using the changeset viewer.