aboutsummaryrefslogtreecommitdiff
path: root/skel2c
blob: d979359265c92477c8dba67ea6df449fff3268ce (plain) (blame)
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;
	}
      }