diff options
Diffstat (limited to 'test/rlhc.d/case/awkemu.c-C-T1--goto-backend.exp')
-rw-r--r-- | test/rlhc.d/case/awkemu.c-C-T1--goto-backend.exp | 342 |
1 files changed, 342 insertions, 0 deletions
diff --git a/test/rlhc.d/case/awkemu.c-C-T1--goto-backend.exp b/test/rlhc.d/case/awkemu.c-C-T1--goto-backend.exp new file mode 100644 index 00000000..cb79635a --- /dev/null +++ b/test/rlhc.d/case/awkemu.c-C-T1--goto-backend.exp @@ -0,0 +1,342 @@ +#include <stdio.h> +#include <string.h> + +#define LINEBUF 2048 +static char lineBuf[LINEBUF]; +static char blineBuf[LINEBUF]; +static int lineLen; +static int blineLen; +static int words; + +void finishLine(); + +struct awkemu +{ + int cs; +}; + + + +void finishLine() +{ + int i; + char *pword = blineBuf; + lineBuf[lineLen] = 0; + printf("endline(%i): %s\n", words, lineBuf ); + for ( i = 0; i < words; i++ ) { + printf(" word: %s\n", pword ); + pword += strlen(pword) + 1; + } +} + +static const char _awkemu_key_offsets [] = { 0, 3, 6, 0 , }; +static const char _awkemu_trans_keys [] = { 9, 10, 32, 9, 10, 32, 9, 10, 32, 0 , }; +static const char _awkemu_single_lengths [] = { 3, 3, 3, 0 , }; +static const char _awkemu_range_lengths [] = { 0, 0, 0, 0 , }; +static const char _awkemu_index_offsets [] = { 0, 4, 8, 0 , }; +static const char _awkemu_trans_cond_spaces [] = { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 0 , }; +static const char _awkemu_trans_offsets [] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0 , }; +static const char _awkemu_trans_lengths [] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0 , }; +static const char _awkemu_cond_keys [] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 , }; +static const char _awkemu_cond_targs [] = { 1, 2, 1, 0, 1, 2, 1, 0, 1, 2, 1, 0, 0 , }; +static const char _awkemu_cond_actions [] = { 2, 3, 2, 1, 4, 5, 4, 1, 7, 8, 7, 6, 0 , }; +static const char _awkemu_nfa_targs [] = { 0, 0 , }; +static const char _awkemu_nfa_offsets [] = { 0, 0, 0, 0 , }; +static const char _awkemu_nfa_push_actions [] = { 0, 0 , }; +static const char _awkemu_nfa_pop_trans [] = { 0, 0 , }; +static const int awkemu_start = 2; +static const int awkemu_first_final = 2; +static const int awkemu_error = -1; +static const int awkemu_en_main = 2; +void awkemu_init( struct awkemu *fsm ) +{ + + { + (fsm->cs) = ( int ) awkemu_start; + } +} + +void awkemu_execute( struct awkemu *fsm, const char *_data, int _len ) +{ + const char *p = _data; + const char *pe = _data+_len; + + { + int _klen; + const char *_keys; + const char *_ckeys; + int _cpc; + unsigned int _trans = 0; + unsigned int _cond = 0; + if ( p == pe ) + goto _test_eof; + + _resume : + _keys = _awkemu_trans_keys + _awkemu_key_offsets[(fsm->cs)]; + _trans = ( unsigned int ) _awkemu_index_offsets[(fsm->cs)]; + _klen = ( int ) _awkemu_single_lengths[(fsm->cs)]; + if ( _klen > 0 ) + { + const char *_lower; + const char *_mid; + const char *_upper; + _lower = _keys; + _upper = _keys + _klen - 1; + while ( 1 ) + { + if ( _upper < _lower ) + break; + + + _mid = _lower + ((_upper-_lower)>> 1); + if ( ((*( p )) + )< (*( _mid )) + ) + _upper = _mid - 1; + + else if ( ((*( p )) + )> (*( _mid )) + ) + _lower = _mid + 1; + + else + { + _trans += ( unsigned int ) (_mid - _keys); + goto _match; + } + + } + + _keys += _klen; + _trans += ( unsigned int ) _klen; + } + + + _klen = ( int ) _awkemu_range_lengths[(fsm->cs)]; + if ( _klen > 0 ) + { + const char *_lower; + const char *_mid; + const char *_upper; + _lower = _keys; + _upper = _keys + (_klen<<1)- 2; + while ( 1 ) + { + if ( _upper < _lower ) + break; + + + _mid = _lower + (((_upper-_lower)>> 1)& ~1); + if ( ((*( p )) + )< (*( _mid )) + ) + _upper = _mid - 2; + + else if ( ((*( p )) + )> (*( _mid + 1 )) + ) + _lower = _mid + 2; + + else + { + _trans += ( unsigned int ) ((_mid - _keys)>>1); + goto _match; + } + + } + + _trans += ( unsigned int ) _klen; + } + + + + _match : + _ckeys = _awkemu_cond_keys + _awkemu_trans_offsets[_trans]; + _klen = ( int ) _awkemu_trans_lengths[_trans]; + _cond = ( unsigned int ) _awkemu_trans_offsets[_trans]; + _cpc = 0; + { + const char *_lower; + const char *_mid; + const char *_upper; + _lower = _ckeys; + _upper = _ckeys + _klen - 1; + while ( 1 ) + { + if ( _upper < _lower ) + break; + + + _mid = _lower + ((_upper-_lower)>> 1); + if ( _cpc < ( int ) (*( _mid )) + ) + _upper = _mid - 1; + + else if ( _cpc > ( int ) (*( _mid )) + ) + _lower = _mid + 1; + + else + { + _cond += ( unsigned int ) (_mid - _ckeys); + goto _match_cond; + } + + } + + (fsm->cs) = -1; + goto _again; + } + + _match_cond : + (fsm->cs) = ( int ) _awkemu_cond_targs[_cond]; + if ( _awkemu_cond_actions[_cond]== 0 ) + goto _again; + + + switch ( _awkemu_cond_actions[_cond] ) { + case 4 : + { + lineBuf[lineLen++] = (((*( p )) + )); + + } + + break; + case 5 : + { + finishLine(); + } + + break; + case 7 : + { + lineLen = 0; + blineLen = 0; + words = 0; + + } + { + lineBuf[lineLen++] = (((*( p )) + )); + + } + + break; + case 8 : + { + lineLen = 0; + blineLen = 0; + words = 0; + + } + { + finishLine(); + } + + break; + case 1 : + { + blineBuf[blineLen++] = (((*( p )) + )); + + } + { + lineBuf[lineLen++] = (((*( p )) + )); + + } + + break; + case 2 : + { + blineBuf[blineLen++] = 0; + words += 1; + + } + { + lineBuf[lineLen++] = (((*( p )) + )); + + } + + break; + case 3 : + { + blineBuf[blineLen++] = 0; + words += 1; + + } + { + finishLine(); + } + + break; + case 6 : + { + lineLen = 0; + blineLen = 0; + words = 0; + + } + { + blineBuf[blineLen++] = (((*( p )) + )); + + } + { + lineBuf[lineLen++] = (((*( p )) + )); + + } + + break; + + } + + _again : + p += 1; + if ( p != pe ) + goto _resume; + + + _test_eof : + {} + + } +} + +int awkemu_finish( struct awkemu *fsm ) +{ + if ( fsm->cs == awkemu_error ) + return -1; + if ( fsm->cs >= awkemu_first_final ) + return 1; + return 0; +} + +#include <stdio.h> +#define BUFSIZE 2048 + +struct awkemu fsm; +char buf[BUFSIZE]; + +void test( char *buf ) +{ + int len = strlen( buf ); + awkemu_init( &fsm ); + awkemu_execute( &fsm, buf, len ); + if ( awkemu_finish( &fsm ) > 0 ) + printf("ACCEPT\n"); + else + printf("FAIL\n"); +} + +int main() +{ + test( "" ); + test( "one line with no newline" ); + test( "one line\n" ); + return 0; +} + |