#line 1 "dm_parser.ragel"
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <string.h>
#include "dm.h"
#define CTS(X) {if (!dm_current_tok)token_s = p; printf("%s ",#X);if (!dm_current_tok) dm_current_tok = TOK_##X;}
#define CTE() {token_e = p;}
#define TADD(T,S,E) {tl_add_tok(tl,T,S,E);}
char *new_string( const char *start, const char *end )
{
int str_s = end-start+1;
char *new_str=malloc( str_s+1 );
memcpy( new_str, start, str_s );
if ( new_str != NULL )
new_str[str_s]=0x0;
return new_str;
}
int print_token( char *s, char *e, int tok)
{
char *p = new_string( s, e );
printf("t=%d,p=%s\n",tok,p);
free( p );
return 0;
}
#line 38 "dm_parser.c"
static const char _dm_actions[] = {
0, 1, 0, 1, 1, 1, 2, 1,
3, 1, 4, 1, 5, 1, 6, 1,
7, 1, 8, 1, 9, 1, 10, 1,
11, 1, 12
};
static const char _dm_key_offsets[] = {
0, 0, 8, 17, 23, 24, 36, 39,
41
};
static const char _dm_trans_keys[] = {
32, 39, 48, 57, 65, 90, 97, 122,
32, 34, 39, 48, 57, 65, 90, 97,
122, 48, 57, 65, 70, 97, 102, 102,
32, 34, 38, 40, 41, 45, 48, 105,
9, 10, 49, 57, 120, 48, 57, 48,
57, 48, 57, 65, 70, 97, 102, 0
};
static const char _dm_single_lengths[] = {
0, 2, 3, 0, 1, 8, 1, 0,
0
};
static const char _dm_range_lengths[] = {
0, 3, 3, 3, 0, 2, 1, 1,
3
};
static const char _dm_index_offsets[] = {
0, 0, 6, 13, 17, 19, 30, 33,
35
};
static const char _dm_indicies[] = {
0, 0, 0, 0, 0, 1, 0, 2,
0, 0, 0, 0, 1, 4, 4, 4,
3, 5, 1, 6, 7, 8, 9, 10,
11, 12, 14, 6, 13, 1, 16, 13,
15, 13, 15, 4, 4, 4, 17, 0
};
static const char _dm_trans_targs[] = {
2, 0, 5, 5, 8, 5, 5, 1,
5, 5, 5, 5, 6, 7, 4, 5,
3, 5
};
static const char _dm_trans_actions[] = {
0, 0, 9, 25, 0, 11, 7, 0,
17, 13, 15, 19, 5, 0, 0, 23,
0, 21
};
static const char _dm_to_state_actions[] = {
0, 0, 0, 0, 0, 1, 0, 0,
0
};
static const char _dm_from_state_actions[] = {
0, 0, 0, 0, 0, 3, 0, 0,
0
};
static const char _dm_eof_trans[] = {
0, 0, 0, 4, 0, 0, 16, 16,
18
};
static const int dm_start = 5;
static const int dm_first_final = 5;
static const int dm_error = 0;
static const int dm_en_main = 5;
#line 63 "dm_parser.ragel"
int parse_dm( token_list *tl, const char *str )
{
static uint8_t cs;
const int stacksize = 10;
int res=0, *stack=NULL, act=0;
stack = malloc( sizeof(stack)*stacksize );
char *p=(char *)str, *pe = (char *)str + strlen( str ), *eof=NULL;
char *ts, *te = 0;
/*
variables used in state machine
*/
#line 134 "dm_parser.c"
{
cs = dm_start;
ts = 0;
te = 0;
act = 0;
}
#line 79 "dm_parser.ragel"
#line 144 "dm_parser.c"
{
int _klen;
unsigned int _trans;
const char *_acts;
unsigned int _nacts;
const char *_keys;
if ( p == pe )
goto _test_eof;
if ( cs == 0 )
goto _out;
_resume:
_acts = _dm_actions + _dm_from_state_actions[cs];
_nacts = (unsigned int) *_acts++;
while ( _nacts-- > 0 ) {
switch ( *_acts++ ) {
case 1:
#line 1 "NONE"
{ts = p;}
break;
#line 165 "dm_parser.c"
}
}
_keys = _dm_trans_keys + _dm_key_offsets[cs];
_trans = _dm_index_offsets[cs];
_klen = _dm_single_lengths[cs];
if ( _klen > 0 ) {
const char *_lower = _keys;
const char *_mid;
const char *_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 += _klen;
}
_klen = _dm_range_lengths[cs];
if ( _klen > 0 ) {
const char *_lower = _keys;
const char *_mid;
const char *_upper = _keys + (_klen<<1) - 2;
while (1) {
if ( _upper < _lower )
break;
_mid = _lower + (((_upper-_lower) >> 1) & ~1);
if ( (*p) < _mid[0] )
_upper = _mid - 2;
else if ( (*p) > _mid[1] )
_lower = _mid + 2;
else {
_trans += (unsigned int)((_mid - _keys)>>1);
goto _match;
}
}
_trans += _klen;
}
_match:
_trans = _dm_indicies[_trans];
_eof_trans:
cs = _dm_trans_targs[_trans];
if ( _dm_trans_actions[_trans] == 0 )
goto _again;
_acts = _dm_actions + _dm_trans_actions[_trans];
_nacts = (unsigned int) *_acts++;
while ( _nacts-- > 0 )
{
switch ( *_acts++ )
{
case 2:
#line 1 "NONE"
{te = p+1;}
break;
case 3:
#line 52 "dm_parser.ragel"
{te = p+1;}
break;
case 4:
#line 53 "dm_parser.ragel"
{te = p+1;{/*printf("str = ");fwrite(ts,1,te-ts,stdout);printf("\n");*/TADD(TOK_STR,ts,te);}}
break;
case 5:
#line 55 "dm_parser.ragel"
{te = p+1;{/*printf("if = ");fwrite(ts,1,te-ts,stdout);printf("\n");*/TADD(TOK_IF,ts,te);}}
break;
case 6:
#line 56 "dm_parser.ragel"
{te = p+1;{/*printf("lbr = ");fwrite(ts,1,te-ts,stdout);printf("\n");*/TADD(TOK_LBR,ts,te);}}
break;
case 7:
#line 57 "dm_parser.ragel"
{te = p+1;{/*printf("rbr = ");fwrite(ts,1,te-ts,stdout);printf("\n");*/TADD(TOK_RBR,ts,te);}}
break;
case 8:
#line 58 "dm_parser.ragel"
{te = p+1;{/*printf("and = ");fwrite(ts,1,te-ts,stdout);printf("\n");*/TADD(TOK_EAND,ts,te);}}
break;
case 9:
#line 59 "dm_parser.ragel"
{te = p+1;{/*printf("range = ");fwrite(ts,1,te-ts,stdout);printf("\n");*/TADD(TOK_RANGE,ts,te);}}
break;
case 10:
#line 51 "dm_parser.ragel"
{te = p;p--;{/*printf("hex = ");fwrite(ts,1,te-ts,stdout);printf("\n");*/TADD(TOK_HEX,ts,te);}}
break;
case 11:
#line 54 "dm_parser.ragel"
{te = p;p--;{/*printf("int = ");fwrite(ts,1,te-ts,stdout);printf("\n");*/TADD(TOK_INT,ts,te);}}
break;
case 12:
#line 54 "dm_parser.ragel"
{{p = ((te))-1;}{/*printf("int = ");fwrite(ts,1,te-ts,stdout);printf("\n");*/TADD(TOK_INT,ts,te);}}
break;
#line 275 "dm_parser.c"
}
}
_again:
_acts = _dm_actions + _dm_to_state_actions[cs];
_nacts = (unsigned int) *_acts++;
while ( _nacts-- > 0 ) {
switch ( *_acts++ ) {
case 0:
#line 1 "NONE"
{ts = 0;}
break;
#line 288 "dm_parser.c"
}
}
if ( cs == 0 )
goto _out;
if ( ++p != pe )
goto _resume;
_test_eof: {}
if ( p == eof )
{
if ( _dm_eof_trans[cs] > 0 ) {
_trans = _dm_eof_trans[cs] - 1;
goto _eof_trans;
}
}
_out: {}
}
#line 80 "dm_parser.ragel"
if ( cs == dm_error )
{
printf("ERR state [%d] pos[%d]:[%s]\n", res, p-str, p);
res = -1;
}
return res;
}