]> CyberLeo.Net >> Repos - FreeBSD/stable/10.git/blob - contrib/byacc/skel2c
MFC r368207,368607:
[FreeBSD/stable/10.git] / contrib / byacc / skel2c
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       }