Ignore:
Timestamp:
Jul 14, 2024, 5:57:41 PM (5 days ago)
Author:
Peter A. Buhr <pabuhr@…>
Branches:
master
Children:
a1a1f37d
Parents:
8315947
Message:

change assert to abort, second attempt to read enumerators

File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/enum.cfa

    r8315947 r2e6b2a0  
    11#include "enum.hfa"
    22#include "fstream.hfa"
    3 #include <stdlib.h>                                                                             // qsort
    43#include <string.h>
    54
     
    1110        E lower = lowerBound();
    1211        // It is okay to overflow as overflow will be theoretically caught by the other bound
    13         assert( i <= fromInstance(upper) && i >= fromInstance(lower)
    14             &&  "Not a valid value");
     12                if ( i < fromInstance( lower ) || i > fromInstance( upper ) )
     13                        abort( "call to fromInt has index %d outside enumeration range %d-%d",
     14                                   i, fromInstance( lower ), fromInstance( upper ) );
    1515        return fromInt_unsafe( i );
    1616    }
     
    1818    E succ( E e ) {
    1919        E upper = upperBound();
    20         assert( (fromInstance(e) < fromInstance(upper))
    21             && "Calling succ() on the last" );
     20                if ( fromInstance( e ) >= fromInstance( upper ) )
     21                        abort( "call to succ() exceeds enumeration upper bound of %d", fromInstance( upper ) );
    2222        return succ_unsafe(e);
    2323    }
     
    2525    E pred( E e ) {
    2626        E lower = lowerBound();
    27         assert( (fromInstance(e) > fromInstance(lower))
    28             && "Calling pred() on the first" );
     27                if ( fromInstance(e) <= fromInstance(lower ) )
     28                        abort( "call to pred() exceeds enumeration lower bound of %d", fromInstance( lower ) );
    2929        return pred_unsafe(e);
    3030    }
     
    3737}
    3838
    39 int scmp( const void * str1, const void * str2 ) {
    40     return -strcmp( *(char **)str1, *(char **)str2 );   // dscending order
    41 } // scmp
    42 
    4339forall( istype & | istream( istype ), E | CfaEnum( E ) )
    4440istype & ?|?( istype & is, E & e ) {
    45 //      printf( "here0\n" );
     41//      fprintf( stderr, "here0\n" );
    4642        if ( eof( is ) ) throwResume ExceptionInst( missing_data );
    4743
    4844        // Match input enumerator string to enumerator labels.
    49         int len = -1;
    50         const char * cpy[ 20 /*countof( E )*/ ];
     45        int N = Countof( e ), lnths[N], max = 0;
     46//      printf( "N %d\n", N );
     47//      for ( s; E : i; 0~@ ) {
    5148        int i = 0;
    5249        for ( s; E ) {
    53                 cpy[i] = label( s );
    54                 printf( "%s\n", cpy[i] );
     50                lnths[i] = strlen( label( s ) );
     51                if ( lnths[i] > max ) max = lnths[i];
     52//              fprintf( stderr, "%s %d %d\n", label( s ), lnths[i], max );
    5553                i += 1;
    56         }
    57         printf( "%d\n", i );
    58         qsort( cpy, i, sizeof(char*), scmp );
    59         i = 0;
    60         for ( s; E ) {
    61                 printf( "%s\n", cpy[i] );
    62                 i += 1;
    63         }
    64         int j = 0;
    65   X : for ( s; E ) {
    66                 len = strlen( cpy[j] );
    67                 printf( "%s %d\n", cpy[j], len );
    68                 char fmtstr[len + 16];
    69                 fmtstr[0] = ' ';                                                                // optional leadig whitespace
    70                 strcpy( &fmtstr[1], cpy[j] );                                   // copy format and add %n
    71                 strcpy( &fmtstr[len + 1], "%n" );
    72                 printf( "%s\n", fmtstr );
    73                 len = -1;
    74                 // scanf cursor does not move if no match
    75                 fmt( is, fmtstr, &len );
    76                 printf( "%s %d %d\n", fmtstr, len, j );
    77           if ( eof( is ) ) { break; }
    78           if ( len != -1 ) {
    79                   for ( s; E ) {
    80                           if ( strcmp( label( s ), cpy[j] ) == 0 ) { e = s; break X; }
    81                   }
    82           }
    83                 j += 1;
     54        } // for
     55
     56        int win = -1;
     57        char ch, curr = '\0', prev = '\0';
     58
     59        fmt( is, " " );                                                                         // skip optional whitespace
     60        for ( c; max ) {
     61                int args = fmt( is, "%c", &ch );                                // read character
     62                if ( eof( is ) ) {
     63//                      fprintf( stderr, "Eof1\n" );
     64                        if ( c == 0 ) return is;                                        // no characters read ?
     65                        clear( is );                                                            // => reset EOF => detect again on next read
     66//                      fprintf( stderr, "Eof2\n" );
     67                        goto W;
     68                }
     69                if ( args != 1 ) throwResume ExceptionInst( missing_data );
     70//              printf( "read '%c'\n", ch );
     71                for ( i; N ) {
     72//                      printf( "%d %d %d\n", c, i, lnths[i] );
     73                        if ( c < lnths[i] ) {                                           // eligible for this checking round ?
     74                                char match = label( fromInt( i ) )[c];  // optimization
     75//                              printf( "%c '%c'\n", match, ch );
     76                                if ( (match == ch) && (c == 0 || curr == label( fromInt( i ) )[c - 1]) ) {
     77//                                      printf( "match %d %d %d '%c' '%c' '%c' '%c' 'c'\n", c, i, lnths[i], match, ch, prev, label( fromInt( i ) )[c - 1] );
     78                                        win = c;
     79                                        prev = curr;
     80                                        curr = ch;
     81                                        break;
     82                                } // if
     83                        } // if
     84                } else {
     85//                      fprintf( stderr, "finished win: %d ch: '%c' curr: '%c' prev: '%c'\n", win, ch, curr, prev );
     86                        ungetc( ch, is );
     87                        if ( win == -1 ) throwResume ExceptionInst( missing_data );
     88                        goto W;                                                                         // break does not work
     89                } // for
     90//              printf( "\n" );
     91//      } else {
     92//              fprintf( stderr, "finished2 %d\n", win );
     93        } // for
     94  W :;
     95        for ( i; N ) {                                                                          // scan for winner, must succeed
     96                if ( win == lnths[i] - 1 ) {
     97                        char match = label( fromInt( i ) )[win];        // optimization
     98//                      printf( "finished1 win: %d i: %d lnth: %d match: '%c' curr: '%c' prev: '%c'\n", win, i, lnths[i], match, curr, prev );
     99                        if ( (match == curr) && (win == 0 || prev == label( fromInt( i ) )[win - 1]) ) {
     100                                e = fromInt( i );
     101                                break;
     102                        }
     103                } // if
    84104        } else {
    85                 //ExceptionInst( missing_data );
     105//              fprintf( stderr, "finished3 %d\n", win );
     106                throwResume ExceptionInst( missing_data );
    86107        } // for
    87         printf( "X %s %d\n", label( e ), len );
    88         if ( ! eof( is ) && len == -1 ) throwResume ExceptionInst( missing_data );
    89 
    90         // if ( eof( is ) ) throwResume ExceptionInst( missing_data );
    91         // char val[256];
    92         // int args = fmt( is, "%255s", val );
    93         // if ( ! eof( is ) && args != 1 ) throwResume ExceptionInst( missing_data );
    94         // for ( s; E ) {
    95         //      if ( strcmp(val, label( s )) == 0 ) { e = s; break; }
    96         // } else {
    97         //      fprintf( stderr, "invalid enumeration constant\n" );
    98         //      abort();                                                                        // cannot use abort stream
    99         // } // for
    100108        return is;
    101109}
    102 
    103 // forall( ostype & | ostream( ostype ), E | CfaEnum( E, quasi_void ) ) {
    104 //      ostype & ?|?( ostype & os, E e ) {
    105 //              return os | label( e );
    106 //      }
    107 //      OSTYPE_VOID_IMPL( E )
    108 // }
    109110
    110111forall( ostype & | ostream( ostype ), E | CfaEnum( E ) ) {
     
    114115        OSTYPE_VOID_IMPL( E )
    115116}
    116 
    117 //
Note: See TracChangeset for help on using the changeset viewer.