diff options
Diffstat (limited to 'compil.lex')
-rw-r--r-- | compil.lex | 203 |
1 files changed, 203 insertions, 0 deletions
diff --git a/compil.lex b/compil.lex new file mode 100644 index 0000000..ad24a2c --- /dev/null +++ b/compil.lex @@ -0,0 +1,203 @@ + #include <string.h> + /* In text block */ +%s I + /* In port block */ +%s P + /* In unknown 1 block */ +%s U1 + /* In unknown 2 block, arg1 */ +%s U21 + /* In unknown 2 block, arg2 */ +%s U22 + /* Script ended */ +%s E + + void putcode(int); + void putcode1(int, int); + void putcode2(int, int, int); + int cmd = 0; + int arg1 = 0; + int errstate = 0; + int got_ptr = 0; + +%% + +<INITIAL>"<roomscripts>" { + fprintf(yyout, "rooms_txts = {\n"); + BEGIN(I); + } + +<INITIAL>.* { + fprintf(stderr, "Invalid file, must begin with <roomscripts>\n"); + errstate = 1; + } + +<I>"\n\n<ptr n=\""[[:digit:]]+"\" room=\""[^\"]*"\"/>\n" { + int d = atoi(yytext + 10); + if (got_ptr) { + fprintf(yyout, "\x5d\x5d },\n"); + } + fprintf(yyout, " [%i] = { \x5b\x5b", d); + got_ptr = 1; + } + +<I>"\n<new/>\n" { + putcode(1); + } + +<I>"<rspd/>" { + putcode1(3, 255); + } + +<I>"<st spd=\""[[:digit:]]+"\"/>" { + int d = atoi(yytext + 9); + putcode1(3, d); + } + +<I>"<st clr=\""[[:digit:]]+"\"/>" { + int d = atoi(yytext + 9); + putcode1(4, d); + } + +<I>"<start/>" { + putcode(5); + } + +<I>"<rrep/>" { + putcode1(7, 1); + } + +<I>"<st rep=\""[[:digit:]]+"\"/>" { + int d = atoi(yytext + 9); + putcode1(7, d); + } + +<I>"<rsiz/>" { + putcode1(8, 1); + } + +<I>"<st siz=\""[[:digit:]]+"\"/>" { + int d = atoi(yytext + 9); + putcode1(8, d); + } + +<I>"<dport/>" { + putcode2(19, 255, 255); + } + +<I>"<port a1=\""[[:digit:]]+"\" " { + arg1 = atoi(yytext + 10); + BEGIN(P); + } + +<P>"a2=\""[[:digit:]]+"\"/>" { + int d = atoi(yytext + 4); + putcode2(19, arg1, d); + BEGIN(I); + } + +<I>"<var n=\""[[:digit:]]+"\"/>" { + int d = atoi(yytext + 8); + putcode1(14, d); + } + +<I>"<uk c=\""[[:digit:]]+"\"/>" { + int d = atoi(yytext + 7); + putcode(d); + } + +<I>"<u1 c=\""[[:digit:]]+"\" " { + cmd = atoi(yytext + 7); + BEGIN(U1); +} + +<U1>"a1=\""[[:digit:]]+"\"/>" { + int d = atoi(yytext + 4); + putcode1(cmd, d); + BEGIN(I); +} + +<I>"<u2 c=\""[[:digit:]]+"\" " { + cmd = atoi(yytext + 7); + BEGIN(U21); +} + +<U21>"a1=\""[[:digit:]]+"\" " { + arg1 = atoi(yytext + 4); + BEGIN(U22); +} + +<U22>"a2=\""[[:digit:]]+"\"/>" { + int d = atoi(yytext + 4); + putcode2(cmd, arg1, d); + BEGIN(I); +} + +<I>"\n" { + putcode(0); + } + +<I>"</roomscripts>\n" { + fprintf(yyout, "\x5d\x5d}\n}\n"); + BEGIN(E); + } + +<I>"abcdef<"[^\>\n]*"/>" { + yytext[strlen(yytext) - 2] = 0; + fprintf(stderr, "Error: Invalid command: '%s'\n", yytext + 1); + errstate = 1; + } + +<I>. { + fputc(*yytext, yyout); + } + +. { + fprintf(stderr, "Hu uh, something's wrong...\n"); + } + +%% + +int yywrap(void) { + exit(errstate ? -1 : 0); +} + +int main(int argc, char ** argv) { + if ((argc < 2) || (argc > 3)) { + fprintf(stderr, "Usage: %s <output> [input]\n", argv[0]); + exit(-1); + } + if (!(yyout = fopen(argv[1], "wb"))) { + fprintf(stderr, "Error: can't open file %s\n", argv[1]); + exit(-1); + } + if (argc == 3) { + if (!(yyin = fopen(argv[2], "rb"))) { + fprintf(stderr, "Error: can't open file %s\n", argv[2]); + exit(-1); + } + } + fprintf(stderr, "Creating file %s\n", argv[1]); + yylex(); + exit(errstate ? -1 : 0); +} + +void unputs(char * s) { + int l = strlen(s), i; + + for (i = l - 1; i >= 0; i--) { + unput(s[i]); + } +} + +void putcode(int code) { + fprintf(yyout, "\x5d\x5d, { %i }, \x5b\x5b", code); +} + +void putcode1(int code, int arg) { + fprintf(yyout, "\x5d\x5d, { %i, %i }, \x5b\x5b", code, arg); +} + +void putcode2(int code, int arg1, int arg2) { + fprintf(yyout, "\x5d\x5d, { %i, %i, %i }, \x5b\x5b", code, arg1, arg2); +} |