openbox/cparse.l (raw)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 |
%{ #include <glib.h> #include "config.h" static char *yyfilename; static int yylineno = 1; static gboolean haserror = FALSE; static ConfigEntry entry = { NULL, -1 }; static void stringvalue(); static void numbervalue(); static void identifier(); static void newline(); static int yywrap(); %} number [0-9]+ string \"[^"\n]*\" identifier [a-zA-Z][a-zA-Z0-9_.]* white [ \t]* assign {white}={white} %% {string}/{white}\n stringvalue(); {number}/{white}\n numbervalue(); ^{identifier}/{assign} identifier(); \n newline(); = [ \t] . haserror = TRUE; %% static void stringvalue() { if (!haserror && entry.name != NULL && (signed)entry.type < 0) { entry.type = Config_String; entry.value.string = g_strdup(yytext+1); /* drop the left quote */ if (entry.value.string[yyleng-2] != '"') printf("warning: improperly terminated string on line %d\n", yylineno); else entry.value.string[yyleng-2] = '\0'; } else haserror = TRUE; } static void numbervalue() { if (!haserror && entry.name != NULL && (signed)entry.type < 0) { entry.type = Config_Integer; entry.value.integer = atoi(yytext); } else haserror = TRUE; } static void identifier() { entry.name = g_strdup(yytext); entry.type = -1; } static void newline() { if (!haserror && entry.name != NULL && (signed)entry.type >= 0) { if (!config_set(entry.name, entry.type, entry.value)) g_warning("Invalid option in '%s': '%s'\n", yyfilename, entry.name); } else { printf("Parser error in '%s' on line %d\n", yyfilename, yylineno); } g_free(entry.name); entry.name = NULL; if (entry.type == Config_String) g_free(entry.value.string); entry.type = -1; haserror = FALSE; ++yylineno; } static int yywrap() { g_free(entry.name); entry.name = NULL; if (entry.type == Config_String) g_free(entry.value.string); return 1; } void cparse_go(char *filename, FILE *file) { yyfilename = filename; yyin = file; yylex(); } |