static void parse_value( pr_state_t* parser, const char* key, unsigned keylen, pr_node_t* node, int isrom ) { unsigned i; if ( isrom && keylen == 4 && !strncmp( key, "name", 4 ) ) { key = "rom_name"; keylen = 8; } for ( i = 0; i < node->count; i++ ) { if ( keylen == node->pairs[ i ].key_len && !strncmp( key, node->pairs[ i ].key, keylen ) ) break; } if ( i == node->count ) node->count++; node->pairs[ i ].key = key; node->pairs[ i ].key_len = keylen; node->pairs[ i ].value = parser->lexer.start; node->pairs[ i ].value_len = parser->lexer.len; if ( parser->lexer.token == LX_STRING || parser->lexer.token == LX_NUMBER || parser->lexer.token == LX_TAG ) match_any( parser ); else longjmp( parser->env, PR_UNEXPECTED_TOKEN ); }
static void match_tag( pr_state_t* parser, const char* tag ) { if ( parser->lexer.token != LX_TAG || strncmp( parser->lexer.start, tag, strlen( tag ) ) ) longjmp( parser->env, PR_UNEXPECTED_TOKEN ); match_any( parser ); }
static void match( pr_state_t* parser, int token ) { if ( parser->lexer.token != token ) longjmp( parser->env, PR_UNEXPECTED_TOKEN ); match_any( parser ); }
node expression() { ts_trans tr(ts_); if( ts_->end_of_input() ) { return node(); } rule_t exp = match_any( { match_list( { token(1), token(2) }), match_list( { token(666), token(777) }), } ); //std::cout << "exp: " << sizeof( exp ) << "\n"; node n = exp(ts_); std::cout << "expression: " << n.is_null() << "\n"; if( !n.is_null() ) { n.annotate( "expression" ); tr.commit(); } return n; }
void koops_print_suspicious_strings_filtered(const regex_t **filterout) { for (const char *const *str = s_koops_suspicious_strings; *str; ++str) { if (filterout == NULL || !match_any(filterout, *str)) puts(*str); } }
static void parse_map( pr_state_t* parser, int skip, int isrom ) { pr_node_t dummy; pr_node_t* node; unsigned hash; const char* key; unsigned keylen; if ( skip ) { node = &dummy; dummy.count = 0; } else node = parser->node; match( parser, LX_LPAREN ); while ( parser->lexer.token != LX_RPAREN ) { if ( parser->lexer.token != LX_TAG ) longjmp( parser->env, PR_UNEXPECTED_TOKEN ); key = parser->lexer.start; keylen = parser->lexer.len; hash = djb2( key, keylen ); match_any( parser ); switch ( hash ) { case 0x0b88a693U: /* rom */ parse_map( parser, skip, 1 ); break; default: parse_value( parser, key, keylen, node, isrom ); break; } } match_any( parser ); }
int pr_parse( pr_state_t* parser ) { int res; if ( ( res = setjmp( parser->env ) ) == 0 ) { match_any( parser ); parse_clrmamepro( parser ); while ( parser->lexer.token != LX_EOF ) parse_game( parser ); } *parser->prev = NULL; return res; }