nkeynes@561: /** nkeynes@561: * $Id$ nkeynes@561: * nkeynes@561: * gendec action file parser. nkeynes@561: * nkeynes@561: * Copyright (c) 2005 Nathan Keynes. nkeynes@561: * nkeynes@561: * This program is free software; you can redistribute it and/or modify nkeynes@561: * it under the terms of the GNU General Public License as published by nkeynes@561: * the Free Software Foundation; either version 2 of the License, or nkeynes@561: * (at your option) any later version. nkeynes@561: * nkeynes@561: * This program is distributed in the hope that it will be useful, nkeynes@561: * but WITHOUT ANY WARRANTY; without even the implied warranty of nkeynes@561: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the nkeynes@561: * GNU General Public License for more details. nkeynes@561: */ nkeynes@561: nkeynes@359: #include nkeynes@359: #include nkeynes@359: #include nkeynes@359: #include nkeynes@359: #include nkeynes@359: #include nkeynes@359: #include "tools/gendec.h" nkeynes@359: nkeynes@359: static int yyline; nkeynes@359: nkeynes@420: struct action *new_action() { nkeynes@359: struct action *action = malloc( sizeof( struct action ) ); nkeynes@359: memset( action, 0, sizeof( struct action ) ); nkeynes@359: return action; nkeynes@359: } nkeynes@359: nkeynes@359: int add_action( struct actionset *actions, struct ruleset *rules, char *operation, char *action ) nkeynes@359: { nkeynes@359: char *act = g_strchomp(action); nkeynes@359: nkeynes@359: char opclean[strlen(operation)]; nkeynes@359: char *p = operation, *q = opclean; nkeynes@359: int i; nkeynes@359: nkeynes@359: // Strip c-style comments nkeynes@359: while( *p ) { nkeynes@359: if( *p == '/' && *(p+1) == '*' ) { nkeynes@359: p+=2; nkeynes@359: while( *p ) { nkeynes@359: if( *p == '*' && *(p+1) == '/' ) { nkeynes@359: p+=2; nkeynes@359: break; nkeynes@359: } nkeynes@359: p++; nkeynes@359: } nkeynes@359: } else if( *p == '/' && *(p+1) == '/' ) { nkeynes@359: p+=2; nkeynes@359: while( *p && *p != '\n' ) { nkeynes@359: p++; nkeynes@359: } nkeynes@359: } else { nkeynes@359: *q++ = *p++; nkeynes@359: } nkeynes@359: } nkeynes@359: *q = '\0'; nkeynes@359: strcpy( operation, g_strstrip(opclean) ); nkeynes@359: nkeynes@359: for( i=0; irule_count; i++ ) { nkeynes@359: if( strcasecmp(rules->rules[i]->format, operation) == 0 ) { nkeynes@359: if( actions->actions[i] != NULL ) { nkeynes@359: fprintf( stderr, "Duplicate actions for operation '%s'\n", operation ); nkeynes@359: return -1; nkeynes@359: } nkeynes@359: actions->actions[i] = act; nkeynes@359: return 0; nkeynes@359: } nkeynes@359: } nkeynes@359: fprintf(stderr, "No operation found matching '%s'\n", operation ); nkeynes@359: return -1; nkeynes@359: } nkeynes@359: nkeynes@359: nkeynes@359: struct actionset *parse_action_file( struct ruleset *rules, FILE *f ) nkeynes@359: { nkeynes@359: struct actionset *actions = malloc( sizeof(struct actionset ) ); nkeynes@359: struct stat st; nkeynes@359: char *text; nkeynes@359: int i, length; nkeynes@359: nkeynes@359: memset( actions, 0, sizeof( struct actionset ) ); nkeynes@359: /* Read whole file in (for convenience) */ nkeynes@359: fstat( fileno(f), &st ); nkeynes@359: length = st.st_size; nkeynes@359: text = malloc( length+1 ); nkeynes@359: fread( text, length, 1, f ); nkeynes@359: text[length] = '\0'; nkeynes@359: yyline = 0; nkeynes@359: actions->pretext = text; nkeynes@359: for( i=0; iposttext = &text[i]; nkeynes@359: nkeynes@359: return actions; nkeynes@359: }