filename | src/tools/actparse.c |
changeset | 359:c588dce7ebde |
next | 420:e6f43dec3cf0 |
author | nkeynes |
date | Thu Aug 23 12:33:27 2007 +0000 (16 years ago) |
permissions | -rw-r--r-- |
last change | Commit decoder generator Translator work in progress Fix mac.l, mac.w in emu core |
file | annotate | diff | log | raw |
nkeynes@359 | 1 | #include <stdlib.h> |
nkeynes@359 | 2 | #include <stdio.h> |
nkeynes@359 | 3 | #include <string.h> |
nkeynes@359 | 4 | #include <ctype.h> |
nkeynes@359 | 5 | #include <sys/stat.h> |
nkeynes@359 | 6 | #include <glib/gstrfuncs.h> |
nkeynes@359 | 7 | #include "tools/gendec.h" |
nkeynes@359 | 8 | |
nkeynes@359 | 9 | static int yyline; |
nkeynes@359 | 10 | |
nkeynes@359 | 11 | struct rule *new_action() { |
nkeynes@359 | 12 | struct action *action = malloc( sizeof( struct action ) ); |
nkeynes@359 | 13 | memset( action, 0, sizeof( struct action ) ); |
nkeynes@359 | 14 | return action; |
nkeynes@359 | 15 | } |
nkeynes@359 | 16 | |
nkeynes@359 | 17 | int add_action( struct actionset *actions, struct ruleset *rules, char *operation, char *action ) |
nkeynes@359 | 18 | { |
nkeynes@359 | 19 | char *act = g_strchomp(action); |
nkeynes@359 | 20 | |
nkeynes@359 | 21 | char opclean[strlen(operation)]; |
nkeynes@359 | 22 | char *p = operation, *q = opclean; |
nkeynes@359 | 23 | int i; |
nkeynes@359 | 24 | |
nkeynes@359 | 25 | // Strip c-style comments |
nkeynes@359 | 26 | while( *p ) { |
nkeynes@359 | 27 | if( *p == '/' && *(p+1) == '*' ) { |
nkeynes@359 | 28 | p+=2; |
nkeynes@359 | 29 | while( *p ) { |
nkeynes@359 | 30 | if( *p == '*' && *(p+1) == '/' ) { |
nkeynes@359 | 31 | p+=2; |
nkeynes@359 | 32 | break; |
nkeynes@359 | 33 | } |
nkeynes@359 | 34 | p++; |
nkeynes@359 | 35 | } |
nkeynes@359 | 36 | } else if( *p == '/' && *(p+1) == '/' ) { |
nkeynes@359 | 37 | p+=2; |
nkeynes@359 | 38 | while( *p && *p != '\n' ) { |
nkeynes@359 | 39 | p++; |
nkeynes@359 | 40 | } |
nkeynes@359 | 41 | } else { |
nkeynes@359 | 42 | *q++ = *p++; |
nkeynes@359 | 43 | } |
nkeynes@359 | 44 | } |
nkeynes@359 | 45 | *q = '\0'; |
nkeynes@359 | 46 | strcpy( operation, g_strstrip(opclean) ); |
nkeynes@359 | 47 | |
nkeynes@359 | 48 | for( i=0; i<rules->rule_count; i++ ) { |
nkeynes@359 | 49 | if( strcasecmp(rules->rules[i]->format, operation) == 0 ) { |
nkeynes@359 | 50 | if( actions->actions[i] != NULL ) { |
nkeynes@359 | 51 | fprintf( stderr, "Duplicate actions for operation '%s'\n", operation ); |
nkeynes@359 | 52 | return -1; |
nkeynes@359 | 53 | } |
nkeynes@359 | 54 | actions->actions[i] = act; |
nkeynes@359 | 55 | return 0; |
nkeynes@359 | 56 | } |
nkeynes@359 | 57 | } |
nkeynes@359 | 58 | fprintf(stderr, "No operation found matching '%s'\n", operation ); |
nkeynes@359 | 59 | return -1; |
nkeynes@359 | 60 | } |
nkeynes@359 | 61 | |
nkeynes@359 | 62 | |
nkeynes@359 | 63 | struct actionset *parse_action_file( struct ruleset *rules, FILE *f ) |
nkeynes@359 | 64 | { |
nkeynes@359 | 65 | struct actionset *actions = malloc( sizeof(struct actionset ) ); |
nkeynes@359 | 66 | struct stat st; |
nkeynes@359 | 67 | char *text; |
nkeynes@359 | 68 | int i, length; |
nkeynes@359 | 69 | |
nkeynes@359 | 70 | memset( actions, 0, sizeof( struct actionset ) ); |
nkeynes@359 | 71 | /* Read whole file in (for convenience) */ |
nkeynes@359 | 72 | fstat( fileno(f), &st ); |
nkeynes@359 | 73 | length = st.st_size; |
nkeynes@359 | 74 | text = malloc( length+1 ); |
nkeynes@359 | 75 | fread( text, length, 1, f ); |
nkeynes@359 | 76 | text[length] = '\0'; |
nkeynes@359 | 77 | yyline = 0; |
nkeynes@359 | 78 | actions->pretext = text; |
nkeynes@359 | 79 | for( i=0; i<length; i++ ) { |
nkeynes@359 | 80 | if( text[i] == '\n' ) { |
nkeynes@359 | 81 | yyline++; |
nkeynes@359 | 82 | if( i+3 < length && text[i+1] == '%' && text[i+2] == '%' ) { |
nkeynes@359 | 83 | text[i+1] = '\0'; |
nkeynes@359 | 84 | i+=3; |
nkeynes@359 | 85 | break; |
nkeynes@359 | 86 | } |
nkeynes@359 | 87 | } |
nkeynes@359 | 88 | } |
nkeynes@359 | 89 | |
nkeynes@359 | 90 | char *operation = &text[i]; |
nkeynes@359 | 91 | for( ; i<length; i++ ) { |
nkeynes@359 | 92 | if( text[i] == '\n' ) { |
nkeynes@359 | 93 | yyline++; |
nkeynes@359 | 94 | if( i+3 < length && text[i+1] == '%' && text[i+2] == '%' ) { |
nkeynes@359 | 95 | i+=3; |
nkeynes@359 | 96 | break; |
nkeynes@359 | 97 | } |
nkeynes@359 | 98 | } |
nkeynes@359 | 99 | |
nkeynes@359 | 100 | if( text[i] == '{' && text[i+1] == ':' ) { |
nkeynes@359 | 101 | text[i] = '\0'; |
nkeynes@359 | 102 | i+=2; |
nkeynes@359 | 103 | char *action = &text[i]; |
nkeynes@359 | 104 | for( ;i<length; i++ ) { |
nkeynes@359 | 105 | if( text[i] == ':' && text[i+1] == '}' ) { |
nkeynes@359 | 106 | text[i] = '\0'; |
nkeynes@359 | 107 | i++; |
nkeynes@359 | 108 | if( add_action( actions, rules, operation, action ) != 0 ) { |
nkeynes@359 | 109 | free(actions); |
nkeynes@359 | 110 | free(text); |
nkeynes@359 | 111 | return NULL; |
nkeynes@359 | 112 | } |
nkeynes@359 | 113 | operation = &text[i+1]; |
nkeynes@359 | 114 | break; |
nkeynes@359 | 115 | } |
nkeynes@359 | 116 | } |
nkeynes@359 | 117 | } |
nkeynes@359 | 118 | } |
nkeynes@359 | 119 | |
nkeynes@359 | 120 | actions->posttext = &text[i]; |
nkeynes@359 | 121 | |
nkeynes@359 | 122 | return actions; |
nkeynes@359 | 123 | } |
.