Changeset 04138cc


Ignore:
Timestamp:
Jan 22, 2025, 8:24:44 AM (14 hours ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
master
Children:
373f098
Parents:
5db17077
Message:

more updates for eof of file checking

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/iostream.cfa

    r5db17077 r04138cc  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Jan 20 18:45:43 2025
    13 // Update Count     : 2063
     12// Last Modified On : Wed Jan 22 07:31:19 2025
     13// Update Count     : 2079
    1414//
    1515
     
    777777forall( istype & | basic_istream( istype ) ) {
    778778        istype & ?|?( istype & is, bool & b ) {
    779                 if ( eof( is ) ) throwResume ExceptionInst( end_of_file );
    780779                int len = -1;                                                                   // len not set if no match
    781                 // remove optional leading whitespace at start of strings.
    782                 fmt( is, " " FALSE "%n", &len );                                // try false
     780                fmt( is, " " );                                                                 // remove leading whitespace
     781                fmt( is, FALSE "%n", &len );                                    // try false, returns 0
    783782                if ( len != sizeof( FALSE ) - 1 ) {                             // -1 removes null terminate
    784                         fmt( is, " " TRUE "%n", &len );                         // try true
     783                        if ( eof( is ) ) throwResume ExceptionInst( end_of_file );
     784                        fmt( is, " " );                                                         // remove leading whitespace
     785                        fmt( is, TRUE "%n", &len );                                     // try true, returns 0
    785786                        if ( len != sizeof( TRUE ) - 1 ) throwResume ExceptionInst( missing_data );
    786787                        b = true;
     
    792793
    793794        istype & ?|?( istype & is, char & c ) {
    794                 if ( eof( is ) ) throwResume ExceptionInst( end_of_file );
    795795                char temp;
    796796                for () {
     
    950950                strcpy( &fmtstr[len], "%n" );
    951951                len = -1;
    952                 // scanf cursor does not move if no match
     952                // scanf cursor does not move if no match, so eof cannot be detected.
    953953                fmt( is, fmtstr, &len );                                                // can be called with EOF on
    954954                if ( ! eof( is ) && len == -1 ) throwResume ExceptionInst( missing_data );
     
    12041204forall( istype & | istream( istype ), E | CfaEnum( E ) | Serial( E ) )
    12051205istype & ?|?( istype & is, E & e ) {
    1206 //      fprintf( stderr, "here0\n" );
    1207         if ( eof( is ) ) throwResume ExceptionInst( end_of_file );
     1206//      if ( eof( is ) ) throwResume ExceptionInst( end_of_file );
    12081207
    12091208        // Match longest input enumerator string to enumerator labels, where enumerator names are unique.
    12101209
    12111210        int N = countof( E ), lnths[N], fred = 0;
    1212 //      printf( "N %d\n", N );
    12131211        int r = 0;
    1214         // for ( s; E : r; 0~@ ) {
    12151212        for ( s; E ) {                                                                          // scan string rows gathering lengths
    12161213                lnths[r] = strlen( label( s ) );
    12171214                if ( lnths[r] > fred ) fred = lnths[r];
    1218 //              fprintf( stderr, "%s %d %d\n", label( s ), lnths[r], fred );
    12191215                r += 1;
    12201216        } // for
     
    12231219        char ch, curr = '\0', prev = '\0';
    12241220
    1225         fmt( is, " " );                                                                         // skip optional whitespace
     1221        fmt( is, " " );                                                                         // remove leading whitespace
    12261222        if ( eof( is ) ) throwResume ExceptionInst( end_of_file );
    12271223
    12281224        for ( c; fred ) {                                                                       // scan columns of the label matix (some columns missing)
    12291225                int args = fmt( is, "%c", &ch );                                // read character
    1230 //              fprintf( stderr, "fmt args: %d eof: %d\n", args, eof(is) );
    12311226          if ( eof( is ) ) {
    1232 //                      fprintf( stderr, "Eof1\n" );
    12331227                        if ( c == 0 ) return is;                                        // no characters read ?
    12341228                        clear( is );                                                            // => read something => reset EOF => detect again on next read
    1235 //                      fprintf( stderr, "Eof2\n" );
    12361229                        break;
    12371230                } // if
    12381231          if ( args != 1 ) throwResume ExceptionInst( missing_data ); // may be unnecessary since reading single character
    12391232
    1240 //              printf( "read '%c'\n", ch );
    12411233                for ( r; N ) {                                                                  // scan enumeration strings for matching character in current column
    1242 //                      printf( "%d %d %d\n", c, r, lnths[r] );
    12431234                        if ( c < lnths[r] ) {                                           // string long enough for this column check ?
    12441235                                char match = label( fromInt( r ) )[c];  // optimization
    1245 //                              printf( "%c '%c'\n", match, ch );
    12461236                                // Stop on first match, could be other matches.
    12471237                                if ( (match == ch) && (c == 0 || curr == label( fromInt( r ) )[c - 1]) ) {
    1248 //                                      printf( "match %d %d %d '%c' '%c' '%c' '%c' 'c'\n", c, r, lnths[r], match, ch, prev, label( fromInt( r ) )[c - 1] );
    12491238                                        mcol = c;                                                       // matching column
    12501239                                        prev = curr;                                            // last matching character
     
    12541243                        } // if
    12551244                } else {
    1256 //                      fprintf( stderr, "finished mcol: %d ch: '%c' curr: '%c' prev: '%c'\n", mcol, ch, curr, prev );
    12571245                        ungetc( ch, is );                                                       // push back last unmatching character
    12581246                        if ( mcol == -1 ) throwResume ExceptionInst( missing_data ); // no matching character in first column
    12591247                        break;
    12601248                } // for
    1261 //              printf( "\n" );
    1262 //      } else {
    1263 //              fprintf( stderr, "finished2 %d\n", mcol );
    12641249        } // for
    12651250
     
    12671252                if ( mcol == lnths[c] - 1 ) {
    12681253                        char match = label( fromInt( c ) )[mcol];       // optimization
    1269 //                      printf( "finished1 mcol: %d c: %d lnth: %d match: '%c' curr: '%c' prev: '%c'\n", mcol, c, lnths[c], match, curr, prev );
    12701254                        if ( (match == curr) && (mcol == 0 || prev == label( fromInt( c ) )[mcol - 1]) ) {
    12711255                                e = fromInt( c );
     
    12741258                } // if
    12751259        } else {
    1276 //              fprintf( stderr, "finished3 %d\n", mcol );
    12771260                throwResume ExceptionInst( missing_data );              // no match in this column
    12781261        } // for
Note: See TracChangeset for help on using the changeset viewer.