예제 #1
0
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 );
}
예제 #2
0
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 );
}
예제 #3
0
static void match( pr_state_t* parser, int token )
{
   if ( parser->lexer.token != token )
      longjmp( parser->env, PR_UNEXPECTED_TOKEN );

   match_any( parser );
}
예제 #4
0
파일: bind.cpp 프로젝트: sim82/playground
	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;
	}
예제 #5
0
파일: kernel.c 프로젝트: alisheikh/abrt
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);
    }
}
예제 #6
0
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 );
}
예제 #7
0
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;
}