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