windoze binary rebuilt with mingw-gcc-4.4
[k8jam.git] / mkjambase.c
blob6cdcb1238b7d0c7c7d29aea8d04c2f7eea51d632
1 /*
2 * Copyright 1993, 1995 Christopher Seiwald.
4 * This file is part of Jam - see jam.c for Copyright information.
5 */
7 /*
8 * mkjambase.c - turn Jambase into a big C structure
10 * Usage: mkjambase jambase.c Jambase ...
12 * Results look like this:
14 * char *jambase[] = {
15 * "...\n",
16 * ...
17 * 0 };
19 * Handles \'s and "'s specially; knows to delete blank and comment lines.
21 * 11/04/02 (seiwald) - const-ing for string literals
24 #include <stdio.h>
25 #include <string.h>
26 #include <error.h>
29 #define EMIT(ch) {if (outp-outbuf>2046) error(1, 0, "output line too big\n"); *(outp++) = (ch); }
32 int main (int argc, char **argv, char **envp) {
33 char buf[1024], outbuf[2048];
34 FILE *fin;
35 FILE *fout;
36 char *p, *e, quoteCh, *outp;
37 int doDotC = 0, wasScreen, dontStrip = 0;
39 if (argc < 3) {
40 fprintf(stderr, "usage: %s jambase.c Jambase ...\n", argv[0]);
41 return -1;
44 if (!(fout = fopen(argv[1], "w"))) {
45 perror(argv[1]);
46 return -1;
49 /* If the file ends in .c generate a C source file */
50 if ((p = strrchr(argv[1], '.')) && !strcmp(p, ".c")) doDotC++;
52 /* Now process the files */
53 argc -= 2, argv += 2;
55 if (doDotC) {
56 fprintf(fout, "/* Generated by mkjambase from Jambase */\n");
57 fprintf(fout, "const char *jambase[] = {\n");
60 for (; argc--; argv++) {
61 if (!(fin = fopen( *argv, "r"))) {
62 perror( *argv );
63 return -1;
65 if (doDotC) fprintf(fout, "/* %s */\n", *argv); else fprintf(fout, "### %s ###\n", *argv);
67 while (fgets(buf, sizeof(buf), fin)) {
68 if (doDotC) {
69 if (!strncmp(buf, "#DONT_TOUCH", 11)) {
70 dontStrip = !dontStrip;
71 continue;
73 char *p = buf;
74 /* strip leading whitespace */
75 if (!dontStrip) {
76 while (*p && *((unsigned char *)p) <= ' ') p++;
77 /* drop comments and empty lines */
78 if (*p == '#' || !*p) continue;
80 /* copy; drop comments if # is not in quotes */
81 outp = outbuf; quoteCh = 0; wasScreen = 0;
82 EMIT('"');
83 for (; *p && *p != '\n' && *p != '\r'; p++) {
84 if (!dontStrip) {
85 if (!quoteCh && !wasScreen && *p == '#') break; /* comment follows; drop it */
87 switch (*p) {
88 case '\\':
89 EMIT('\\'); EMIT('\\');
90 wasScreen = !wasScreen;
91 break;
92 case '"':
93 EMIT('\\'); EMIT('"');
94 if (!wasScreen) quoteCh = (quoteCh==*p)?0:*p;
95 break;
96 case '\x27': /* ' */
97 EMIT('\x27');
98 if (!wasScreen) quoteCh = (quoteCh==*p)?0:*p;
99 break;
100 default:
101 EMIT(*p);
102 wasScreen = 0;
103 break;
106 /* terminate output */
107 *outp = '\0';
108 if (!dontStrip) {
109 /* strip ending whitespace */
110 e = outp-1;
111 while (e >= outbuf && *((unsigned char *)e) <= ' ') e--;
112 *(++e) = '\0';
113 /* drop empty line */
114 if (!outbuf[0]) continue;
116 fprintf(fout, "%s\\n\",\n", outbuf);
117 } else fprintf(fout, "%s", buf);
119 fclose(fin);
121 if (doDotC) fprintf(fout, "0};\n");
123 fclose(fout);
125 return 0;