1 1.2 christos #!/usr/bin/awk -f 2 1.1 christos # vile: awkmode 3 1.1 christos function noident(given) { 4 1.1 christos gsub(/\$/,"@", given); 5 1.1 christos return given; 6 1.1 christos } 7 1.1 christos BEGIN { havesection = 0; 8 1.2 christos version = "Id: skel2c,v 1.4 2016/06/07 00:26:09 tom Exp "; 9 1.1 christos nsec = 0; 10 1.1 christos ifdef = ""; 11 1.1 christos printf "/* This file generated automatically using\n * %s\n */\n\n", 12 1.1 christos noident(version); 13 1.1 christos } 14 1.1 christos /[$]Id[:][^$]*[$]/ { 15 1.1 christos printf "%s\n", noident($0); 16 1.1 christos next; 17 1.1 christos } 18 1.1 christos /^%% *insert *VERSION *here/ { 19 1.1 christos printf " CONCAT1(\"#define YYMAJOR \", YYMAJOR),\n"; 20 1.1 christos printf " CONCAT1(\"#define YYMINOR \", YYMINOR),\n"; 21 1.1 christos printf "#ifdef YYPATCH\n"; 22 1.1 christos printf " CONCAT1(\"#define YYPATCH \", YYPATCH),\n"; 23 1.1 christos printf "#endif\n"; 24 1.1 christos next; 25 1.1 christos } 26 1.1 christos /^%%ifdef/ { 27 1.1 christos if (NF >= 2) { 28 1.1 christos printf "#if defined(%s)\n", $2; 29 1.1 christos printf " \"#if %s\",\n", $2; 30 1.1 christos } else { 31 1.1 christos _abort_exit = 1; 32 1.1 christos printf "skel2c: ill-formed %%ifdef in skeleton file on line %d\n", FNR > "/dev/stderr"; 33 1.1 christos exit 2; 34 1.1 christos } 35 1.1 christos if (ifdef != "") { 36 1.1 christos printf "skel2c: nested %%ifdef in skeleton file on line %d\n", FNR > "/dev/stderr"; 37 1.1 christos exit 2; 38 1.1 christos } 39 1.1 christos ifdef = $2; 40 1.1 christos next; 41 1.1 christos } 42 1.1 christos /^%%endif/ { 43 1.1 christos if (ifdef != "") { 44 1.1 christos if (NF >= 2) { 45 1.1 christos printf " \"#endif /* %s */\",\n", $2; 46 1.2 christos printf "#endif\t\t\t/* defined(%s) */\n", $2; 47 1.1 christos } else { 48 1.1 christos printf " \"#endif /* %s */\",\n", ifdef; 49 1.2 christos printf "#endif\t\t\t/* defined(%s) */\n", ifdef; 50 1.1 christos } 51 1.1 christos ifdef = ""; 52 1.1 christos } else { 53 1.1 christos printf " \"#endif\",\n"; 54 1.1 christos printf "#endif\n"; 55 1.1 christos printf "skel2c: unmatched %endif in skeleton file on line %d\n", FNR > "/dev/stderr"; 56 1.1 christos exit 2; 57 1.1 christos } 58 1.1 christos next; 59 1.1 christos } 60 1.1 christos /^%%/ { if (havesection) { 61 1.1 christos printf " 0\n};\n\n"; 62 1.1 christos } 63 1.1 christos if (NF >= 2) { 64 1.1 christos havesection = 1; 65 1.1 christos section = $2; 66 1.1 christos seclist[nsec] = section; 67 1.1 christos nsec = nsec + 1; 68 1.1 christos printf "const char *const %s[] =\n{\n", $2; 69 1.1 christos } else { 70 1.1 christos havesection = 0; 71 1.1 christos } 72 1.1 christos next; 73 1.1 christos } 74 1.1 christos { if (havesection) { 75 1.1 christos # Could use 'gsub(/\\/, "\\\\")' instead of the following 76 1.1 christos # two lines, but there's a bug in mawk and the original 77 1.1 christos # awk (not in gawk) which is triggered by that. 78 1.1 christos gsub(/\\/, "\\\1"); 79 1.1 christos gsub(/\1/, "\\"); 80 1.1 christos # gsub(/\t/, "\\t"); # change '\t' to "\\t" 81 1.1 christos gsub(/\"/, "\\\""); 82 1.1 christos printf " \"%s\",\n", $0; 83 1.1 christos } else { 84 1.1 christos print $0; 85 1.1 christos } 86 1.1 christos } 87 1.1 christos END { if (_abort_exit) 88 1.1 christos exit 2; 89 1.1 christos if (havesection) { 90 1.1 christos print " 0\n};\n"; 91 1.1 christos } 92 1.1 christos if (nsec > 0) { 93 1.1 christos print "void"; 94 1.1 christos print "write_section(FILE * fp, const char *const section[])"; 95 1.1 christos print "{"; 96 1.1 christos print " int i;"; 97 1.1 christos print " const char *s;\n"; 98 1.1 christos print " for (i = 0; (s = section[i]) != 0; ++i)"; 99 1.1 christos print " {"; 100 1.1 christos print "\tif (fp == code_file)"; 101 1.1 christos print "\t ++outline;"; 102 1.1 christos print "\tfprintf(fp, \"%s\\n\", s);"; 103 1.1 christos print " }"; 104 1.1 christos print "}"; 105 1.1 christos } else { 106 1.1 christos print "skel2c: no sections defined in skeleton file" > "/dev/stderr"; 107 1.1 christos exit 2; 108 1.1 christos } 109 1.1 christos if (ifdef != "") { 110 1.1 christos printf "skel2c: unmatched %%ifdef %s at end of skeleton file\n", $ifdef > "/dev/stderr"; 111 1.1 christos exit 2; 112 1.1 christos } 113 1.1 christos } 114