17dd7cddfSDavid du Colombier #include <u.h> 27dd7cddfSDavid du Colombier #include <libc.h> 37dd7cddfSDavid du Colombier #include <bio.h> 47dd7cddfSDavid du Colombier #include "../kc/k.out.h" 57dd7cddfSDavid du Colombier 67dd7cddfSDavid du Colombier #ifndef EXTERN 77dd7cddfSDavid du Colombier #define EXTERN extern 87dd7cddfSDavid du Colombier #endif 93e12c5d1SDavid du Colombier 103e12c5d1SDavid du Colombier typedef struct Sym Sym; 113e12c5d1SDavid du Colombier typedef struct Gen Gen; 123e12c5d1SDavid du Colombier typedef struct Io Io; 133e12c5d1SDavid du Colombier typedef struct Hist Hist; 143e12c5d1SDavid du Colombier 157dd7cddfSDavid du Colombier #define MAXALIGN 7 163e12c5d1SDavid du Colombier #define FPCHIP 1 173e12c5d1SDavid du Colombier #define NSYMB 500 183e12c5d1SDavid du Colombier #define BUFSIZ 8192 193e12c5d1SDavid du Colombier #define HISTSZ 20 203e12c5d1SDavid du Colombier #define NINCLUDE 10 213e12c5d1SDavid du Colombier #define NHUNK 10000 223e12c5d1SDavid du Colombier #define EOF (-1) 233e12c5d1SDavid du Colombier #define IGN (-2) 243e12c5d1SDavid du Colombier #define GETC() ((--fi.c < 0)? filbuf(): *fi.p++ & 0xff) 253e12c5d1SDavid du Colombier #define NHASH 503 263e12c5d1SDavid du Colombier #define STRINGSZ 200 273e12c5d1SDavid du Colombier #define NMACRO 10 283e12c5d1SDavid du Colombier 293e12c5d1SDavid du Colombier struct Sym 303e12c5d1SDavid du Colombier { 313e12c5d1SDavid du Colombier Sym* link; 323e12c5d1SDavid du Colombier char* macro; 333e12c5d1SDavid du Colombier long value; 343e12c5d1SDavid du Colombier ushort type; 35219b2ee8SDavid du Colombier char *name; 363e12c5d1SDavid du Colombier char sym; 373e12c5d1SDavid du Colombier }; 383e12c5d1SDavid du Colombier #define S ((Sym*)0) 393e12c5d1SDavid du Colombier 407dd7cddfSDavid du Colombier EXTERN struct 413e12c5d1SDavid du Colombier { 423e12c5d1SDavid du Colombier char* p; 433e12c5d1SDavid du Colombier int c; 443e12c5d1SDavid du Colombier } fi; 453e12c5d1SDavid du Colombier 463e12c5d1SDavid du Colombier struct Io 473e12c5d1SDavid du Colombier { 483e12c5d1SDavid du Colombier Io* link; 493e12c5d1SDavid du Colombier char b[BUFSIZ]; 503e12c5d1SDavid du Colombier char* p; 513e12c5d1SDavid du Colombier short c; 523e12c5d1SDavid du Colombier short f; 533e12c5d1SDavid du Colombier }; 543e12c5d1SDavid du Colombier #define I ((Io*)0) 553e12c5d1SDavid du Colombier 567dd7cddfSDavid du Colombier EXTERN struct 573e12c5d1SDavid du Colombier { 583e12c5d1SDavid du Colombier Sym* sym; 593e12c5d1SDavid du Colombier short type; 603e12c5d1SDavid du Colombier } h[NSYM]; 613e12c5d1SDavid du Colombier 623e12c5d1SDavid du Colombier struct Gen 633e12c5d1SDavid du Colombier { 643e12c5d1SDavid du Colombier Sym *sym; 653e12c5d1SDavid du Colombier long offset; 663e12c5d1SDavid du Colombier short type; 673e12c5d1SDavid du Colombier short reg; 683e12c5d1SDavid du Colombier short xreg; 693e12c5d1SDavid du Colombier short name; 703e12c5d1SDavid du Colombier double dval; 713e12c5d1SDavid du Colombier char sval[8]; 723e12c5d1SDavid du Colombier }; 733e12c5d1SDavid du Colombier 743e12c5d1SDavid du Colombier struct Hist 753e12c5d1SDavid du Colombier { 763e12c5d1SDavid du Colombier Hist* link; 773e12c5d1SDavid du Colombier char* name; 783e12c5d1SDavid du Colombier long line; 793e12c5d1SDavid du Colombier long offset; 803e12c5d1SDavid du Colombier }; 813e12c5d1SDavid du Colombier #define H ((Hist*)0) 823e12c5d1SDavid du Colombier 833e12c5d1SDavid du Colombier enum 843e12c5d1SDavid du Colombier { 853e12c5d1SDavid du Colombier CLAST, 863e12c5d1SDavid du Colombier CMACARG, 873e12c5d1SDavid du Colombier CMACRO, 883e12c5d1SDavid du Colombier CPREPROC, 893e12c5d1SDavid du Colombier }; 903e12c5d1SDavid du Colombier 917dd7cddfSDavid du Colombier EXTERN char debug[256]; 927dd7cddfSDavid du Colombier EXTERN Sym* hash[NHASH]; 937dd7cddfSDavid du Colombier EXTERN char* Dlist[30]; 947dd7cddfSDavid du Colombier EXTERN int nDlist; 957dd7cddfSDavid du Colombier EXTERN Hist* ehist; 967dd7cddfSDavid du Colombier EXTERN int newflag; 977dd7cddfSDavid du Colombier EXTERN Hist* hist; 987dd7cddfSDavid du Colombier EXTERN char* hunk; 997dd7cddfSDavid du Colombier EXTERN char* include[NINCLUDE]; 1007dd7cddfSDavid du Colombier EXTERN Io* iofree; 1017dd7cddfSDavid du Colombier EXTERN Io* ionext; 1027dd7cddfSDavid du Colombier EXTERN Io* iostack; 1037dd7cddfSDavid du Colombier EXTERN long lineno; 1047dd7cddfSDavid du Colombier EXTERN int nerrors; 1057dd7cddfSDavid du Colombier EXTERN long nhunk; 1067dd7cddfSDavid du Colombier EXTERN int ninclude; 1077dd7cddfSDavid du Colombier EXTERN int nosched; 1087dd7cddfSDavid du Colombier EXTERN Gen nullgen; 1097dd7cddfSDavid du Colombier EXTERN char* outfile; 1107dd7cddfSDavid du Colombier EXTERN int pass; 1117dd7cddfSDavid du Colombier EXTERN char* pathname; 1127dd7cddfSDavid du Colombier EXTERN long pc; 1137dd7cddfSDavid du Colombier EXTERN int peekc; 1147dd7cddfSDavid du Colombier EXTERN int sym; 1157dd7cddfSDavid du Colombier EXTERN char symb[NSYMB]; 1167dd7cddfSDavid du Colombier EXTERN int thechar; 1177dd7cddfSDavid du Colombier EXTERN char* thestring; 1187dd7cddfSDavid du Colombier EXTERN long thunk; 1197dd7cddfSDavid du Colombier EXTERN Biobuf obuf; 1203e12c5d1SDavid du Colombier 1217dd7cddfSDavid du Colombier void* alloc(long); 1227dd7cddfSDavid du Colombier void* allocn(void*, long, long); 1233e12c5d1SDavid du Colombier void errorexit(void); 1243e12c5d1SDavid du Colombier void pushio(void); 1253e12c5d1SDavid du Colombier void newio(void); 1263e12c5d1SDavid du Colombier void newfile(char*, int); 1273e12c5d1SDavid du Colombier Sym* slookup(char*); 1283e12c5d1SDavid du Colombier Sym* lookup(void); 1293e12c5d1SDavid du Colombier void syminit(Sym*); 1303e12c5d1SDavid du Colombier long yylex(void); 1313e12c5d1SDavid du Colombier int getc(void); 1323e12c5d1SDavid du Colombier int getnsc(void); 1333e12c5d1SDavid du Colombier void unget(int); 1343e12c5d1SDavid du Colombier int escchar(int); 1353e12c5d1SDavid du Colombier void cinit(void); 1363e12c5d1SDavid du Colombier void pinit(char*); 1373e12c5d1SDavid du Colombier void cclean(void); 1383e12c5d1SDavid du Colombier void outcode(int, Gen*, int, Gen*); 1393e12c5d1SDavid du Colombier void zname(char*, int, int); 1403e12c5d1SDavid du Colombier void zaddr(Gen*, int); 1413e12c5d1SDavid du Colombier void ieeedtod(Ieee*, double); 1423e12c5d1SDavid du Colombier int filbuf(void); 1433e12c5d1SDavid du Colombier Sym* getsym(void); 1443e12c5d1SDavid du Colombier void domacro(void); 1453e12c5d1SDavid du Colombier void macund(void); 1463e12c5d1SDavid du Colombier void macdef(void); 1473e12c5d1SDavid du Colombier void macexpand(Sym*, char*); 1483e12c5d1SDavid du Colombier void macinc(void); 1493e12c5d1SDavid du Colombier void macprag(void); 1503e12c5d1SDavid du Colombier void maclin(void); 1513e12c5d1SDavid du Colombier void macif(int); 1523e12c5d1SDavid du Colombier void macend(void); 1533e12c5d1SDavid du Colombier void dodefine(char*); 1543e12c5d1SDavid du Colombier void prfile(long); 1553e12c5d1SDavid du Colombier void outhist(void); 1567dd7cddfSDavid du Colombier void linehist(char*, int); 1573e12c5d1SDavid du Colombier void gethunk(void); 1583e12c5d1SDavid du Colombier void yyerror(char*, ...); 1593e12c5d1SDavid du Colombier int yyparse(void); 1607dd7cddfSDavid du Colombier void setinclude(char*); 1617dd7cddfSDavid du Colombier int assemble(char*); 1623e12c5d1SDavid du Colombier 1633e12c5d1SDavid du Colombier /* 1647dd7cddfSDavid du Colombier * system-dependent stuff from ../cc/compat.c 1653e12c5d1SDavid du Colombier */ 1667dd7cddfSDavid du Colombier 1677dd7cddfSDavid du Colombier enum /* keep in synch with ../cc/cc.h */ 1687dd7cddfSDavid du Colombier { 1697dd7cddfSDavid du Colombier Plan9 = 1<<0, 1707dd7cddfSDavid du Colombier Unix = 1<<1, 171*375daca8SDavid du Colombier Windows = 1<<2 1727dd7cddfSDavid du Colombier }; 1737dd7cddfSDavid du Colombier int mywait(int*); 1743e12c5d1SDavid du Colombier int mycreat(char*, int); 1757dd7cddfSDavid du Colombier int systemtype(int); 1767dd7cddfSDavid du Colombier int pathchar(void); 1777dd7cddfSDavid du Colombier char* mygetwd(char*, int); 1787dd7cddfSDavid du Colombier int myexec(char*, char*[]); 1797dd7cddfSDavid du Colombier int mydup(int, int); 1807dd7cddfSDavid du Colombier int myfork(void); 1817dd7cddfSDavid du Colombier int mypipe(int*); 1827dd7cddfSDavid du Colombier void* mysbrk(ulong); 183