6 extern int getopt(int, char **, char *);
26 "ifdef", KIFDEF, ISKW,
27 "ifndef", KIFNDEF, ISKW,
30 "endif", KENDIF, ISKW,
31 "include", KINCLUDE, ISKW,
32 "define", KDEFINE, ISKW,
33 "undef", KUNDEF, ISKW,
35 "error", KERROR, ISKW,
36 "warning", KWARNING, ISKW, // extension to ANSI
37 "pragma", KPRAGMA, ISKW,
39 "defined", KDEFINED, ISDEFINED+ISUNCHANGE,
40 "__LINE__", KLINENO, ISMAC+ISUNCHANGE,
41 "__FILE__", KFILE, ISMAC+ISUNCHANGE,
42 "__DATE__", KDATE, ISMAC+ISUNCHANGE,
43 "__TIME__", KTIME, ISMAC+ISUNCHANGE,
44 "__STDC__", KSTDC, ISUNCHANGE,
48 unsigned long namebit[077+1];
52 setup(int argc, char **argv)
64 static Token deftoken[1] = {{ NAME, 0, 0, 0, 7, (uchar*)"defined" }};
65 static Tokenrow deftr = { deftoken, deftoken, deftoken+1, 1 };
70 for (kp=kwtab; kp->kw; kp++) {
72 t.len = strlen(kp->kw);
76 if (np->val == KDEFINED) {
84 * For Plan 9, search /objtype/include, then /sys/include
85 * (Note that includelist is searched from high end to low)
87 if ((objtype = getenv("objtype"))){
88 snprintf(nbuf, sizeof nbuf, "/%s/include", objtype);
89 includelist[1].file = nbuf;
90 includelist[1].always = 1;
92 includelist[1].file = NULL;
93 error(WARNING, "Unknown $objtype");
95 if (getwd(wd, sizeof(wd))==0)
97 includelist[0].file = "/sys/include";
98 includelist[0].always = 1;
99 firstinclude = NINCLUDE-2;
100 if ((includeenv=getenv("include")) != NULL) {
102 includeenv = strdup(includeenv);
103 for (;firstinclude>0; firstinclude--) {
104 cp = strtok(includeenv, " ");
107 includelist[firstinclude].file = cp;
108 includelist[firstinclude].always = 1;
112 setsource("", -1, 0);
115 for (i=0; i<NINCLUDE; i++)
116 if (includelist[i].always==1)
117 includelist[i].deleted = 1;
120 for (i=firstinclude; i>=0; i--) {
121 if (includelist[i].file==NULL) {
122 includelist[i].always = 1;
123 includelist[i].file = ARGF();
128 error(WARNING, "Too many -I directives");
132 setsource("<cmdarg>", -1, ARGF());
133 maketokenrow(3, &tr);
135 doadefine(&tr, ARGC());
158 error(FATAL, "Unknown argument '%s'", xx);
165 if ((fp = strrchr(argv[0], '/')) != NULL) {
166 int len = fp - argv[0];
167 dp = (char*)newstring((uchar*)argv[0], len+1, 0);
170 fp = (char*)newstring((uchar*)argv[0], strlen(argv[0]), 0);
171 if ((fd = open(fp, 0)) < 0)
172 error(FATAL, "Can't open input file %s", fp);
175 int fdo = create(argv[1], 1, 0666);
177 error(FATAL, "Can't open output file %s", argv[1]);
182 includelist[NINCLUDE-1].always = 0;
183 includelist[NINCLUDE-1].file = dp;
185 includelist[NINCLUDE-1].deleted = 1;
186 setsource(fp, fd, NULL);
188 for (i=0; i<NINCLUDE; i++)
189 if (includelist[i].file && includelist[i].deleted==0)
190 error(WARNING, "Include: %s", includelist[i].file);
195 lookup(Token *tp, int install)
202 for (cp=tp->t, cpe=cp+tp->len; cp<cpe; )
207 if (*tp->t==*np->name && tp->len==np->len
208 && strncmp((char*)tp->t, (char*)np->name, tp->len)==0)
219 np->name = newstring(tp->t, tp->len, 0);
222 quickset(tp->t[0], tp->len>1? tp->t[1]:0);