10 #include "obtheme.tab.h"
12 int yylex(YYSTYPE *yylval, struct parser_control *pc);
14 void obthemeerror(struct parser_control *pc, char *s)
16 printf("Parse error in file %s on line %d\n%s"
17 , pc->currfile[pc->include_stack_ptr]
18 , pc->currline[pc->include_stack_ptr] + 1
22 extern int parserparse(void *);
29 int obtheme_parse(struct obthemedata *td, const char *filename)
33 struct parser_control *pc;
36 input = fopen(filename, "r");
42 pc->include_stack_ptr = 0;
43 pc->currline[pc->include_stack_ptr] = 0;
44 strncpy(pc->currfile[pc->include_stack_ptr], filename, 500);
45 ret = obthemeparse(pc);
47 //XXX I THINK I NEED TO CLOSE ALL INCLUDE FILES HERE
48 //probably also fclose input and call parser_finish?
62 <incl>[ \t]* /* eat the whitespace */
63 <incl>[^ \t\n]+ { /* got the include file name */
65 if ( pc->include_stack_ptr >= MAX_INCLUDE_DEPTH) {
66 fprintf( stderr, "Includes nested too deeply" );
70 pc->include_stack[pc->include_stack_ptr++] = YY_CURRENT_BUFFER;
71 incfile = malloc(strlen(yytext) + strlen("include/")+ 1);
72 strcpy(incfile, "include/");
73 strcat(incfile, yytext);
74 yyin = fopen( incfile, "r" );
76 strncpy(pc->currfile[pc->include_stack_ptr], yytext, 500);
77 pc->currline[pc->include_stack_ptr] = 0;
79 printf("Could not find include file %s (%s)\n", yytext, incfile);
82 yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
88 if ( --(pc->include_stack_ptr) < 0 )
90 yy_delete_buffer(YY_CURRENT_BUFFER);
96 yy_delete_buffer( YY_CURRENT_BUFFER );
99 pc->include_stack[pc->include_stack_ptr] );
107 <comment>"*"+[^*/\n]* ;
108 <comment>"*"+"/" BEGIN(INITIAL);
115 geometry return GEOMETRY;
116 material return MATERIAL;
117 gradient return GRADIENT;
118 context return CONTEXT;
119 cursor return CURSOR;
122 anchor return ANCHOR;
123 opacity return OPACITY;
124 shapeof return SHAPEOF;
125 texture return TEXTURE;
127 NORTHEAST return NORTHEAST;
129 SOUTHEAST return SOUTHEAST;
131 SOUTHWEST return SOUTHWEST;
133 NORTHWEST return NORTHWEST;
135 UNCHANGED return UNCHANGED;
137 0x[0-9A-Z]+ yylval->integer = strtol(yytext, (char **)NULL, 16); return NUMBER;
138 [0-9]+ yylval->integer = atoi(yytext); return NUMBER;
139 [a-zA-Z_][a-zA-Z0-9_]* yylval->string = g_strdup(yytext); return ID;
141 yylval->string = g_strdup(yytext+1);
142 yylval->string[strlen(yylval->string)-1] = 0;
146 yylval->string = g_strdup(yytext+1);
147 yylval->string[strlen(yylval->string)-1] = 0;
151 \$[a-zA-Z_][a-zA-Z0-9_]* yylval->string = g_strdup(yytext+1); return ID;
152 \$[0-9]* yylval->integer = strtol(yytext + 1, (char **)NULL, 16); return SUBST;
162 "<-" return LEFT_ARROW;
163 "->" return RIGHT_ARROW;
164 "<->" return DOUBLE_ARROW;
165 \n LINE++; /* zap EOL */
166 [ \t]+ ; /* and whitespace */