# vile: awkmode function noident(given) { gsub(/\$/,"@", given); return given; } BEGIN { havesection = 0; version = "$Id: skel2c,v 1.3 2014/04/06 19:48:04 tom Exp $"; nsec = 0; ifdef = ""; printf "/* This file generated automatically using\n * %s\n */\n\n", noident(version); } /[$]Id[:][^$]*[$]/ { printf "%s\n", noident($0); next; } /^%% *insert *VERSION *here/ { printf " CONCAT1(\"#define YYMAJOR \", YYMAJOR),\n"; printf " CONCAT1(\"#define YYMINOR \", YYMINOR),\n"; printf "#ifdef YYPATCH\n"; printf " CONCAT1(\"#define YYPATCH \", YYPATCH),\n"; printf "#endif\n"; next; } /^%%ifdef/ { if (NF >= 2) { printf "#if defined(%s)\n", $2; printf " \"#if %s\",\n", $2; } else { _abort_exit = 1; printf "skel2c: ill-formed %%ifdef in skeleton file on line %d\n", FNR > "/dev/stderr"; exit 2; } if (ifdef != "") { printf "skel2c: nested %%ifdef in skeleton file on line %d\n", FNR > "/dev/stderr"; exit 2; } ifdef = $2; next; } /^%%endif/ { if (ifdef != "") { if (NF >= 2) { printf " \"#endif /* %s */\",\n", $2; printf "#endif /* defined(%s) */\n", $2; } else { printf " \"#endif /* %s */\",\n", ifdef; printf "#endif /* defined(%s) */\n", ifdef; } ifdef = ""; } else { printf " \"#endif\",\n"; printf "#endif\n"; printf "skel2c: unmatched %endif in skeleton file on line %d\n", FNR > "/dev/stderr"; exit 2; } next; } /^%%/ { if (havesection) { printf " 0\n};\n\n"; } if (NF >= 2) { havesection = 1; section = $2; seclist[nsec] = section; nsec = nsec + 1; printf "const char *const %s[] =\n{\n", $2; } else { havesection = 0; } next; } { if (havesection) { # Could use 'gsub(/\\/, "\\\\")' instead of the following # two lines, but there's a bug in mawk and the original # awk (not in gawk) which is triggered by that. gsub(/\\/, "\\\1"); gsub(/\1/, "\\"); # gsub(/\t/, "\\t"); # change '\t' to "\\t" gsub(/\"/, "\\\""); printf " \"%s\",\n", $0; } else { print $0; } } END { if (_abort_exit) exit 2; if (havesection) { print " 0\n};\n"; } if (nsec > 0) { print "void"; print "write_section(FILE * fp, const char *const section[])"; print "{"; print " int i;"; print " const char *s;\n"; print " for (i = 0; (s = section[i]) != 0; ++i)"; print " {"; print "\tif (fp == code_file)"; print "\t ++outline;"; print "\tfprintf(fp, \"%s\\n\", s);"; print " }"; print "}"; } else { print "skel2c: no sections defined in skeleton file" > "/dev/stderr"; exit 2; } if (ifdef != "") { printf "skel2c: unmatched %%ifdef %s at end of skeleton file\n", $ifdef > "/dev/stderr"; exit 2; } }