da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz* Copyright (c) 1986-2009 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* http://www.opensource.org/licenses/cpl1.0.txt *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Glenn Fowler <gsf@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#pragma prototyped
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Glenn Fowler
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * AT&T Research
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * preprocessor library control interface
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "pplib.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include "pptab.h"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <ls.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define REFONE (pp.truncate?(Hash_table_t*)0:pp.symtab)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define REFALL (pp.truncate?pp.dirtab:pp.symtab)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#define ppiskey(t,v,p) (p=t,v>=p->value&&value<=(p+elementsof(t)-2)->value)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * set option value
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * initialization files have lowest precedence
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinset(register long* p, register long op, int val)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin long* r;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin r = p == &pp.state ? &pp.ro_state : p == &pp.mode ? &pp.ro_mode : &pp.ro_option;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(pp.mode & INIT) || !(pp.in->type == IN_FILE) || !(*r & op))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!pp.initialized && !(pp.mode & INIT))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *r |= op;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (val)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *p |= op;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *p &= ~op;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin debug((-7, "set(%s)=%s", p == &pp.state ? "state" : p == &pp.mode ? "mode" : "option", p == &pp.state ? ppstatestr(*p) : p == &pp.mode ? ppmodestr(*p) : ppoptionstr(*p)));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * initialize hash table with keywords from key
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chininithash(register Hash_table_t* tab, register struct ppkeyword* key)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (; s = key->name; key++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!ppisid(*s))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hashput(tab, s, key->value);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * return ppkeyword table name given value
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinchar*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinppkeyname(register int value, int dir)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register struct ppkeyword* p;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (dir && ppiskey(directives, value, p) || !dir && (ppiskey(options, value, p) || ppiskey(predicates, value, p) || ppiskey(variables, value, p)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = (p + (value - p->value))->name;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return s + !ppisid(*s);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if DEBUG
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(PANIC, "no keyword table name for value=%d", value);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return "UNKNOWN";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * add to the include maps
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinvoid
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinppmapinclude(char* file, register char* s)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register int c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register struct ppdirs* dp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int fd;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int flags;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int index;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int token;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* old_file;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin long old_state;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct ppfile* fp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct ppfile* mp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin old_file = error_info.file;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin old_state = pp.state;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (s)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUSH_BUFFER("mapinclude", s, 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (file)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*file == '-')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!error_info.file)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(1, "%s: input file name required for %s ignore", file, dirname(INCLUDE));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = t = strcopy(pp.tmpbuf, error_info.file);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = *++file;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (;;)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (s <= pp.tmpbuf || *s == '/')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (*s == c)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin strcpy(s, file);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin file = pp.tmpbuf;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((fd = ppsearch(file, INC_LOCAL, SEARCH_INCLUDE)) < 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUSH_FILE(file, fd);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if CATSTRINGS
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.state |= (COMPILE|FILEPOP|HEADER|JOINING|STRIP|NOSPACE|PASSEOF);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.state |= (COMPILE|FILEPOP|HEADER|STRIP|NOSPACE|PASSEOF);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.level++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags = INC_MAPALL;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fp = mp = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (;;)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (token = pplex())
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 0:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case T_STRING:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case T_HEADER:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (fp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fp->guard = INC_IGNORE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (dp = pp.firstdir->next; dp; dp = dp->next)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (dp->name && (c = strlen(dp->name)) && !strncmp(dp->name, fp->name, c) && fp->name[c] == '/')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppsetfile(fp->name + c + 1)->guard = INC_IGNORE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!token)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pathcanon(pp.token, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fp = ppsetfile(pp.token);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (mp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mp->flags |= flags;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (streq(fp->name, "."))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mp->flags |= INC_MAPNOLOCAL;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin mp->bound[index] = fp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fp = mp = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin index = token == T_HEADER ? INC_STANDARD : INC_LOCAL;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '=':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(mp = fp))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(3, "%s: \"name\" = \"binding\" expected");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fp = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '\n':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case T_ID:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (streq(pp.token, "all"))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags = INC_MAPALL;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (streq(pp.token, "hosted"))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags = INC_MAPHOSTED;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (streq(pp.token, "nohosted"))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags = INC_MAPNOHOSTED;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin continue;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*FALLTHROUGH*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin default:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(3, "%s unexpected in %s map list", pptokstr(pp.token, 0), dirname(INCLUDE));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.level--;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error_info.file = old_file;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.state = old_state;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * return non-0 if file is identical to fd
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinidentical(char* file, int fd)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct stat a;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct stat b;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return !stat(file, &a) && !fstat(fd, &b) && a.st_dev == b.st_dev && a.st_ino == b.st_ino;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * compare up to pp.truncate chars
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * NOTE: __STD* and symbols containing ' ' are not truncated
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintrunccomp(register char* a, register char* b)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return !strchr(b, ' ') && !strneq(b, "__STD", 5) ? strncmp(a, b, pp.truncate) : strcmp(a, b);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * hash up to pp.truncate chars
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * NOTE: __STD* and symbols containing ' ' are not truncated
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic unsigned int
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chintrunchash(char* a)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return memhash(a, (n = strlen(a)) > pp.truncate && !strchr(a, ' ') && !strneq(a, "__STD", 5) ? pp.truncate : n);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if DEBUG & TRACE_debug
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * append context to debug trace
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chincontext(Sfio_t* sp, int level, int flags)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static int state;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin NoP(level);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin NoP(flags);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (error_info.trace <= -10 && pp.state != state)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin state = pp.state;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp, " %s", ppstatestr(pp.state));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * reset include guard
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinunguard(const char* name, char* v, void* handle)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register struct ppfile* fp = (struct ppfile*)v;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin fp->guard = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * reset macro definition
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic void
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinundefine(void* p)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct ppmacro* mac = ((struct ppsymbol*)p)->macro;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (mac)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (mac->formals)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin free(mac->formals);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin free(mac->value);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin free(mac);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * pp operations
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * NOTE: PP_INIT must be done before the first pplex() call
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * PP_DONE must be done after the last pplex() call
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * PP_INIT-PP_DONE must be done for each new PP_INPUT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinvoid
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinppop(int op, ...)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin{
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin va_list ap;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* p;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register struct ppkeyword* kp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin register char* s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin int c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin long n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin char* t;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct ppdirs* dp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct ppdirs* hp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct ppsymkey* key;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct oplist* xp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Sfio_t* sp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct stat st;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PPCOMMENT ppcomment;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PPLINESYNC pplinesync;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static int initialized;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin va_start(ap, op);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (op)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_ASSERT:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_DEFINE:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_DIRECTIVE:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_OPTION:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_READ:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_UNDEF:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.initialized)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto before;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((p = va_arg(ap, char*)) && *p)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.lastop)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.lastop = (pp.lastop->next = newof(0, struct oplist, 1, 0));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.firstop = pp.lastop = newof(0, struct oplist, 1, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.lastop->op = op;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.lastop->value = p;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_BUILTIN:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.builtin = va_arg(ap, PPBUILTIN);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_CDIR:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p = va_arg(ap, char*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = va_arg(ap, int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.cdir.path = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!p)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.c = c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (streq(p, "-"))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.c = c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (dp = pp.firstdir; dp; dp = dp->next)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dp->c = c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (!pp.c)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!*p || stat((pathcanon(p, 0), p), &st))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.c = c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (dp = pp.firstdir; dp; dp = dp->next)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!pp.c && (dp->c || dp->name && SAMEID(&dp->id, &st)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.c = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dp->c = pp.c == 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!pp.c)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.cdir.path = p;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SAVEID(&pp.cdir.id, &st);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_CHOP:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (p = va_arg(ap, char*))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = strlen(p);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xp = newof(0, struct oplist, 1, c + 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xp->value = ((char*)xp) + sizeof(struct oplist);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = xp->value;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = *p++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*p && *p != c)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = *p++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = '/';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xp->op = s - xp->value;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*p && *++p && *p != c)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*p && *p != c)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = *p++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = '/';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xp->next = pp.chop;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.chop = xp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_COMMENT:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.comment = va_arg(ap, PPCOMMENT))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.flags |= PP_comment;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.flags &= ~PP_comment;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_COMPATIBILITY:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&pp.state, COMPATIBILITY, va_arg(ap, int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if COMPATIBLE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.initialized)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppfsm(FSM_COMPATIBILITY, NiL);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.state & COMPATIBILITY)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(3, "preprocessor not compiled with compatibility dialect enabled [COMPATIBLE]");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.state & COMPATIBILITY)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.flags |= PP_compatibility;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.flags &= ~PP_compatibility;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_COMPILE:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.initialized)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto before;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.state |= COMPILE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!pp.symtab)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.symtab = hashalloc(NiL, HASH_name, "symbols", 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (kp = va_arg(ap, struct ppkeyword*))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (; s = kp->name; kp++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = SYM_LEX;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (*s)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '-':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '+':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(pp.option & PLUSPLUS))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*FALLTHROUGH*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin default:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n |= SYM_KEYWORD;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (key = ppkeyset(pp.symtab, s))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin key->sym.flags = n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin key->lex = kp->value;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_DEBUG:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error_info.trace = va_arg(ap, int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_DEFAULT:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (p = va_arg(ap, char*))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p = strdup(p);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.ppdefault)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin free(pp.ppdefault);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.ppdefault = p;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_DONE:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if CHECKPOINT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.mode & DUMP)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppdump();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.mode & FILEDEPS)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfputc(pp.filedeps.sp, '\n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.filedeps.sp == sfstdout)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfsync(pp.filedeps.sp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfclose(pp.filedeps.sp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.state & STANDALONE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((pp.state & (NOTEXT|HIDDEN)) == HIDDEN && pplastout() != '\n')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppputchar('\n');
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppflushout();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error_info.file = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_DUMP:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&pp.mode, DUMP, va_arg(ap, int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if !CHECKPOINT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.mode & DUMP)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(3, "preprocessor not compiled with checkpoint enabled [CHECKPOINT]");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_FILEDEPS:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (n = va_arg(ap, int))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.filedeps.flags |= n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.filedeps.flags = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_FILENAME:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error_info.file = va_arg(ap, char*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_HOSTDIR:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(pp.mode & INIT))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.ro_mode |= HOSTED;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (pp.ro_mode & HOSTED)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.ro_mode |= INIT;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p = va_arg(ap, char*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = va_arg(ap, int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.hostdir.path = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!p)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.hosted = c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (streq(p, "-"))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.initialized)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&pp.mode, HOSTED, c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.hosted = c ? 1 : 2;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (dp = pp.firstdir; dp; dp = dp->next)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.hosted == 1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dp->type |= TYPE_HOSTED;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dp->type &= ~TYPE_HOSTED;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (!pp.hosted)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!*p || stat((pathcanon(p, 0), p), &st))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.hosted = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (dp = pp.firstdir; dp; dp = dp->next)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!pp.hosted && ((dp->type & TYPE_HOSTED) || dp->name && SAMEID(&dp->id, &st)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.hosted = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.hosted == 1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dp->type |= TYPE_HOSTED;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dp->type &= ~TYPE_HOSTED;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!pp.hosted)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.hostdir.path = p;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SAVEID(&pp.hostdir.id, &st);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_ID:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p = va_arg(ap, char*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = va_arg(ap, int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (p)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppfsm(c ? FSM_IDADD : FSM_IDDEL, p);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_IGNORE:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (p = va_arg(ap, char*))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pathcanon(p, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppsetfile(p)->guard = INC_IGNORE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin message((-3, "%s: ignore", p));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_IGNORELIST:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.initialized)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto before;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.ignore = va_arg(ap, char*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_INCLUDE:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((p = va_arg(ap, char*)) && *p)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pathcanon(p, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (stat(p, &st))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (dp = pp.stddirs; dp = dp->next;)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (dp->name && SAMEID(&dp->id, &st))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.cdir.path && SAMEID(&pp.cdir.id, &st))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.cdir.path = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.c = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.hostdir.path && SAMEID(&pp.hostdir.id, &st))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.hostdir.path = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.hosted = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((pp.mode & INIT) && !(pp.ro_mode & INIT))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.hosted = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = dp && dp->c || pp.c == 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = dp && (dp->type & TYPE_HOSTED) || pp.hosted == 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!dp || dp == pp.lastdir->next)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (dp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = dp->c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = dp->type & TYPE_HOSTED;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dp = newof(0, struct ppdirs, 1, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dp->name = p;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SAVEID(&dp->id, &st);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dp->type |= TYPE_INCLUDE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dp->index = INC_LOCAL + pp.ignoresrc != 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dp->next = pp.lastdir->next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.lastdir = pp.lastdir->next = dp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dp->c = c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (n)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dp->type |= TYPE_HOSTED;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dp->type &= ~TYPE_HOSTED;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_INCREF:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.incref = va_arg(ap, PPINCREF);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_RESET:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.reset.on = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_INIT:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.initialized)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error_info.errors = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error_info.warnings = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * context initialization
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!initialized)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * out of malloc is fatal
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin memfatal();
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * initialize the error message interface
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error_info.version = (char*)pp.version;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if DEBUG & TRACE_debug
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error_info.auxilliary = context;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pptrace(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * initialize pplex tables
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppfsm(FSM_INIT, NiL);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * fixed macro stack size -- room for improvement
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.macp = newof(0, struct ppmacstk, DEFMACSTACK, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.macp->next = pp.macp + 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.maxmac = (char*)pp.macp + DEFMACSTACK;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin initialized = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * initial include/if control stack
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.control = newof(0, long, pp.constack, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.maxcon = pp.control + pp.constack - 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * validate modes
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (pp.arg_mode)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'a':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'C':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_COMPATIBILITY, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_TRANSITION, 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'A':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'c':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_COMPATIBILITY, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_STRICT, 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'f':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_COMPATIBILITY, 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_PLUSPLUS, 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_TRANSITION, 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'F':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_COMPATIBILITY, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_PLUSPLUS, 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'k':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 's':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_COMPATIBILITY, 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_STRICT, 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'o':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 'O':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_COMPATIBILITY, 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_TRANSITION, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case 't':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_COMPATIBILITY, 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_TRANSITION, 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin if (!(pp.state & WARN) && !(pp.arg_style & STYLE_gnu))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_PEDANTIC, 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.state & PASSTHROUGH)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.state & COMPILE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.state &= ~PASSTHROUGH;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(1, "passthrough ignored for compile");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_COMPATIBILITY, 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_HOSTDIR, "-", 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_SPACEOUT, 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&pp.state, DISABLE, va_arg(ap, int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * create the hash tables
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!pp.symtab)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.symtab = hashalloc(NiL, HASH_name, "symbols", 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!pp.dirtab)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.dirtab = hashalloc(REFONE, HASH_name, "directives", 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin inithash(pp.dirtab, directives);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!pp.filtab)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.filtab = hashalloc(REFALL, HASH_name, "files", 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!pp.prdtab)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.prdtab = hashalloc(REFALL, HASH_name, "predicates", 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!pp.strtab)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.strtab = hashalloc(REFALL, HASH_name, "strings", 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin inithash(pp.strtab, options);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin inithash(pp.strtab, predicates);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin inithash(pp.strtab, variables);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.optflags[X_PROTOTYPED] = OPT_GLOBAL;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.optflags[X_SYSTEM_HEADER] = OPT_GLOBAL|OPT_PASS;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * mark macros that are builtin predicates
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (kp = predicates; s = kp->name; kp++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!ppisid(*s))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppassert(DEFINE, s, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * the remaining entry names must be allocated
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hashset(pp.dirtab, HASH_ALLOCATE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hashset(pp.filtab, HASH_ALLOCATE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hashset(pp.prdtab, HASH_ALLOCATE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hashset(pp.strtab, HASH_ALLOCATE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hashset(pp.symtab, HASH_ALLOCATE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.test & TEST_nonoise)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = error_info.trace;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error_info.trace = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if DEBUG
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(pp.test & TEST_noinit))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * compose, push and read the builtin initialization script
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(sp = sfstropen()))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(3, "temporary buffer allocation error");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#%s %s:%s \"/#<assert> /\" \"/assert /%s #/\"\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#%s %s:%s \"/#<unassert> /\" \"/unassert /%s #/\"\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin",
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dirname(PRAGMA),
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.pass,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin keyname(X_MAP),
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dirname(DEFINE),
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dirname(PRAGMA),
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.pass,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin keyname(X_MAP),
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dirname(UNDEF));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.ppdefault && *pp.ppdefault)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.probe)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = pp.lastdir->next->type;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.lastdir->next->type = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (ppsearch(pp.ppdefault, T_STRING, SEARCH_EXISTS) < 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin free(pp.ppdefault);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(pp.ppdefault = pathprobe(pp.path, NiL, "C", pp.pass, pp.probe ? pp.probe : PPPROBE, 0)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(1, "cannot determine default definitions for %s", pp.probe ? pp.probe : PPPROBE);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.probe)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.lastdir->next->type = c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (pp.firstop)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin switch (pp.firstop->op)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_ASSERT:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp, "#%s #%s\n", dirname(DEFINE), pp.firstop->value);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_DEFINE:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*pp.firstop->value == '#')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp, "#%s %s\n", dirname(DEFINE), pp.firstop->value);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (s = strchr(pp.firstop->value, '='))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp, "#%s %-.*s %s\n", dirname(DEFINE), s - pp.firstop->value, pp.firstop->value, s + 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp, "#%s %s 1\n", dirname(DEFINE), pp.firstop->value);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_DIRECTIVE:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp, "#%s\n", pp.firstop->value);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_OPTION:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (s = strchr(pp.firstop->value, '='))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp, "#%s %s:%-.*s %s\n", dirname(PRAGMA), pp.pass, s - pp.firstop->value, pp.firstop->value, s + 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp, "#%s %s:%s\n", dirname(PRAGMA), pp.pass, pp.firstop->value);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_READ:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp, "#%s \"%s\"\n", dirname(INCLUDE), pp.firstop->value);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_UNDEF:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp, "#%s %s\n", dirname(UNDEF), pp.firstop->value);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.lastop = pp.firstop;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.firstop = pp.firstop->next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin free(pp.lastop);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#%s %s:%s\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#%s %s:%s\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#%s !#%s(%s)\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#%s !#%s(%s) || #%s(%s)\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , dirname(PRAGMA)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , pp.pass
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , keyname(X_BUILTIN)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , dirname(PRAGMA)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , pp.pass
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , keyname(X_PREDEFINED)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , dirname(IF)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , keyname(X_OPTION)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , keyname(X_PLUSPLUS)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , dirname(IF)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , keyname(X_OPTION)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , keyname(X_COMPATIBILITY)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , keyname(X_OPTION)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , keyname(X_TRANSITION)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin );
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#%s #%s(%s)\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#%s %s:%s\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#%s %s:%s\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#%s __STRICT__ 1\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#%s\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#%s\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , dirname(IF)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , keyname(X_OPTION)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , keyname(X_STRICT)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , dirname(PRAGMA)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , pp.pass
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , keyname(X_ALLMULTIPLE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , dirname(PRAGMA)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , pp.pass
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , keyname(X_READONLY)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , dirname(DEFINE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , dirname(ENDIF)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , dirname(ENDIF)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin );
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (kp = readonlys; s = kp->name; kp++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!ppisid(*s))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp, "#%s %s\n", dirname(UNDEF), s);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#%s\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#%s __STDPP__ 1\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#%s %s:no%s\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , dirname(ENDIF)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , dirname(DEFINE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , dirname(PRAGMA)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , pp.pass
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , keyname(X_PREDEFINED)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin );
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!pp.truncate)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#%s __STDPP__directive #(%s)\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , dirname(DEFINE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , keyname(V_DIRECTIVE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin );
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (kp = variables; s = kp->name; kp++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (ppisid(*s) || *s++ == '+')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = *s == '_' ? "" : "__";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp, "#%s %s%s%s #(%s)\n" , dirname(DEFINE), t, s, t, s);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp,
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#%s %s:no%s\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#%s %s:no%s\n\
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin"
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , dirname(PRAGMA)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , pp.pass
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , keyname(X_READONLY)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , dirname(PRAGMA)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , pp.pass
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin , keyname(X_BUILTIN)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin );
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz if (pp.ppdefault && *pp.ppdefault)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sfprintf(sp, "#%s \"%s\"\n", dirname(INCLUDE), pp.ppdefault);
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz sfprintf(sp,
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz"\
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#%s !defined(__STDC__) && (!#option(compatibility) || #option(transition))\n\
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#%s __STDC__ #(STDC)\n\
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz#%s\n\
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz"
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz , dirname(IF)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz , dirname(DEFINE)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz , dirname(ENDIF)
34f9b3eef6fdadbda0a846aa4d68691ac40eace5Roland Mainz );
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = sfstruse(sp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin debug((-9, "\n/* begin initialization */\n%s/* end initialization */", t));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppcomment = pp.comment;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.comment = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pplinesync = pp.linesync;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.linesync = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUSH_INIT(pp.pass, t);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.mode |= INIT;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (pplex());
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.mode &= ~INIT;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.comment = ppcomment;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.linesync = pplinesync;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.prefix = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfstrclose(sp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (error_info.trace)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (dp = pp.firstdir; dp; dp = dp->next)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin message((-1, "include directory %s%s%s%s", dp->name, (dp->type & TYPE_VENDOR) ? " [VENDOR]" : "", (dp->type & TYPE_HOSTED) ? " [HOSTED]" : "", dp->c ? " [C]" : ""));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if DEBUG
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.test & TEST_nonoise)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error_info.trace = c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * this is sleazy but at least it's
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * hidden in the library
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#include <preroot.h>
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if FS_PREROOT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct pplist* preroot;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((preroot = (struct pplist*)hashget(pp.prdtab, "preroot")))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin setpreroot(NiL, preroot->value);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.ignoresrc)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.ignoresrc > 1 && pp.stddirs != pp.firstdir)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(1, "directories up to and including %s are for \"...\" include files only", pp.stddirs->name);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.lcldirs = pp.lcldirs->next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.ignore)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*pp.ignore)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppmapinclude(pp.ignore, NiL);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.ignore = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.standalone)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.state |= STANDALONE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if COMPATIBLE
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppfsm(FSM_COMPATIBILITY, NiL);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppfsm(FSM_PLUSPLUS, NiL);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.initialized = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.reset.on)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.reset.symtab = pp.symtab;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.symtab = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.reset.ro_state = pp.ro_state;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.reset.ro_mode = pp.ro_mode;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.reset.ro_option = pp.ro_option;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.reset.on)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.symtab)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hashwalk(pp.filtab, 0, unguard, NiL);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hashfree(pp.symtab);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.symtab = hashalloc(NiL, HASH_name, "symbols", HASH_free, undefine, HASH_set, HASH_ALLOCATE|HASH_BUCKET, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hashview(pp.symtab, pp.reset.symtab);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.ro_state = pp.reset.ro_state;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.ro_mode = pp.reset.ro_mode;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.ro_option = pp.reset.ro_option;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if CHECKPOINT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.mode & DUMP)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!pp.pragma)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(3, "#%s must be enabled for checkpoints", dirname(PRAGMA));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (*pp.pragma)(dirname(PRAGMA), pp.pass, keyname(X_CHECKPOINT), pp.checkpoint, 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (n = pp.filedeps.flags)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(n & PP_deps_file))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.state |= NOTEXT;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.option |= KEEPNOTEXT;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.linesync = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (n & PP_deps_generated)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.mode |= GENDEPS;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (n & PP_deps_local)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.mode &= ~HEADERDEPS;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (!(pp.mode & FILEDEPS))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.mode |= HEADERDEPS;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.mode |= FILEDEPS;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * push the main input file -- special case for hosted mark
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.firstdir->type & TYPE_HOSTED)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.mode |= MARKHOSTED;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.mode &= ~MARKHOSTED;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if CHECKPOINT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(pp.mode & DUMP))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(p = error_info.file))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p = "";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error_info.file = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*p)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pathcanon(p, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p = ppsetfile(p)->name;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUSH_FILE(p, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.mode & FILEDEPS)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (s = strrchr(error_info.file, '/'))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = error_info.file;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!*s)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = "-";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = strcpy(pp.tmpbuf, s);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((t = p = strrchr(s, '.')) && (*++p == 'c' || *p == 'C'))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (c = *++p)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*++p == c);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*p)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!t)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = s + strlen(s);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *t++ = '.';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *(t + 1) = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.state & NOTEXT)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.filedeps.sp = sfstdout;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *t = 'd';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(pp.filedeps.sp = sfopen(NiL, s, "w")))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(ERROR_SYSTEM|3, "%s: cannot create", s);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *t = 'o';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.column = sfprintf(pp.filedeps.sp, "%s :", s);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*error_info.file)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.column += sfprintf(pp.filedeps.sp, " %s", error_info.file);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (xp = pp.firsttx)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(sp = sfstropen()))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(3, "temporary buffer allocation error");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (xp)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfprintf(sp, "#%s \"%s\"\n", dirname(INCLUDE), xp->value);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin xp = xp->next;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = sfstruse(sp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin PUSH_BUFFER("options", t, 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfstrclose(sp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_INPUT:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if CHECKPOINT && POOL
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(pp.mode & DUMP) || pp.pool.input)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if CHECKPOINT
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(pp.mode & DUMP))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if POOL
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.pool.input)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p = va_arg(ap, char*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!error_info.file)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error_info.file = p;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin close(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (open(p, O_RDONLY) != 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(ERROR_SYSTEM|3, "%s: cannot read", p);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (strmatch(p, "*.(s|S|as|AS|asm|ASM)"))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&pp.mode, CATLITERAL, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_SPACEOUT, 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /*FALLTHROUGH*/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_TEXT:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.initialized)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto before;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((p = va_arg(ap, char*)) && *p)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.lasttx)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.lasttx = pp.lasttx->next = newof(0, struct oplist, 1, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.firsttx = pp.lasttx = newof(0, struct oplist, 1, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.lasttx->op = op;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.lasttx->value = p;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_KEYARGS:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.initialized)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto before;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&pp.option, KEYARGS, va_arg(ap, int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.option & KEYARGS)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if MACKEYARGS
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&pp.mode, CATLITERAL, 1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(3, "preprocessor not compiled with macro keyword arguments enabled [MACKEYARGS]");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_LINE:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.linesync = va_arg(ap, PPLINESYNC);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_LINEBASE:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (va_arg(ap, int))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.flags |= PP_linebase;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.flags &= ~PP_linebase;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_LINEFILE:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (va_arg(ap, int))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.flags |= PP_linefile;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.flags &= ~PP_linefile;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_LINEID:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(p = va_arg(ap, char*)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.lineid = "";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (*p != '-')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.lineid = strdup(p);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.option |= IGNORELINE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_LINETYPE:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((n = va_arg(ap, int)) >= 1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.flags |= PP_linetype;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.flags &= ~PP_linetype;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (n >= 2)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.flags |= PP_linehosted;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.flags &= ~PP_linehosted;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_LOCAL:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.initialized)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto before;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.ignoresrc++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.stddirs = pp.lastdir;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(pp.ro_option & PREFIX))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.option &= ~PREFIX;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_MACREF:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.macref = va_arg(ap, PPMACREF);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_MULTIPLE:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&pp.mode, ALLMULTIPLE, va_arg(ap, int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_NOHASH:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&pp.option, NOHASH, va_arg(ap, int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_NOISE:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = va_arg(ap, int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&pp.option, NOISE, op);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&pp.option, NOISEFILTER, op < 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_OPTARG:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.optarg = va_arg(ap, PPOPTARG);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_OUTPUT:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.outfile = va_arg(ap, char*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (identical(pp.outfile, 0))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(3, "%s: identical to input", pp.outfile);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin close(1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (open(pp.outfile, O_WRONLY|O_CREAT|O_TRUNC, S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) != 1)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(ERROR_SYSTEM|3, "%s: cannot create", pp.outfile);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_PASSTHROUGH:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(pp.state & COMPILE))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&pp.state, PASSTHROUGH, va_arg(ap, int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_PEDANTIC:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&pp.mode, PEDANTIC, va_arg(ap, int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_PLUSCOMMENT:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&pp.option, PLUSCOMMENT, va_arg(ap, int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.initialized)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppfsm(FSM_PLUSPLUS, NiL);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_PLUSPLUS:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&pp.option, PLUSPLUS, va_arg(ap, int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&pp.option, PLUSCOMMENT, va_arg(ap, int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.initialized)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppfsm(FSM_PLUSPLUS, NiL);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_POOL:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.initialized)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto before;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (va_arg(ap, int))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#if POOL
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.pool.input = dup(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.pool.output = dup(1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p = "/dev/null";
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!identical(p, 0))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!identical(p, 1))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_OUTPUT, p);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppop(PP_INPUT, p);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(3, "preprocessor not compiled with input pool enabled [POOL]");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_PRAGMA:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.pragma = va_arg(ap, PPPRAGMA);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_PRAGMAFLAGS:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (p = va_arg(ap, char*))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = OPT_GLOBAL;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*p == '-')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n |= OPT_PASS;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((c = (int)hashref(pp.strtab, p)) > 0 && c <= X_last_option)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.optflags[c] = n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_PROBE:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.probe = va_arg(ap, char*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_QUOTE:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p = va_arg(ap, char*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = va_arg(ap, int);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (p)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin ppfsm(c ? FSM_QUOTADD : FSM_QUOTDEL, p);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_REGUARD:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&pp.option, REGUARD, va_arg(ap, int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_RESERVED:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((pp.state & COMPILE) && (p = va_arg(ap, char*)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(sp = sfstropen()))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(3, "temporary buffer allocation error");
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfputr(sp, p, -1);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p = sfstruse(sp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (s = strchr(p, '='))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s = p;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*s == '_')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin s++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (t = s + strlen(s); t > s && *(t - 1) == '_'; t--);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*t == '_')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *t = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin t = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = ((key = ppkeyref(pp.symtab, s)) && (key->sym.flags & SYM_LEX)) ? key->lex : T_NOISE;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.test & 0x0400)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(1, "reserved#1 `%s' %d", s, op);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (t)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *t = '_';
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(key = ppkeyget(pp.symtab, p)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin key = ppkeyset(pp.symtab, NiL);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (!(key->sym.flags & SYM_LEX))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin struct ppsymbol tmp;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tmp = key->sym;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hashlook(pp.symtab, p, HASH_DELETE, NiL);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin key = ppkeyset(pp.symtab, NiL);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin key->sym.flags = tmp.flags;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin key->sym.macro = tmp.macro;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin key->sym.value = tmp.value;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin key->sym.hidden = tmp.hidden;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!(key->sym.flags & SYM_KEYWORD))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin key->sym.flags |= SYM_KEYWORD|SYM_LEX;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin key->lex = op;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.test & 0x0400)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(1, "reserved#2 `%s' %d", p, op);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin sfstrclose(sp);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_SPACEOUT:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&pp.state, SPACEOUT, va_arg(ap, int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_STANDALONE:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.initialized)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto before;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.standalone = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_STANDARD:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((pp.lastdir->next->name = ((p = va_arg(ap, char*)) && *p) ? p : NiL) && !stat(p, &st))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin SAVEID(&pp.lastdir->next->id, &st);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (dp = pp.firstdir; dp; dp = dp->next)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (dp->name)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (hp = pp.firstdir; hp != dp; hp = hp->next)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (hp->name && SAMEID(&hp->id, &dp->id))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hp->c = dp->c;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (dp->type & TYPE_HOSTED)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hp->type |= TYPE_HOSTED;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hp->type &= ~TYPE_HOSTED;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_STRICT:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&pp.state, TRANSITION, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.flags &= ~PP_transition;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&pp.state, STRICT, va_arg(ap, int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.state & STRICT)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.flags |= PP_strict;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.flags &= ~PP_strict;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_TEST:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (p = va_arg(ap, char*))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (;;)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin while (*p == ' ' || *p == '\t') p++;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (s = p; n = *s; s++)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (n == ',' || n == ' ' || n == '\t')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin *s++ = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!*p)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (*p == 'n' && *(p + 1) == 'o')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p += 2;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (streq(p, "count"))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = TEST_count;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (streq(p, "hashcount"))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = TEST_hashcount;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (streq(p, "hashdump"))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = TEST_hashdump;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (streq(p, "hit"))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = TEST_hit;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (streq(p, "init"))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = TEST_noinit|TEST_INVERT;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (streq(p, "noise"))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = TEST_nonoise|TEST_INVERT;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (streq(p, "proto"))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = TEST_noproto|TEST_INVERT;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (*p >= '0' && *p <= '9')
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n = strtoul(p, NiL, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(1, "%s: unknown test", p);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (n & TEST_INVERT)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin n &= ~TEST_INVERT;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = !op;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (op)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.test |= n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.test &= ~n;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p = s;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin debug((-4, "test = 0%o", pp.test));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_TRANSITION:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&pp.state, STRICT, 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.flags &= ~PP_strict;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&pp.state, TRANSITION, va_arg(ap, int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.state & TRANSITION)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.flags |= PP_transition;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.flags &= ~PP_transition;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_TRUNCATE:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.initialized)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin goto before;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if ((op = va_arg(ap, int)) < 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin op = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&pp.option, TRUNCATE, op);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (pp.option & TRUNCATE)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Hash_bucket_t* b;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Hash_bucket_t* p;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Hash_position_t* pos;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin Hash_table_t* tab;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.truncate = op;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin tab = pp.symtab;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.symtab = hashalloc(NiL, HASH_set, tab ? HASH_ALLOCATE : 0, HASH_compare, trunccomp, HASH_hash, trunchash, HASH_name, "truncate", 0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (tab && (pos = hashscan(tab, 0)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (p = hashnext(pos))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin do
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin b = hashnext(pos);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hashlook(pp.symtab, (char*)p, HASH_BUCKET|HASH_INSTALL, NiL);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin } while (p = b);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin hashdone(pos);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin pp.truncate = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_VENDOR:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin p = va_arg(ap, char*);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = va_arg(ap, int) != 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!p || !*p)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (dp = pp.firstdir; dp; dp = dp->next)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dp->type &= ~TYPE_VENDOR;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (streq(p, "-"))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (dp = pp.firstdir; dp; dp = dp->next)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (c)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dp->type |= TYPE_VENDOR;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dp->type &= ~TYPE_VENDOR;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if (!stat((pathcanon(p, 0), p), &st))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = 0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for (dp = pp.firstdir; dp; dp = dp->next)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin {
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (!c && ((dp->type & TYPE_VENDOR) || dp->name && SAMEID(&dp->id, &st)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin c = 1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if (c)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dp->type |= TYPE_VENDOR;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin dp->type &= ~TYPE_VENDOR;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case PP_WARN:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin set(&pp.state, WARN, va_arg(ap, int));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin before:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(3, "ppop(%d): preprocessor operation must be done before PP_INIT", op);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin default:
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin error(3, "ppop(%d): invalid preprocessor operation", op);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin break;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin }
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin va_end(ap);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin}