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