Ignore:
Timestamp:
Jul 16, 2024, 10:35:29 PM (4 months ago)
Author:
JiadaL <j82liang@…>
Branches:
master
Children:
0097d08
Parents:
68ea8d2 (diff), 88bc876 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' of plg.uwaterloo.ca:software/cfa/cfa-cc

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/enum.cfa

    r68ea8d2 r97f9619  
    4242        if ( eof( is ) ) throwResume ExceptionInst( missing_data );
    4343
    44         // Match input enumerator string to enumerator labels.
     44        // Match longest input enumerator string to enumerator labels, where enumerator names are unique.
     45
    4546        int N = Countof( e ), lnths[N], max = 0;
    4647//      printf( "N %d\n", N );
     
    6061        for ( c; max ) {
    6162                int args = fmt( is, "%c", &ch );                                // read character
    62                 if ( eof( is ) ) {
     63          if ( eof( is ) ) {
    6364//                      fprintf( stderr, "Eof1\n" );
    6465                        if ( c == 0 ) return is;                                        // no characters read ?
    65                         clear( is );                                                            // => reset EOF => detect again on next read
     66                        clear( is );                                                            // => read something => reset EOF => detect again on next read
    6667//                      fprintf( stderr, "Eof2\n" );
    67                         goto W;
    68                 }
     68                        break;
     69                } // if
    6970                if ( args != 1 ) throwResume ExceptionInst( missing_data );
     71
    7072//              printf( "read '%c'\n", ch );
    71                 for ( i; N ) {
     73                for ( i; N ) {                                                                  // scan enumeration strings for winner
    7274//                      printf( "%d %d %d\n", c, i, lnths[i] );
    7375                        if ( c < lnths[i] ) {                                           // eligible for this checking round ?
    7476                                char match = label( fromInt( i ) )[c];  // optimization
    7577//                              printf( "%c '%c'\n", match, ch );
     78                                // Stop on first match, could be other matches.
    7679                                if ( (match == ch) && (c == 0 || curr == label( fromInt( i ) )[c - 1]) ) {
    7780//                                      printf( "match %d %d %d '%c' '%c' '%c' '%c' 'c'\n", c, i, lnths[i], match, ch, prev, label( fromInt( i ) )[c - 1] );
     
    9295//              fprintf( stderr, "finished2 %d\n", win );
    9396        } // for
    94   W :;
    95         for ( i; N ) {                                                                          // scan for winner, must succeed
     97  W: ;
     98        for ( i; N ) {                                                                          // scan enumeration strings for winner
    9699                if ( win == lnths[i] - 1 ) {
    97100                        char match = label( fromInt( i ) )[win];        // optimization
     
    100103                                e = fromInt( i );
    101104                                break;
    102                         }
     105                        } // if
    103106                } // if
    104107        } else {
Note: See TracChangeset for help on using the changeset viewer.