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