From 361bb55f01ba28960a8127b0a16c1e7a7a8de61a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?John=20Ankarstr=C3=B6m?= Date: Fri, 17 Sep 2021 20:57:05 +0200 Subject: Rewrite mktpl script in C The Perl version didn't handle multiple interpolations on the same line. --- mktpl/mktpl.lex | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 mktpl/mktpl.lex (limited to 'mktpl/mktpl.lex') diff --git a/mktpl/mktpl.lex b/mktpl/mktpl.lex new file mode 100644 index 0000000..e530e45 --- /dev/null +++ b/mktpl/mktpl.lex @@ -0,0 +1,86 @@ +%x PRNT +%x EVAL + + #include + #include + #include + #include + + void apnd(); + void eval(); + void text(); + void prnt(); + + char *buf; + int len; + int sz; + +%% +(.|\n) apnd(); +\<%= text(); BEGIN(PRNT); +\<%[^=] text(); BEGIN(EVAL); + +. apnd(); +%\> prnt(); BEGIN(0); + +(.|\n) apnd(); +%\> eval(); BEGIN(0); + +<> prnt(); yyterminate(); +<> eval(); yyterminate(); +<> text(); yyterminate(); +%% + +int +main(int argc, char *argv[]) +{ + len = 0; + sz = 512; + if(!(buf = malloc(sz))) + err(1, "malloc"); + + yylex(); +} + +void +apnd() +{ + if(len+1 > sz){ + sz += 512; + if(!(buf = realloc(buf, sz))) + err(1, "realloc"); + } + + buf[len++] = *yytext; + buf[len+1] = 0; +} + +void +eval() +{ + printf("%s\n", buf); + len = 0; +} + +void +text() +{ + char *t; + + printf("printf(\""); + for(t = buf; *t; t++){ + if(*t == '\\') printf("\\\\"); + else if(*t == '"') printf("\\\""); + else if(*t == '\n') printf("\\n"); + else printf("%c", *t); + } + printf("\");\n"); + len = 0; +} + +void +prnt() +{ + printf("printf(\"%%s\", %s);\n", buf); + len = 0; +} \ No newline at end of file -- cgit v1.2.3