1*ce95e1b3SDavid du Colombier #include <u.h> 2*ce95e1b3SDavid du Colombier #include <libc.h> 3*ce95e1b3SDavid du Colombier #include <bio.h> 4*ce95e1b3SDavid du Colombier #include "../ic/i.out.h" 5*ce95e1b3SDavid du Colombier 6*ce95e1b3SDavid du Colombier #ifndef EXTERN 7*ce95e1b3SDavid du Colombier #define EXTERN extern 8*ce95e1b3SDavid du Colombier #endif 9*ce95e1b3SDavid du Colombier 10*ce95e1b3SDavid du Colombier typedef struct Sym Sym; 11*ce95e1b3SDavid du Colombier typedef struct Gen Gen; 12*ce95e1b3SDavid du Colombier typedef struct Io Io; 13*ce95e1b3SDavid du Colombier typedef struct Hist Hist; 14*ce95e1b3SDavid du Colombier 15*ce95e1b3SDavid du Colombier #define MAXALIGN 7 16*ce95e1b3SDavid du Colombier #define FPCHIP 1 17*ce95e1b3SDavid du Colombier #define NSYMB 500 18*ce95e1b3SDavid du Colombier #define BUFSIZ 8192 19*ce95e1b3SDavid du Colombier #define HISTSZ 20 20*ce95e1b3SDavid du Colombier #define NINCLUDE 10 21*ce95e1b3SDavid du Colombier #define NHUNK 10000 22*ce95e1b3SDavid du Colombier #define EOF (-1) 23*ce95e1b3SDavid du Colombier #define IGN (-2) 24*ce95e1b3SDavid du Colombier #define GETC() ((--fi.c < 0)? filbuf(): *fi.p++ & 0xff) 25*ce95e1b3SDavid du Colombier #define NHASH 503 26*ce95e1b3SDavid du Colombier #define STRINGSZ 200 27*ce95e1b3SDavid du Colombier #define NMACRO 10 28*ce95e1b3SDavid du Colombier 29*ce95e1b3SDavid du Colombier struct Sym 30*ce95e1b3SDavid du Colombier { 31*ce95e1b3SDavid du Colombier Sym* link; 32*ce95e1b3SDavid du Colombier char* macro; 33*ce95e1b3SDavid du Colombier long value; 34*ce95e1b3SDavid du Colombier ushort type; 35*ce95e1b3SDavid du Colombier char *name; 36*ce95e1b3SDavid du Colombier char sym; 37*ce95e1b3SDavid du Colombier }; 38*ce95e1b3SDavid du Colombier #define S ((Sym*)0) 39*ce95e1b3SDavid du Colombier 40*ce95e1b3SDavid du Colombier EXTERN struct 41*ce95e1b3SDavid du Colombier { 42*ce95e1b3SDavid du Colombier char* p; 43*ce95e1b3SDavid du Colombier int c; 44*ce95e1b3SDavid du Colombier } fi; 45*ce95e1b3SDavid du Colombier 46*ce95e1b3SDavid du Colombier struct Io 47*ce95e1b3SDavid du Colombier { 48*ce95e1b3SDavid du Colombier Io* link; 49*ce95e1b3SDavid du Colombier char b[BUFSIZ]; 50*ce95e1b3SDavid du Colombier char* p; 51*ce95e1b3SDavid du Colombier short c; 52*ce95e1b3SDavid du Colombier short f; 53*ce95e1b3SDavid du Colombier }; 54*ce95e1b3SDavid du Colombier #define I ((Io*)0) 55*ce95e1b3SDavid du Colombier 56*ce95e1b3SDavid du Colombier EXTERN struct 57*ce95e1b3SDavid du Colombier { 58*ce95e1b3SDavid du Colombier Sym* sym; 59*ce95e1b3SDavid du Colombier short type; 60*ce95e1b3SDavid du Colombier } h[NSYM]; 61*ce95e1b3SDavid du Colombier 62*ce95e1b3SDavid du Colombier struct Gen 63*ce95e1b3SDavid du Colombier { 64*ce95e1b3SDavid du Colombier Sym *sym; 65*ce95e1b3SDavid du Colombier long offset; 66*ce95e1b3SDavid du Colombier short type; 67*ce95e1b3SDavid du Colombier short reg; 68*ce95e1b3SDavid du Colombier short name; 69*ce95e1b3SDavid du Colombier double dval; 70*ce95e1b3SDavid du Colombier char sval[8]; 71*ce95e1b3SDavid du Colombier vlong vval; 72*ce95e1b3SDavid du Colombier }; 73*ce95e1b3SDavid du Colombier 74*ce95e1b3SDavid du Colombier struct Hist 75*ce95e1b3SDavid du Colombier { 76*ce95e1b3SDavid du Colombier Hist* link; 77*ce95e1b3SDavid du Colombier char* name; 78*ce95e1b3SDavid du Colombier long line; 79*ce95e1b3SDavid du Colombier long offset; 80*ce95e1b3SDavid du Colombier }; 81*ce95e1b3SDavid du Colombier #define H ((Hist*)0) 82*ce95e1b3SDavid du Colombier 83*ce95e1b3SDavid du Colombier enum 84*ce95e1b3SDavid du Colombier { 85*ce95e1b3SDavid du Colombier CLAST, 86*ce95e1b3SDavid du Colombier CMACARG, 87*ce95e1b3SDavid du Colombier CMACRO, 88*ce95e1b3SDavid du Colombier CPREPROC, 89*ce95e1b3SDavid du Colombier }; 90*ce95e1b3SDavid du Colombier 91*ce95e1b3SDavid du Colombier EXTERN char debug[256]; 92*ce95e1b3SDavid du Colombier EXTERN Sym* hash[NHASH]; 93*ce95e1b3SDavid du Colombier EXTERN char* Dlist[30]; 94*ce95e1b3SDavid du Colombier EXTERN int nDlist; 95*ce95e1b3SDavid du Colombier EXTERN Hist* ehist; 96*ce95e1b3SDavid du Colombier EXTERN int newflag; 97*ce95e1b3SDavid du Colombier EXTERN Hist* hist; 98*ce95e1b3SDavid du Colombier EXTERN char* hunk; 99*ce95e1b3SDavid du Colombier EXTERN char* include[NINCLUDE]; 100*ce95e1b3SDavid du Colombier EXTERN Io* iofree; 101*ce95e1b3SDavid du Colombier EXTERN Io* ionext; 102*ce95e1b3SDavid du Colombier EXTERN Io* iostack; 103*ce95e1b3SDavid du Colombier EXTERN long lineno; 104*ce95e1b3SDavid du Colombier EXTERN int nerrors; 105*ce95e1b3SDavid du Colombier EXTERN long nhunk; 106*ce95e1b3SDavid du Colombier EXTERN int ninclude; 107*ce95e1b3SDavid du Colombier EXTERN int nosched; 108*ce95e1b3SDavid du Colombier EXTERN Gen nullgen; 109*ce95e1b3SDavid du Colombier EXTERN char* outfile; 110*ce95e1b3SDavid du Colombier EXTERN int pass; 111*ce95e1b3SDavid du Colombier EXTERN char* pathname; 112*ce95e1b3SDavid du Colombier EXTERN long pc; 113*ce95e1b3SDavid du Colombier EXTERN int peekc; 114*ce95e1b3SDavid du Colombier EXTERN int sym; 115*ce95e1b3SDavid du Colombier EXTERN char symb[NSYMB]; 116*ce95e1b3SDavid du Colombier EXTERN int thechar; 117*ce95e1b3SDavid du Colombier EXTERN char* thestring; 118*ce95e1b3SDavid du Colombier EXTERN long thunk; 119*ce95e1b3SDavid du Colombier EXTERN Biobuf obuf; 120*ce95e1b3SDavid du Colombier 121*ce95e1b3SDavid du Colombier void* alloc(long); 122*ce95e1b3SDavid du Colombier void* allocn(void*, long, long); 123*ce95e1b3SDavid du Colombier void errorexit(void); 124*ce95e1b3SDavid du Colombier void pushio(void); 125*ce95e1b3SDavid du Colombier void newio(void); 126*ce95e1b3SDavid du Colombier void newfile(char*, int); 127*ce95e1b3SDavid du Colombier Sym* slookup(char*); 128*ce95e1b3SDavid du Colombier Sym* lookup(void); 129*ce95e1b3SDavid du Colombier void syminit(Sym*); 130*ce95e1b3SDavid du Colombier long yylex(void); 131*ce95e1b3SDavid du Colombier int getc(void); 132*ce95e1b3SDavid du Colombier int getnsc(void); 133*ce95e1b3SDavid du Colombier void unget(int); 134*ce95e1b3SDavid du Colombier int escchar(int); 135*ce95e1b3SDavid du Colombier void cinit(void); 136*ce95e1b3SDavid du Colombier void pinit(char*); 137*ce95e1b3SDavid du Colombier void cclean(void); 138*ce95e1b3SDavid du Colombier void outcode(int, Gen*, int, Gen*); 139*ce95e1b3SDavid du Colombier void zname(char*, int, int); 140*ce95e1b3SDavid du Colombier void zaddr(Gen*, int); 141*ce95e1b3SDavid du Colombier void ieeedtod(Ieee*, double); 142*ce95e1b3SDavid du Colombier int filbuf(void); 143*ce95e1b3SDavid du Colombier Sym* getsym(void); 144*ce95e1b3SDavid du Colombier void domacro(void); 145*ce95e1b3SDavid du Colombier void macund(void); 146*ce95e1b3SDavid du Colombier void macdef(void); 147*ce95e1b3SDavid du Colombier void macexpand(Sym*, char*); 148*ce95e1b3SDavid du Colombier void macinc(void); 149*ce95e1b3SDavid du Colombier void macprag(void); 150*ce95e1b3SDavid du Colombier void maclin(void); 151*ce95e1b3SDavid du Colombier void macif(int); 152*ce95e1b3SDavid du Colombier void macend(void); 153*ce95e1b3SDavid du Colombier void dodefine(char*); 154*ce95e1b3SDavid du Colombier void prfile(long); 155*ce95e1b3SDavid du Colombier void outhist(void); 156*ce95e1b3SDavid du Colombier void linehist(char*, int); 157*ce95e1b3SDavid du Colombier void gethunk(void); 158*ce95e1b3SDavid du Colombier void yyerror(char*, ...); 159*ce95e1b3SDavid du Colombier int yyparse(void); 160*ce95e1b3SDavid du Colombier void setinclude(char*); 161*ce95e1b3SDavid du Colombier int assemble(char*); 162*ce95e1b3SDavid du Colombier 163*ce95e1b3SDavid du Colombier /* 164*ce95e1b3SDavid du Colombier * system-dependent stuff from ../cc/compat.c 165*ce95e1b3SDavid du Colombier */ 166*ce95e1b3SDavid du Colombier 167*ce95e1b3SDavid du Colombier enum /* keep in synch with ../cc/cc.h */ 168*ce95e1b3SDavid du Colombier { 169*ce95e1b3SDavid du Colombier Plan9 = 1<<0, 170*ce95e1b3SDavid du Colombier Unix = 1<<1, 171*ce95e1b3SDavid du Colombier Windows = 1<<2 172*ce95e1b3SDavid du Colombier }; 173*ce95e1b3SDavid du Colombier int mywait(int*); 174*ce95e1b3SDavid du Colombier int mycreat(char*, int); 175*ce95e1b3SDavid du Colombier int systemtype(int); 176*ce95e1b3SDavid du Colombier int pathchar(void); 177*ce95e1b3SDavid du Colombier char* mygetwd(char*, int); 178*ce95e1b3SDavid du Colombier int myexec(char*, char*[]); 179*ce95e1b3SDavid du Colombier int mydup(int, int); 180*ce95e1b3SDavid du Colombier int myfork(void); 181*ce95e1b3SDavid du Colombier int mypipe(int*); 182*ce95e1b3SDavid du Colombier void* mysbrk(ulong); 183