diff options
Diffstat (limited to 'compil.lex')
-rw-r--r-- | compil.lex | 85 |
1 files changed, 79 insertions, 6 deletions
@@ -1,4 +1,12 @@ #include <string.h> + /* Waiting for Window */ +%s WW + /* Waiting for Window Y */ +%s WWY + /* Waiting for Window W */ +%s WWW + /* Waiting for Window H */ +%s WWH /* In text block */ %s I /* In port block */ @@ -21,14 +29,21 @@ int arg1 = 0; int errstate = 0; int got_ptr = 0; + int current_ptr = 0; const int max_tagsize = 64; char unknown_tag[65]; - char * unknown_tag_ptr; + char * unknown_tag_ptr = unknown_tag; int in_unknown_tag = 0; + struct window { + int t, x, y, w, h; + }; + + struct window windows[8192]; + %% <INITIAL>"<roomscripts>" { @@ -42,12 +57,54 @@ } <I>"\n\n<ptr n=\""[[:digit:]]+"\" room=\""[^\"]*"\"/>\n" { - int d = atoi(yytext + 10); + current_ptr = atoi(yytext + 10); if (got_ptr) { fprintf(yyout, "\x5d\x5d },\n"); } - fprintf(yyout, " [%i] = { \x5b\x5b", d); + fprintf(yyout, " [%i] = { \x5b\x5b", current_ptr); got_ptr = 1; + BEGIN(WW); + } + +<WW>"<nowindowdetected/>\n" { + BEGIN(I); + } + +<WW>"<window type=\"fixed\"/>\n" { + windows[current_ptr].t = 3; + BEGIN(I); + } + +<WW>"<window x=\""[[:digit:]]+"\" " { + int d = atoi(yytext + 11); + windows[current_ptr].t = 1; + windows[current_ptr].x = d; + BEGIN(WWY); + } + +<WW>"<window x=\"var\" y=\""[[:digit:]]+"\" " { + int d = atoi(yytext + 19); + windows[current_ptr].t = 2; + windows[current_ptr].y = d; + BEGIN(WWW); + } + +<WWY>"y=\""[[:digit:]]+"\" " { + int d = atoi(yytext + 3); + windows[current_ptr].y = d; + BEGIN(WWW); + } + +<WWW>"width=\""[[:digit:]]+"\" " { + int d = atoi(yytext + 7); + windows[current_ptr].w = d; + BEGIN(WWH); + } + +<WWH>"height=\""[[:digit:]]+"\"/>" { + int d = atoi(yytext + 8); + windows[current_ptr].h = d; + BEGIN(I); } <I>"\n<new/>\n" { @@ -172,7 +229,22 @@ } <I>"</roomscripts>\n" { - fprintf(yyout, "\x5d\x5d}\n}\n"); + int i; + fprintf(yyout, "\x5d\x5d}\n}\n\nwindows_data = {\n"); + for (i = 0; i < 8192; i++) { + switch (windows[i].t) { + case 1: + fprintf(yyout, " [%i] = { x = \"%i\", y = \"%i\", width = \"%i\", height = \"%i\" },\n", i, windows[i].x, windows[i].y, windows[i].w, windows[i].h); + break; + case 2: + fprintf(yyout, " [%i] = { x = \"var\", y = \"%i\", width = \"%i\", height = \"%i\" },\n", i, windows[i].y, windows[i].w, windows[i].h); + break; + case 3: + fprintf(yyout, " [%i] = { wtype = \"fixed\" },\n", current_ptr); + break; + } + } + fprintf(yyout, "}\n"); BEGIN(E); } @@ -180,7 +252,7 @@ if (*yytext == '<') { in_unknown_tag = 1; unknown_tag_ptr = unknown_tag; - } else if (*yytext == '>') { + } else if ((*yytext == '>') && in_unknown_tag) { *unknown_tag_ptr = 0; fprintf(stderr, "Got an unknown tag: %s\n", unknown_tag); in_unknown_tag = 0; @@ -194,7 +266,7 @@ } . { - fprintf(stderr, "Hu uh, something's wrong...\n"); + fprintf(stderr, "Hu uh, something's wrong... unexpected %s\n", yytext); } %% @@ -218,6 +290,7 @@ int main(int argc, char ** argv) { exit(-1); } } + memset(windows, 0, sizeof(windows)); fprintf(stderr, "Creating file %s\n", argv[1]); yylex(); exit(errstate ? -1 : 0); |