|
|
1.1 root 1: /*
2: * cpp/cpp.c
3: * Run cc0 (from LIBPATH under GEMDOS) for old cpp functionality.
4: * Default to stdin and stdout.
5: * See usage() for details.
6: * v0 -- dag 870722
7: * v1 -- steve 870730 COHERENT and MSDOS conditionalization
8: * v2 -- steve 920716 -C and -P options
9: * v4.0 -- steve 930128 -VCPLUS option
10: */
11:
12: #include <stdio.h>
13: #include <path.h>
14: #include "var.h"
15: #include "varmch.h"
16:
17: #define NEWCPP 1 /* must be 0 to compile using old cpp */
18: /* because it does not understand "string1" "string2" */
19:
20: #define VERSION "4.0"
21:
22: #if COHERENT
23: #define CC0NAME "cc0"
24: extern char **environ;
25: extern char *getenv();
26: #endif
27:
28: #if GEMDOS
29: #define CC0NAME "cc0.prg"
30: extern char **environ;
31: extern char *getenv();
32: #endif
33:
34: #if MSDOS
35: #define CC0NAME "cc0"
36: extern char *malloc();
37: extern char *strcat();
38: #endif
39:
40: /* Forward. */
41: void usage();
42: void cpperror();
43:
44: /* Globals. */
45: int cppargc;
46: char *cppargs[128];
47: VARIANT variant;
48: int verbose = 0;
49: char vstr[2*VMAXIM/VGRANU + 1];
50:
51: main(argc, argv) int argc; char *argv[];
52: {
53: register char *ap;
54: register int i, s;
55: #if GEMDOS || COHERENT
56: char *libptr;
57: #endif
58: #if MSDOS
59: register int len;
60: register char *tail;
61: #endif
62:
63: #if COHERENT
64: _addargs("CPP", &argc, &argv);
65: #endif
66:
67: cppargc = 4;
68: setvariant(VCPP);
69: argc--;
70: while (argc-- > 0) {
71: ap = *++argv;
72: #if DEBUG
73: printf("%d: %s\n", argc, ap);
74: #endif
75: if (*ap == '-') {
76: switch (ap[1]) {
77: case 'I':
78: cppargs[cppargc++] = ap;
79: if (ap[2] == 0) {
80: if ((cppargs[cppargc++] = *++argv)
81: == NULL)
82: usage();
83: --argc;
84: }
85: break;
86:
87: case 'D':
88: case 'U':
89: cppargs[cppargc++] = ap;
90: break;
91:
92: case 'o':
93: if ((cppargs[3] = *++argv) == NULL)
94: usage();
95: --argc;
96: break;
97:
98: case 'C':
99: setvariant(VCPPC);
100: break;
101:
102: case 'E':
103: case 'P':
104: setvariant(VCPPE);
105: break;
106:
107: case 'Q':
108: verbose = 0;
109: setvariant(VQUIET);
110: break;
111:
112: case '3':
113: setvariant(V3GRAPH);
114: break;
115:
116: case 'V':
117: if (strcmp(&ap[2], "CPLUS") == 0) {
118: setvariant(VCPLUS);
119: break;
120: }
121: fprintf(stderr, "cpp: V%s\n", VERSION);
122: verbose++;
123: break;
124:
125: case '?':
126: default:
127: usage();
128: }
129: } else if (cppargs[2] != NULL) {
130: usage();
131: } else
132: cppargs[2] = ap;
133: }
134:
135: if (cppargs[2] == NULL)
136: cppargs[2] = "-";
137: if (cppargs[3] == NULL)
138: cppargs[3] = "-";
139:
140: #if GEMDOS || COHERENT
141: if ((libptr = getenv("LIBPATH")) == NULL)
142: libptr = DEFLIBPATH;
143: if ((ap = path(libptr, CC0NAME, AEXEC)) == NULL)
144: cpperror("cannot find cc0");
145: cppargs[0] = ap;
146: #endif
147: #if MSDOS
148: cppargs[0] = CC0NAME;
149: #endif
150: makvariant(vstr);
151: cppargs[1] = vstr;
152: if (verbose) {
153: for (i = 0; i<cppargc; i++)
154: printf("%s ", cppargs[i]);
155: printf("\n");
156: }
157: #if GEMDOS || COHERENT
158: if (s = execve(cppargs[0], cppargs, environ))
159: if (s < 0)
160: perror(cppargs[0]);
161: #endif
162: #if MSDOS
163: for (len=0, i=1; i<cppargc; i++)
164: len += strlen(cppargs[i]) + 1;
165: if ((tail = malloc(len)) == NULL)
166: cpperror("cannot allocate tail");
167: for (tail[0]='\0', i=1; i<cppargc; i++) {
168: strcat(tail, cppargs[i]);
169: if (i < cppargc-1)
170: strcat(tail, " ");
171: }
172: if ((s = execall(cppargs[0], tail)) == 0177)
173: cpperror("cannot execute cc0");
174: #endif
175: exit(s);
176: }
177:
178: void
179: usage()
180: {
181: fprintf(stderr, "Usage:\t/lib/cpp [ option... ] [ file ]\n");
182: #if NEWCPP
183: fprintf(stderr,
184: "Options:\n"
185: #if VCNEST
186: /* UNDOCUMENTED: -3 */
187: #endif
188: "\t-C\t\t\tdo not suppress comments\n"
189: "\t-Dvariable[=val]\tdefine variable with val [default=1]\n"
190: "\t-E\t\t\tstrip file line number information\n"
191: "\t-Idirectory\t\tadd directory to #include file search list\n"
192: "\t-o outfile\t\twrite output to outfile [default=stdout]\n"
193: "\t-P\t\t\tstrip file line number information (same as -E)\n"
194: "\t-Q\t\t\tsuppress all messages\n"
195: "\t-Uvariable\t\tundefine variable\n"
196: "\t-V\t\t\tprint verbose information\n"
197: "\t-VCPLUS\t\t\tsuppress C++ - style online comments\n"
198: );
199: #endif
200: exit(1);
201: }
202:
203: void
204: cpperror(s) char *s;
205: {
206: fprintf(stderr, "cpp: %s\n", s);
207: exit(1);
208: }
209:
210: /* end of cpp/cpp.c */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.