17dd7cddfSDavid du Colombier #include <u.h> 27dd7cddfSDavid du Colombier #include <libc.h> 37dd7cddfSDavid du Colombier #include <bio.h> 47dd7cddfSDavid du Colombier #include "../8c/8.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 Ref Ref; 123e12c5d1SDavid du Colombier typedef struct Gen Gen; 133e12c5d1SDavid du Colombier typedef struct Io Io; 143e12c5d1SDavid du Colombier typedef struct Hist Hist; 153e12c5d1SDavid du Colombier typedef struct Gen2 Gen2; 163e12c5d1SDavid du Colombier 177dd7cddfSDavid du Colombier #define MAXALIGN 7 183e12c5d1SDavid du Colombier #define FPCHIP 1 193e12c5d1SDavid du Colombier #define NSYMB 500 203e12c5d1SDavid du Colombier #define BUFSIZ 8192 213e12c5d1SDavid du Colombier #define HISTSZ 20 223e12c5d1SDavid du Colombier #define NINCLUDE 10 233e12c5d1SDavid du Colombier #define NHUNK 10000 243e12c5d1SDavid du Colombier #define EOF (-1) 253e12c5d1SDavid du Colombier #define IGN (-2) 263e12c5d1SDavid du Colombier #define GETC() ((--fi.c < 0)? filbuf(): *fi.p++ & 0xff) 273e12c5d1SDavid du Colombier #define NHASH 503 283e12c5d1SDavid du Colombier #define STRINGSZ 200 293e12c5d1SDavid du Colombier #define NMACRO 10 303e12c5d1SDavid du Colombier 313e12c5d1SDavid du Colombier struct Sym 323e12c5d1SDavid du Colombier { 333e12c5d1SDavid du Colombier Sym* link; 343e12c5d1SDavid du Colombier Ref* ref; 353e12c5d1SDavid du Colombier char* macro; 363e12c5d1SDavid du Colombier long value; 373e12c5d1SDavid du Colombier ushort type; 38219b2ee8SDavid du Colombier char *name; 393e12c5d1SDavid du Colombier char sym; 403e12c5d1SDavid du Colombier }; 413e12c5d1SDavid du Colombier #define S ((Sym*)0) 423e12c5d1SDavid du Colombier 433e12c5d1SDavid du Colombier struct Ref 443e12c5d1SDavid du Colombier { 453e12c5d1SDavid du Colombier int class; 463e12c5d1SDavid du Colombier }; 473e12c5d1SDavid du Colombier 487dd7cddfSDavid du Colombier EXTERN struct 493e12c5d1SDavid du Colombier { 503e12c5d1SDavid du Colombier char* p; 513e12c5d1SDavid du Colombier int c; 523e12c5d1SDavid du Colombier } fi; 533e12c5d1SDavid du Colombier 543e12c5d1SDavid du Colombier struct Io 553e12c5d1SDavid du Colombier { 563e12c5d1SDavid du Colombier Io* link; 573e12c5d1SDavid du Colombier char b[BUFSIZ]; 583e12c5d1SDavid du Colombier char* p; 593e12c5d1SDavid du Colombier short c; 603e12c5d1SDavid du Colombier short f; 613e12c5d1SDavid du Colombier }; 623e12c5d1SDavid du Colombier #define I ((Io*)0) 633e12c5d1SDavid du Colombier 647dd7cddfSDavid du Colombier EXTERN struct 653e12c5d1SDavid du Colombier { 663e12c5d1SDavid du Colombier Sym* sym; 673e12c5d1SDavid du Colombier short type; 683e12c5d1SDavid du Colombier } h[NSYM]; 693e12c5d1SDavid du Colombier 703e12c5d1SDavid du Colombier struct Gen 713e12c5d1SDavid du Colombier { 723e12c5d1SDavid du Colombier double dval; 733e12c5d1SDavid du Colombier char sval[8]; 743e12c5d1SDavid du Colombier long offset; 75*6520663fSDavid du Colombier long offset2; 763e12c5d1SDavid du Colombier Sym* sym; 773e12c5d1SDavid du Colombier short type; 783e12c5d1SDavid du Colombier short index; 793e12c5d1SDavid du Colombier short scale; 803e12c5d1SDavid du Colombier }; 813e12c5d1SDavid du Colombier struct Gen2 823e12c5d1SDavid du Colombier { 833e12c5d1SDavid du Colombier Gen from; 843e12c5d1SDavid du Colombier Gen to; 853e12c5d1SDavid du Colombier }; 863e12c5d1SDavid du Colombier 873e12c5d1SDavid du Colombier struct Hist 883e12c5d1SDavid du Colombier { 893e12c5d1SDavid du Colombier Hist* link; 903e12c5d1SDavid du Colombier char* name; 913e12c5d1SDavid du Colombier long line; 923e12c5d1SDavid du Colombier long offset; 933e12c5d1SDavid du Colombier }; 943e12c5d1SDavid du Colombier #define H ((Hist*)0) 953e12c5d1SDavid du Colombier 963e12c5d1SDavid du Colombier enum 973e12c5d1SDavid du Colombier { 983e12c5d1SDavid du Colombier CLAST, 993e12c5d1SDavid du Colombier CMACARG, 1003e12c5d1SDavid du Colombier CMACRO, 1013e12c5d1SDavid du Colombier CPREPROC, 1023e12c5d1SDavid du Colombier }; 1033e12c5d1SDavid du Colombier 1043e12c5d1SDavid du Colombier 1057dd7cddfSDavid du Colombier EXTERN char debug[256]; 1067dd7cddfSDavid du Colombier EXTERN Sym* hash[NHASH]; 1077dd7cddfSDavid du Colombier EXTERN char* Dlist[30]; 1087dd7cddfSDavid du Colombier EXTERN int nDlist; 1097dd7cddfSDavid du Colombier EXTERN Hist* ehist; 1107dd7cddfSDavid du Colombier EXTERN int newflag; 1117dd7cddfSDavid du Colombier EXTERN Hist* hist; 1127dd7cddfSDavid du Colombier EXTERN char* hunk; 1137dd7cddfSDavid du Colombier EXTERN char* include[NINCLUDE]; 1147dd7cddfSDavid du Colombier EXTERN Io* iofree; 1157dd7cddfSDavid du Colombier EXTERN Io* ionext; 1167dd7cddfSDavid du Colombier EXTERN Io* iostack; 1177dd7cddfSDavid du Colombier EXTERN long lineno; 1187dd7cddfSDavid du Colombier EXTERN int nerrors; 1197dd7cddfSDavid du Colombier EXTERN long nhunk; 1207dd7cddfSDavid du Colombier EXTERN int ninclude; 1217dd7cddfSDavid du Colombier EXTERN Gen nullgen; 1227dd7cddfSDavid du Colombier EXTERN char* outfile; 1237dd7cddfSDavid du Colombier EXTERN int pass; 1247dd7cddfSDavid du Colombier EXTERN char* pathname; 1257dd7cddfSDavid du Colombier EXTERN long pc; 1267dd7cddfSDavid du Colombier EXTERN int peekc; 1277dd7cddfSDavid du Colombier EXTERN int sym; 1287dd7cddfSDavid du Colombier EXTERN char symb[NSYMB]; 1297dd7cddfSDavid du Colombier EXTERN int thechar; 1307dd7cddfSDavid du Colombier EXTERN char* thestring; 1317dd7cddfSDavid du Colombier EXTERN long thunk; 1327dd7cddfSDavid du Colombier EXTERN Biobuf obuf; 1337dd7cddfSDavid du Colombier 1347dd7cddfSDavid du Colombier void* allocn(void*, long, long); 1353e12c5d1SDavid du Colombier void errorexit(void); 1363e12c5d1SDavid du Colombier void pushio(void); 1373e12c5d1SDavid du Colombier void newio(void); 1383e12c5d1SDavid du Colombier void newfile(char*, int); 1393e12c5d1SDavid du Colombier Sym* slookup(char*); 1403e12c5d1SDavid du Colombier Sym* lookup(void); 1413e12c5d1SDavid du Colombier void syminit(Sym*); 1427dd7cddfSDavid du Colombier long yylex(void); 1433e12c5d1SDavid du Colombier int getc(void); 1443e12c5d1SDavid du Colombier int getnsc(void); 1453e12c5d1SDavid du Colombier void unget(int); 1463e12c5d1SDavid du Colombier int escchar(int); 1473e12c5d1SDavid du Colombier void cinit(void); 1483e12c5d1SDavid du Colombier void checkscale(int); 1493e12c5d1SDavid du Colombier void pinit(char*); 1503e12c5d1SDavid du Colombier void cclean(void); 1513e12c5d1SDavid du Colombier int isreg(Gen*); 1523e12c5d1SDavid du Colombier void outcode(int, Gen2*); 1533e12c5d1SDavid du Colombier void outhist(void); 1543e12c5d1SDavid du Colombier void zaddr(Gen*, int); 1553e12c5d1SDavid du Colombier void zname(char*, int, int); 1563e12c5d1SDavid du Colombier void ieeedtod(Ieee*, double); 1573e12c5d1SDavid du Colombier int filbuf(void); 1583e12c5d1SDavid du Colombier Sym* getsym(void); 1593e12c5d1SDavid du Colombier void domacro(void); 1603e12c5d1SDavid du Colombier void macund(void); 1613e12c5d1SDavid du Colombier void macdef(void); 1623e12c5d1SDavid du Colombier void macexpand(Sym*, char*); 1633e12c5d1SDavid du Colombier void macinc(void); 1643e12c5d1SDavid du Colombier void macprag(void); 1653e12c5d1SDavid du Colombier void maclin(void); 1663e12c5d1SDavid du Colombier void macif(int); 1673e12c5d1SDavid du Colombier void macend(void); 1683e12c5d1SDavid du Colombier void dodefine(char*); 1693e12c5d1SDavid du Colombier void prfile(long); 1703e12c5d1SDavid du Colombier void linehist(char*, int); 1713e12c5d1SDavid du Colombier void gethunk(void); 1723e12c5d1SDavid du Colombier void yyerror(char*, ...); 1733e12c5d1SDavid du Colombier int yyparse(void); 1747dd7cddfSDavid du Colombier void setinclude(char*); 1757dd7cddfSDavid du Colombier int assemble(char*); 1763e12c5d1SDavid du Colombier 1773e12c5d1SDavid du Colombier /* 1787dd7cddfSDavid du Colombier * system-dependent stuff from ../cc/compat.c 1793e12c5d1SDavid du Colombier */ 1807dd7cddfSDavid du Colombier enum /* keep in synch with ../cc/cc.h */ 1817dd7cddfSDavid du Colombier { 1827dd7cddfSDavid du Colombier Plan9 = 1<<0, 1837dd7cddfSDavid du Colombier Unix = 1<<1, 184375daca8SDavid du Colombier Windows = 1<<2 1857dd7cddfSDavid du Colombier }; 1867dd7cddfSDavid du Colombier int mywait(int*); 1873e12c5d1SDavid du Colombier int mycreat(char*, int); 1887dd7cddfSDavid du Colombier int systemtype(int); 1897dd7cddfSDavid du Colombier int pathchar(void); 1907dd7cddfSDavid du Colombier char* mygetwd(char*, int); 1917dd7cddfSDavid du Colombier int myexec(char*, char*[]); 1927dd7cddfSDavid du Colombier int mydup(int, int); 1937dd7cddfSDavid du Colombier int myfork(void); 1947dd7cddfSDavid du Colombier int mypipe(int*); 1957dd7cddfSDavid du Colombier void* mysbrk(ulong); 196