xref: /freebsd/contrib/byacc/skel2c (revision 242b24828472137ec4411826b86e753d49bd2c39)
10c8de5b0SBaptiste Daroussin# vile: awkmode
20c8de5b0SBaptiste Daroussinfunction noident(given) {
30c8de5b0SBaptiste Daroussin	gsub(/\$/,"@", given);
40c8de5b0SBaptiste Daroussin	return given;
50c8de5b0SBaptiste Daroussin}
60c8de5b0SBaptiste DaroussinBEGIN { havesection = 0;
7*c5b5d71aSJung-uk Kim	version = "$Id: skel2c,v 1.4 2016/06/07 00:26:09 tom Exp $";
80c8de5b0SBaptiste Daroussin	nsec = 0;
90c8de5b0SBaptiste Daroussin	ifdef = "";
100c8de5b0SBaptiste Daroussin	printf  "/* This file generated automatically using\n * %s\n */\n\n",
110c8de5b0SBaptiste Daroussin		noident(version);
120c8de5b0SBaptiste Daroussin      }
130c8de5b0SBaptiste Daroussin/[$]Id[:][^$]*[$]/ {
140c8de5b0SBaptiste Daroussin	printf "%s\n", noident($0);
150c8de5b0SBaptiste Daroussin	next;
160c8de5b0SBaptiste Daroussin      }
170c8de5b0SBaptiste Daroussin/^%% *insert *VERSION *here/ {
180c8de5b0SBaptiste Daroussin	printf "    CONCAT1(\"#define YYMAJOR \", YYMAJOR),\n";
190c8de5b0SBaptiste Daroussin	printf "    CONCAT1(\"#define YYMINOR \", YYMINOR),\n";
200c8de5b0SBaptiste Daroussin	printf "#ifdef YYPATCH\n";
210c8de5b0SBaptiste Daroussin	printf "    CONCAT1(\"#define YYPATCH \", YYPATCH),\n";
220c8de5b0SBaptiste Daroussin	printf "#endif\n";
230c8de5b0SBaptiste Daroussin	next;
240c8de5b0SBaptiste Daroussin      }
250c8de5b0SBaptiste Daroussin/^%%ifdef/ {
260c8de5b0SBaptiste Daroussin	if (NF >= 2) {
270c8de5b0SBaptiste Daroussin	    printf "#if defined(%s)\n", $2;
280c8de5b0SBaptiste Daroussin	    printf "    \"#if %s\",\n", $2;
290c8de5b0SBaptiste Daroussin	} else {
300c8de5b0SBaptiste Daroussin	    _abort_exit = 1;
310c8de5b0SBaptiste Daroussin	    printf "skel2c: ill-formed %%ifdef in skeleton file on line %d\n", FNR > "/dev/stderr";
320c8de5b0SBaptiste Daroussin	    exit 2;
330c8de5b0SBaptiste Daroussin	}
340c8de5b0SBaptiste Daroussin	if (ifdef != "") {
350c8de5b0SBaptiste Daroussin	    printf "skel2c: nested %%ifdef in skeleton file on line %d\n", FNR > "/dev/stderr";
360c8de5b0SBaptiste Daroussin	    exit 2;
370c8de5b0SBaptiste Daroussin	}
380c8de5b0SBaptiste Daroussin	ifdef = $2;
390c8de5b0SBaptiste Daroussin	next;
400c8de5b0SBaptiste Daroussin      }
410c8de5b0SBaptiste Daroussin/^%%endif/ {
420c8de5b0SBaptiste Daroussin	if (ifdef != "") {
430c8de5b0SBaptiste Daroussin	    if (NF >= 2) {
440c8de5b0SBaptiste Daroussin		printf "    \"#endif /* %s */\",\n", $2;
45*c5b5d71aSJung-uk Kim		printf "#endif\t\t\t/* defined(%s) */\n", $2;
460c8de5b0SBaptiste Daroussin	    } else {
470c8de5b0SBaptiste Daroussin		printf "    \"#endif /* %s */\",\n", ifdef;
48*c5b5d71aSJung-uk Kim		printf "#endif\t\t\t/* defined(%s) */\n", ifdef;
490c8de5b0SBaptiste Daroussin	    }
500c8de5b0SBaptiste Daroussin	    ifdef = "";
510c8de5b0SBaptiste Daroussin	} else {
520c8de5b0SBaptiste Daroussin	    printf "    \"#endif\",\n";
530c8de5b0SBaptiste Daroussin	    printf "#endif\n";
540c8de5b0SBaptiste Daroussin	    printf "skel2c: unmatched %endif in skeleton file on line %d\n", FNR > "/dev/stderr";
550c8de5b0SBaptiste Daroussin	    exit 2;
560c8de5b0SBaptiste Daroussin	}
570c8de5b0SBaptiste Daroussin	next;
580c8de5b0SBaptiste Daroussin      }
590c8de5b0SBaptiste Daroussin/^%%/ { if (havesection) {
600c8de5b0SBaptiste Daroussin	    printf "    0\n};\n\n";
610c8de5b0SBaptiste Daroussin	}
620c8de5b0SBaptiste Daroussin	if (NF >= 2) {
630c8de5b0SBaptiste Daroussin	    havesection = 1;
640c8de5b0SBaptiste Daroussin	    section = $2;
650c8de5b0SBaptiste Daroussin	    seclist[nsec] = section;
660c8de5b0SBaptiste Daroussin	    nsec = nsec + 1;
670c8de5b0SBaptiste Daroussin	    printf "const char *const %s[] =\n{\n", $2;
680c8de5b0SBaptiste Daroussin	} else {
690c8de5b0SBaptiste Daroussin	    havesection = 0;
700c8de5b0SBaptiste Daroussin	}
710c8de5b0SBaptiste Daroussin	next;
720c8de5b0SBaptiste Daroussin      }
730c8de5b0SBaptiste Daroussin      { if (havesection) {
740c8de5b0SBaptiste Daroussin	    # Could use 'gsub(/\\/, "\\\\")' instead of the following
750c8de5b0SBaptiste Daroussin	    # two lines, but there's a bug in mawk and the original
760c8de5b0SBaptiste Daroussin	    # awk (not in gawk) which is triggered by that.
770c8de5b0SBaptiste Daroussin	    gsub(/\\/, "\\\1");
780c8de5b0SBaptiste Daroussin	    gsub(/\1/, "\\");
790c8de5b0SBaptiste Daroussin#	    gsub(/\t/, "\\t"); # change '\t' to "\\t"
800c8de5b0SBaptiste Daroussin	    gsub(/\"/, "\\\"");
810c8de5b0SBaptiste Daroussin	    printf "    \"%s\",\n", $0;
820c8de5b0SBaptiste Daroussin	} else {
830c8de5b0SBaptiste Daroussin	    print $0;
840c8de5b0SBaptiste Daroussin	}
850c8de5b0SBaptiste Daroussin      }
860c8de5b0SBaptiste DaroussinEND   { if (_abort_exit)
870c8de5b0SBaptiste Daroussin	    exit 2;
880c8de5b0SBaptiste Daroussin	if (havesection) {
890c8de5b0SBaptiste Daroussin	    print "    0\n};\n";
900c8de5b0SBaptiste Daroussin	}
910c8de5b0SBaptiste Daroussin	if (nsec > 0) {
920c8de5b0SBaptiste Daroussin	    print "void";
930c8de5b0SBaptiste Daroussin	    print "write_section(FILE * fp, const char *const section[])";
940c8de5b0SBaptiste Daroussin	    print "{";
950c8de5b0SBaptiste Daroussin	    print "    int i;";
960c8de5b0SBaptiste Daroussin	    print "    const char *s;\n";
970c8de5b0SBaptiste Daroussin	    print "    for (i = 0; (s = section[i]) != 0; ++i)";
980c8de5b0SBaptiste Daroussin	    print "    {";
990c8de5b0SBaptiste Daroussin	    print "\tif (fp == code_file)";
1000c8de5b0SBaptiste Daroussin	    print "\t    ++outline;";
1010c8de5b0SBaptiste Daroussin	    print "\tfprintf(fp, \"%s\\n\", s);";
1020c8de5b0SBaptiste Daroussin	    print "    }";
1030c8de5b0SBaptiste Daroussin	    print "}";
1040c8de5b0SBaptiste Daroussin	} else {
1050c8de5b0SBaptiste Daroussin	    print "skel2c: no sections defined in skeleton file" > "/dev/stderr";
1060c8de5b0SBaptiste Daroussin	    exit 2;
1070c8de5b0SBaptiste Daroussin	}
1080c8de5b0SBaptiste Daroussin	if (ifdef != "") {
1090c8de5b0SBaptiste Daroussin	    printf "skel2c: unmatched %%ifdef %s at end of skeleton file\n", $ifdef > "/dev/stderr";
1100c8de5b0SBaptiste Daroussin	    exit 2;
1110c8de5b0SBaptiste Daroussin	}
1120c8de5b0SBaptiste Daroussin      }
113