Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/fstream.cfa

    r8d321f9 rf451177  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Fri Jun 19 16:24:54 2020
    13 // Update Count     : 384
    14 //
    15 
    16 #include "fstream.hfa"
     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
    1717
    1818#include <stdio.h>                                                                              // vfprintf, vfscanf
    1919#include <stdlib.h>                                                                             // exit
    2020#include <stdarg.h>                                                                             // varargs
    21 #include <string.h>                                                                             // strlen
    22 #include <float.h>                                                                              // DBL_DIG, LDBL_DIG
    23 #include <complex.h>                                                                    // creal, cimag
     21#include <string.h>                                                                             // strncpy, strerror
    2422#include <assert.h>
    2523#include <errno.h>                                                                              // errno
    2624
    27 
    2825// *********************************** ofstream ***********************************
    2926
     
    3229
    3330void ?{}( ofstream & os, void * file ) {
    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 ) );
     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 ) );
    4139        sepSet( os, " " );
    4240        sepSetTuple( os, ", " );
     
    4442
    4543// private
    46 bool $sepPrt( ofstream & os ) { $setNL( os, false ); return os.$sepOnOff; }
    47 void $sepReset( ofstream & os ) { os.$sepOnOff = os.$sepDefault; }
    48 void $sepReset( ofstream & os, bool reset ) { os.$sepDefault = reset; os.$sepOnOff = os.$sepDefault; }
    49 const char * $sepGetCur( ofstream & os ) { return os.$sepCur; }
    50 void $sepSetCur( ofstream & os, const char sepCur[] ) { os.$sepCur = sepCur; }
    51 bool $getNL( ofstream & os ) { return os.$sawNL; }
    52 void $setNL( ofstream & os, bool state ) { os.$sawNL = state; }
    53 bool $getANL( ofstream & os ) { return os.$nlOnOff; }
    54 bool $getPrt( ofstream & os ) { return os.$prt; }
    55 void $setPrt( ofstream & os, bool state ) { os.$prt = state; }
     44bool sepPrt$( ofstream & os ) { setNL$( os, false ); return os.sepOnOff$; }
     45void sepReset$( ofstream & os ) { os.sepOnOff$ = os.sepDefault$; }
     46void sepReset$( ofstream & os, bool reset ) { os.sepDefault$ = reset; os.sepOnOff$ = os.sepDefault$; }
     47const char * sepGetCur$( ofstream & os ) { return os.sepCur$; }
     48void sepSetCur$( ofstream & os, const char sepCur[] ) { os.sepCur$ = sepCur; }
     49bool getNL$( ofstream & os ) { return os.sawNL$; }
     50void setNL$( ofstream & os, bool state ) { os.sawNL$ = state; }
     51bool getANL$( ofstream & os ) { return os.nlOnOff$; }
     52bool getPrt$( ofstream & os ) { return os.prt$; }
     53void setPrt$( ofstream & os, bool state ) { os.prt$ = state; }
    5654
    5755// public
    58 void ?{}( ofstream & os ) { os.$file = 0p; }
     56void ?{}( ofstream & os ) { os.file$ = 0p; }
    5957
    6058void ?{}( ofstream & os, const char name[], const char mode[] ) {
     
    7068} // ^?{}
    7169
    72 void sepOn( ofstream & os ) { os.$sepOnOff = ! $getNL( os ); }
    73 void sepOff( ofstream & os ) { os.$sepOnOff = false; }
     70void sepOn( ofstream & os ) { os.sepOnOff$ = ! getNL$( os ); }
     71void sepOff( ofstream & os ) { os.sepOnOff$ = false; }
    7472
    7573bool sepDisable( ofstream & os ) {
    76         bool temp = os.$sepDefault;
    77         os.$sepDefault = false;
    78         $sepReset( os );
     74        bool temp = os.sepDefault$;
     75        os.sepDefault$ = false;
     76        sepReset$( os );
    7977        return temp;
    8078} // sepDisable
    8179
    8280bool sepEnable( ofstream & os ) {
    83         bool temp = os.$sepDefault;
    84         os.$sepDefault = true;
    85         if ( os.$sepOnOff ) $sepReset( os );                            // start of line ?
     81        bool temp = os.sepDefault$;
     82        os.sepDefault$ = true;
     83        if ( os.sepOnOff$ ) sepReset$( os );                            // start of line ?
    8684        return temp;
    8785} // sepEnable
    8886
    89 void nlOn( ofstream & os ) { os.$nlOnOff = true; }
    90 void nlOff( ofstream & os ) { os.$nlOnOff = false; }
    91 
    92 const char * sepGet( ofstream & os ) { return os.$separator; }
     87void nlOn( ofstream & os ) { os.nlOnOff$ = true; }
     88void nlOff( ofstream & os ) { os.nlOnOff$ = false; }
     89
     90const char * sepGet( ofstream & os ) { return os.separator$; }
    9391void sepSet( ofstream & os, const char s[] ) {
    9492        assert( s );
    95         strncpy( os.$separator, s, sepSize - 1 );
    96         os.$separator[sepSize - 1] = '\0';
     93        strncpy( os.separator$, s, ofstream_sepSize - 1 );
     94        os.separator$[ofstream_sepSize - 1] = '\0';
    9795} // sepSet
    9896
    99 const char * sepGetTuple( ofstream & os ) { return os.$tupleSeparator; }
     97const char * sepGetTuple( ofstream & os ) { return os.tupleSeparator$; }
    10098void sepSetTuple( ofstream & os, const char s[] ) {
    10199        assert( s );
    102         strncpy( os.$tupleSeparator, s, sepSize - 1 );
    103         os.$tupleSeparator[sepSize - 1] = '\0';
     100        strncpy( os.tupleSeparator$, s, ofstream_sepSize - 1 );
     101        os.tupleSeparator$[ofstream_sepSize - 1] = '\0';
    104102} // sepSet
    105103
    106104void ends( ofstream & os ) {
    107         if ( $getANL( os ) ) nl( os );
    108         else $setPrt( os, false );                                                      // turn off
     105        if ( getANL$( os ) ) nl( os );
     106        else setPrt$( os, false );                                                      // turn off
    109107        if ( &os == &exit ) exit( EXIT_FAILURE );
    110108        if ( &os == &abort ) abort();
     109        if ( os.acquired$ ) { os.acquired$ = false; release( os ); }
    111110} // ends
    112111
    113 int fail( ofstream & os ) {
    114         return os.$file == 0 || ferror( (FILE *)(os.$file) );
     112bool fail( ofstream & os ) {
     113        return os.file$ == 0 || ferror( (FILE *)(os.file$) );
    115114} // fail
    116115
    117116int flush( ofstream & os ) {
    118         return fflush( (FILE *)(os.$file) );
     117        return fflush( (FILE *)(os.file$) );
    119118} // flush
    120119
     
    135134
    136135void close( ofstream & os ) {
    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 ) {
     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 ) {
    141140                abort | IO_MSG "close output" | nl | strerror( errno );
    142141        } // if
    143         os.$file = 0p;
     142        os.file$ = 0p;
    144143} // close
    145144
     
    149148        } // if
    150149
    151         if ( fwrite( data, 1, size, (FILE *)(os.$file) ) != size ) {
     150        if ( fwrite( data, 1, size, (FILE *)(os.file$) ) != size ) {
    152151                abort | IO_MSG "write" | nl | strerror( errno );
    153152        } // if
     
    158157        va_list args;
    159158        va_start( args, format );
    160         int len = vfprintf( (FILE *)(os.$file), format, args );
     159        int len = vfprintf( (FILE *)(os.file$), format, args );
    161160        if ( len == EOF ) {
    162                 if ( ferror( (FILE *)(os.$file) ) ) {
     161                if ( ferror( (FILE *)(os.file$) ) ) {
    163162                        abort | IO_MSG "invalid write";
    164163                } // if
     
    166165        va_end( args );
    167166
    168         $setPrt( os, true );                                                            // called in output cascade
    169         $sepReset( os );                                                                        // reset separator
     167        setPrt$( os, true );                                                            // called in output cascade
     168        sepReset$( os );                                                                        // reset separator
    170169        return len;
    171170} // fmt
     171
     172inline void acquire( ofstream & os ) {
     173        lock( os.lock$ );
     174        if ( ! os.acquired$ ) os.acquired$ = true;
     175        else unlock( os.lock$ );
     176} // acquire
     177
     178inline void release( ofstream & os ) {
     179        unlock( os.lock$ );
     180} // release
     181
     182void ?{}( osacquire & acq, ofstream & os ) { &acq.os = &os; lock( os.lock$ ); }
     183void ^?{}( osacquire & acq ) { release( acq.os ); }
    172184
    173185static ofstream soutFile = { (FILE *)stdout };
     
    176188ofstream & serr = serrFile, & stderr = serrFile;
    177189
     190static ofstream lsoutFile = { (FILE *)stdout };
     191ofstream & lsout = lsoutFile;
     192
    178193static ofstream exitFile = { (FILE *)stdout };
    179194ofstream & exit = exitFile;
     
    181196ofstream & abort = abortFile;
    182197
     198ofstream & 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
    183208
    184209// *********************************** ifstream ***********************************
     
    187212// private
    188213void ?{}( ifstream & is, void * file ) {
    189         is.$file = file;
    190         is.$nlOnOff = false;
     214        is.file$ = file;
     215        is.nlOnOff$ = false;
     216        is.acquired$ = false;
    191217} // ?{}
    192218
    193219// public
    194 void ?{}( ifstream & is ) { is.$file = 0p; }
     220void ?{}( ifstream & is ) { is.file$ = 0p; }
    195221
    196222void ?{}( ifstream & is, const char name[], const char mode[] ) {
     
    206232} // ^?{}
    207233
    208 void nlOn( ifstream & os ) { os.$nlOnOff = true; }
    209 void nlOff( ifstream & os ) { os.$nlOnOff = false; }
    210 bool getANL( ifstream & os ) { return os.$nlOnOff; }
    211 
    212 int fail( ifstream & is ) {
    213         return is.$file == 0p || ferror( (FILE *)(is.$file) );
     234void nlOn( ifstream & os ) { os.nlOnOff$ = true; }
     235void nlOff( ifstream & os ) { os.nlOnOff$ = false; }
     236bool getANL( ifstream & os ) { return os.nlOnOff$; }
     237
     238bool fail( ifstream & is ) {
     239        return is.file$ == 0p || ferror( (FILE *)(is.file$) );
    214240} // fail
    215241
     242void ends( ifstream & is ) {
     243        if ( is.acquired$ ) { is.acquired$ = false; release( is ); }
     244} // ends
     245
    216246int eof( ifstream & is ) {
    217         return feof( (FILE *)(is.$file) );
     247        return feof( (FILE *)(is.file$) );
    218248} // eof
    219249
     
    226256        } // if
    227257        #endif // __CFA_DEBUG__
    228         is.$file = file;
     258        is.file$ = file;
    229259} // open
    230260
     
    234264
    235265void close( ifstream & is ) {
    236   if ( (FILE *)(is.$file) == 0p ) return;
    237   if ( (FILE *)(is.$file) == (FILE *)stdin ) return;
    238 
    239         if ( fclose( (FILE *)(is.$file) ) == EOF ) {
     266  if ( (FILE *)(is.file$) == 0p ) return;
     267  if ( (FILE *)(is.file$) == (FILE *)stdin ) return;
     268
     269        if ( fclose( (FILE *)(is.file$) ) == EOF ) {
    240270                abort | IO_MSG "close input" | nl | strerror( errno );
    241271        } // if
    242         is.$file = 0p;
     272        is.file$ = 0p;
    243273} // close
    244274
     
    248278        } // if
    249279
    250         if ( fread( data, size, 1, (FILE *)(is.$file) ) == 0 ) {
     280        if ( fread( data, size, 1, (FILE *)(is.file$) ) == 0 ) {
    251281                abort | IO_MSG "read" | nl | strerror( errno );
    252282        } // if
     
    259289        } // if
    260290
    261         if ( ungetc( c, (FILE *)(is.$file) ) == EOF ) {
     291        if ( ungetc( c, (FILE *)(is.file$) ) == EOF ) {
    262292                abort | IO_MSG "ungetc" | nl | strerror( errno );
    263293        } // if
     
    269299
    270300        va_start( args, format );
    271         int len = vfscanf( (FILE *)(is.$file), format, args );
     301        int len = vfscanf( (FILE *)(is.file$), format, args );
    272302        if ( len == EOF ) {
    273                 if ( ferror( (FILE *)(is.$file) ) ) {
     303                if ( ferror( (FILE *)(is.file$) ) ) {
    274304                        abort | IO_MSG "invalid read";
    275305                } // if
     
    279309} // fmt
    280310
     311inline void acquire( ifstream & is ) {
     312        lock( is.lock$ );
     313        if ( ! is.acquired$ ) is.acquired$ = true;
     314        else unlock( is.lock$ );
     315} // acquire
     316
     317inline void release( ifstream & is ) {
     318        unlock( is.lock$ );
     319} // release
     320
     321void ?{}( isacquire & acq, ifstream & is ) { &acq.is = &is; lock( is.lock$ ); }
     322void ^?{}( isacquire & acq ) { release( acq.is ); }
     323
    281324static ifstream sinFile = { (FILE *)stdin };
    282325ifstream & sin = sinFile, & stdin = sinFile;
     
    286329
    287330
     331EHM_VIRTUAL_TABLE(Open_Failure, Open_Failure_main_table);
    288332void ?{}( Open_Failure & this, ofstream & ostream ) {
    289         VTABLE_INIT(this, Open_Failure);
     333        this.virtual_table = &Open_Failure_main_table;
    290334        this.ostream = &ostream;
    291335        this.tag = 1;
    292336}
    293337void ?{}( Open_Failure & this, ifstream & istream ) {
    294         VTABLE_INIT(this, Open_Failure);
     338        this.virtual_table = &Open_Failure_main_table;
    295339        this.istream = &istream;
    296340        this.tag = 0;
    297341}
    298 const char * Open_Failure_msg(Open_Failure * this) {
    299         return "Open_Failure";
    300 }
    301 VTABLE_INSTANCE(Open_Failure)(Open_Failure_msg);
    302342void throwOpen_Failure( ofstream & ostream ) {
    303343        Open_Failure exc = { ostream };
Note: See TracChangeset for help on using the changeset viewer.