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