Command built-in can parse output into list (no need to Match it now)
[k8jam.git] / mkjambase.c
blob4d607cfa551bc73c612eccd37474ef38541ac5e9
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;
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 char *p = buf;
70 /* strip leading whitespace. */
71 while (*p && *((unsigned char *)p) <= ' ') p++;
72 /* drop comments and empty lines. */
73 if (*p == '#' || !*p) continue;
74 /* copy; drop comments if # is not in quotes */
75 outp = outbuf; quoteCh = 0; wasScreen = 0;
76 EMIT('"');
77 for (; *p && *p != '\n' && *p != '\r'; p++) {
78 if (!quoteCh && !wasScreen && *p == '#') break; /* comment follows; drop it */
79 switch (*p) {
80 case '\\':
81 EMIT('\\'); EMIT('\\');
82 wasScreen = !wasScreen;
83 break;
84 case '"':
85 EMIT('\\'); EMIT('"');
86 if (!wasScreen) quoteCh = (quoteCh==*p)?0:*p;
87 break;
88 case '\x27': /* ' */
89 EMIT('\x27');
90 if (!wasScreen) quoteCh = (quoteCh==*p)?0:*p;
91 break;
92 default:
93 EMIT(*p);
94 wasScreen = 0;
95 break;
98 /* terminate output */
99 *outp = '\0';
100 /* strip ending whitespace */
101 e = outp-1;
102 while (e >= outbuf && *((unsigned char *)e) <= ' ') e--;
103 *(++e) = '\0';
104 /* drop empty line */
105 if (!outbuf[0]) continue;
106 fprintf(fout, "%s\\n\",\n", outbuf);
107 } else fprintf(fout, "%s", buf);
109 fclose(fin);
111 if (doDotC) fprintf(fout, "0};\n");
113 fclose(fout);
115 return 0;