-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathskel2c
112 lines (112 loc) · 2.81 KB
/
skel2c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# vile: awkmode
function noident(given) {
gsub(/\$/,"@", given);
return given;
}
BEGIN { havesection = 0;
version = "$Id: skel2c,v 1.4 2016/06/07 00:26:09 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\t\t\t/* defined(%s) */\n", $2;
} else {
printf " \"#endif /* %s */\",\n", ifdef;
printf "#endif\t\t\t/* 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;
}
}