00001 #define INS 32768
00002 #define OBS 4096
00003 #define NARG 32
00004 #define NINCLUDE 32
00005 #define NIF 32
00006 #ifndef EOF
00007 #define EOF (-1)
00008 #endif
00009 #ifndef NULL
00010 #define NULL 0
00011 #endif
00012
00013 #ifndef __alpha
00014 typedef unsigned char uchar;
00015 #endif
00016
00017 enum toktype { END, UNCLASS, NAME, NUMBER, STRING, CCON, NL, WS, DSHARP,
00018 EQ, NEQ, LEQ, GEQ, LSH, RSH, LAND, LOR, PPLUS, MMINUS,
00019 ARROW, SBRA, SKET, LP, RP, DOT, AND, STAR, PLUS, MINUS,
00020 TILDE, NOT, SLASH, PCT, LT, GT, CIRC, OR, QUEST,
00021 COLON, ASGN, COMMA, SHARP, SEMIC, CBRA, CKET,
00022 ASPLUS, ASMINUS, ASSTAR, ASSLASH, ASPCT, ASCIRC, ASLSH,
00023 ASRSH, ASOR, ASAND, ELLIPS,
00024 DSHARP1, NAME1, DEFINED, UMINUS };
00025
00026 enum kwtype { KIF, KIFDEF, KIFNDEF, KELIF, KELSE, KENDIF, KINCLUDE, KDEFINE,
00027 KUNDEF, KLINE, KERROR, KPRAGMA, KDEFINED,
00028 KLINENO, KFILE, KDATE, KTIME, KSTDC, KEVAL };
00029
00030 #define ISDEFINED 01
00031 #define ISKW 02
00032 #define ISUNCHANGE 04
00033 #define ISMAC 010
00034
00035 #define EOB 0xFE
00036 #define EOFC 0xFD
00037 #define XPWS 1
00038
00039 typedef struct token {
00040 unsigned char type;
00041 unsigned char flag;
00042 unsigned short hideset;
00043 unsigned int wslen;
00044 unsigned int len;
00045 uchar *t;
00046 } Token;
00047
00048 typedef struct tokenrow {
00049 Token *tp;
00050 Token *bp;
00051 Token *lp;
00052 int max;
00053 } Tokenrow;
00054
00055 typedef struct source {
00056 char *filename;
00057 int line;
00058 int lineinc;
00059 uchar *inb;
00060 uchar *inp;
00061 uchar *inl;
00062 int fd;
00063 int ifdepth;
00064 struct source *next;
00065 } Source;
00066
00067 typedef struct nlist {
00068 struct nlist *next;
00069 uchar *name;
00070 int len;
00071 Tokenrow *vp;
00072 Tokenrow *ap;
00073 char val;
00074 char flag;
00075 } Nlist;
00076
00077 typedef struct includelist {
00078 char deleted;
00079 char always;
00080 char *file;
00081 } Includelist;
00082
00083 #define new(t) (t *)domalloc(sizeof(t))
00084 #define quicklook(a,b) (namebit[(a)&077] & (1<<((b)&037)))
00085 #define quickset(a,b) namebit[(a)&077] |= (1<<((b)&037))
00086 extern unsigned long namebit[077+1];
00087
00088 enum errtype { WARNING, ERROR, FATAL };
00089
00090 void expandlex(void);
00091 void fixlex(void);
00092 void setup(int, char **);
00093 int gettokens(Tokenrow *, int);
00094 int comparetokens(Tokenrow *, Tokenrow *);
00095 Source *setsource(char *, int, char *);
00096 void unsetsource(void);
00097 void puttokens(Tokenrow *);
00098 void process(Tokenrow *);
00099 void *domalloc(int);
00100 void dofree(void *);
00101 void error(enum errtype, char *, ...);
00102 void flushout(void);
00103 int fillbuf(Source *);
00104 int trigraph(Source *);
00105 int foldline(Source *);
00106 Nlist *lookup(Token *, int);
00107 void control(Tokenrow *);
00108 void dodefine(Tokenrow *);
00109 void doadefine(Tokenrow *, int);
00110 void doinclude(Tokenrow *);
00111 void doif(Tokenrow *, enum kwtype);
00112 void expand(Tokenrow *, Nlist *);
00113 void builtin(Tokenrow *, int);
00114 int gatherargs(Tokenrow *, Tokenrow **, int *);
00115 void substargs(Nlist *, Tokenrow *, Tokenrow **);
00116 void expandrow(Tokenrow *, char *);
00117 void maketokenrow(int, Tokenrow *);
00118 Tokenrow *copytokenrow(Tokenrow *, Tokenrow *);
00119 Token *growtokenrow(Tokenrow *);
00120 Tokenrow *normtokenrow(Tokenrow *);
00121 void adjustrow(Tokenrow *, int);
00122 void movetokenrow(Tokenrow *, Tokenrow *);
00123 void insertrow(Tokenrow *, int, Tokenrow *);
00124 void peektokens(Tokenrow *, char *);
00125 void doconcat(Tokenrow *);
00126 Tokenrow *stringify(Tokenrow *);
00127 int lookuparg(Nlist *, Token *);
00128 long eval(Tokenrow *, int);
00129 void genline(void);
00130 void setempty(Tokenrow *);
00131 void makespace(Tokenrow *);
00132 char *outnum(char *, int);
00133 int digit(int);
00134 uchar *newstring(uchar *, int, int);
00135 int checkhideset(int, Nlist *);
00136 void prhideset(int);
00137 int newhideset(int, Nlist *);
00138 int unionhideset(int, int);
00139 void iniths(void);
00140 void setobjname(char *);
00141 #define rowlen(tokrow) ((tokrow)->lp - (tokrow)->bp)
00142
00143 extern char *outp;
00144 extern Token nltoken;
00145 extern Source *cursource;
00146 extern char *curtime;
00147 extern int incdepth;
00148 extern int ifdepth;
00149 extern int ifsatisfied[NIF];
00150 extern int Mflag;
00151 extern int skipping;
00152 extern int verbose;
00153 extern int Cplusplus;
00154 extern Nlist *kwdefined;
00155 extern Includelist includelist[NINCLUDE];
00156 extern char wd[];
00157
00158 extern int creat(char *, int);
00159 extern int open(char *, int);
00160 extern int close(int);
00161 extern int dup2(int, int);
00162 extern int write(int, char *, size_t);
00163 extern int read(int, char *, size_t);