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