11 #include "obtheme.tab.h"
13 int yylex(YYSTYPE *yylval, struct parser_control *pc);
15 void obthemeerror(struct parser_control *pc, char *s)
17 printf("Parse error in file %s on line %d\n%s"
18 , pc->currfile[pc->include_stack_ptr]
19 , pc->currline[pc->include_stack_ptr] + 1
23 extern int parserparse(void *);
30 int obtheme_parse(struct obthemedata *td, const char *filename)
34 struct parser_control *pc;
37 input = fopen(filename, "r");
43 pc->include_stack_ptr = 0;
44 pc->currline[pc->include_stack_ptr] = 0;
45 strncpy(pc->currfile[pc->include_stack_ptr], filename, 500);
46 ret = obthemeparse(pc);
48 //XXX I THINK I NEED TO CLOSE ALL INCLUDE FILES HERE
49 //probably also fclose input and call parser_finish?
63 <incl>[ \t]* /* eat the whitespace */
64 <incl>[^ \t\n]+ { /* got the include file name */
66 if ( pc->include_stack_ptr >= MAX_INCLUDE_DEPTH) {
67 fprintf( stderr, "Includes nested too deeply" );
71 pc->include_stack[pc->include_stack_ptr++] = YY_CURRENT_BUFFER;
72 incfile = malloc(strlen(yytext) + strlen("include/")+ 1);
73 strcpy(incfile, "include/");
74 strcat(incfile, yytext);
75 yyin = fopen( incfile, "r" );
77 strncpy(pc->currfile[pc->include_stack_ptr], yytext, 500);
78 pc->currline[pc->include_stack_ptr] = 0;
80 printf("Could not find include file %s (%s)\n", yytext, incfile);
83 yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
89 if ( --(pc->include_stack_ptr) < 0 )
91 yy_delete_buffer(YY_CURRENT_BUFFER);
97 yy_delete_buffer( YY_CURRENT_BUFFER );
100 pc->include_stack[pc->include_stack_ptr] );
108 <comment>"*"+[^*/\n]* ;
109 <comment>"*"+"/" BEGIN(INITIAL);
116 geometry return GEOMETRY;
117 material return MATERIAL;
118 gradient return GRADIENT;
119 context return CONTEXT;
120 cursor return CURSOR;
123 anchor return ANCHOR;
124 opacity return OPACITY;
125 shapeof return SHAPEOF;
126 texture return TEXTURE;
131 NORTHEAST return NORTHEAST;
133 SOUTHEAST return SOUTHEAST;
135 SOUTHWEST return SOUTHWEST;
137 NORTHWEST return NORTHWEST;
139 UNCHANGED return UNCHANGED;
141 0x[0-9A-Z]+ yylval->integer = strtol(yytext, (char **)NULL, 16); return NUMBER;
142 [0-9]+ yylval->integer = atoi(yytext); return NUMBER;
143 [a-zA-Z_][a-zA-Z0-9_]* yylval->string = g_strdup(yytext); return ID;
145 yylval->string = g_strdup(yytext+1);
146 yylval->string[strlen(yylval->string)-1] = 0;
150 yylval->string = g_strdup(yytext+1);
151 yylval->string[strlen(yylval->string)-1] = 0;
155 \$[a-zA-Z_][a-zA-Z0-9_]* yylval->string = g_strdup(yytext+1); return ID;
156 \$[0-9]* yylval->integer = strtol(yytext + 1, (char **)NULL, 16); return SUBST;
166 "<-" return LEFT_ARROW;
167 "->" return RIGHT_ARROW;
168 "<->" return DOUBLE_ARROW;
173 \n LINE++; /* zap EOL */
174 [ \t]+ ; /* and whitespace */