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