17edc7532SDavid du Colombier #include <u.h> 27edc7532SDavid du Colombier #include <libc.h> 37edc7532SDavid du Colombier #include <bio.h> 4*f8bc6aafSDavid du Colombier #include "../4c/4.out.h" 57edc7532SDavid du Colombier 67edc7532SDavid du Colombier #ifndef EXTERN 77edc7532SDavid du Colombier #define EXTERN extern 87edc7532SDavid du Colombier #endif 97edc7532SDavid du Colombier 107edc7532SDavid du Colombier typedef struct Sym Sym; 117edc7532SDavid du Colombier typedef struct Gen Gen; 127edc7532SDavid du Colombier typedef struct Io Io; 137edc7532SDavid du Colombier typedef struct Hist Hist; 147edc7532SDavid du Colombier 15*f8bc6aafSDavid du Colombier #define MAXALIGN 7 167edc7532SDavid du Colombier #define FPCHIP 1 177edc7532SDavid du Colombier #define NSYMB 8192 187edc7532SDavid du Colombier #define BUFSIZ 8192 197edc7532SDavid du Colombier #define HISTSZ 20 207edc7532SDavid du Colombier #define NINCLUDE 10 217edc7532SDavid du Colombier #define NHUNK 10000 227edc7532SDavid du Colombier #define EOF (-1) 237edc7532SDavid du Colombier #define IGN (-2) 247edc7532SDavid du Colombier #define GETC() ((--fi.c < 0)? filbuf(): *fi.p++ & 0xff) 257edc7532SDavid du Colombier #define NHASH 503 267edc7532SDavid du Colombier #define STRINGSZ 200 277edc7532SDavid du Colombier #define NMACRO 10 287edc7532SDavid du Colombier 297edc7532SDavid du Colombier struct Sym 307edc7532SDavid du Colombier { 317edc7532SDavid du Colombier Sym* link; 327edc7532SDavid du Colombier char* macro; 337edc7532SDavid du Colombier vlong value; 347edc7532SDavid du Colombier ushort type; 357edc7532SDavid du Colombier char *name; 367edc7532SDavid du Colombier char sym; 377edc7532SDavid du Colombier }; 387edc7532SDavid du Colombier #define S ((Sym*)0) 397edc7532SDavid du Colombier 407edc7532SDavid du Colombier EXTERN struct 417edc7532SDavid du Colombier { 427edc7532SDavid du Colombier char* p; 437edc7532SDavid du Colombier int c; 447edc7532SDavid du Colombier } fi; 457edc7532SDavid du Colombier 467edc7532SDavid du Colombier struct Io 477edc7532SDavid du Colombier { 487edc7532SDavid du Colombier Io* link; 497edc7532SDavid du Colombier char b[BUFSIZ]; 507edc7532SDavid du Colombier char* p; 517edc7532SDavid du Colombier short c; 527edc7532SDavid du Colombier short f; 537edc7532SDavid du Colombier }; 547edc7532SDavid du Colombier #define I ((Io*)0) 557edc7532SDavid du Colombier 567edc7532SDavid du Colombier EXTERN struct 577edc7532SDavid du Colombier { 587edc7532SDavid du Colombier Sym* sym; 597edc7532SDavid du Colombier short type; 607edc7532SDavid du Colombier } h[NSYM]; 617edc7532SDavid du Colombier 627edc7532SDavid du Colombier struct Gen 637edc7532SDavid du Colombier { 647edc7532SDavid du Colombier Sym* sym; 65*f8bc6aafSDavid du Colombier vlong offset; 667edc7532SDavid du Colombier short type; 677edc7532SDavid du Colombier short reg; 687edc7532SDavid du Colombier short name; 697edc7532SDavid du Colombier double dval; 707edc7532SDavid du Colombier char sval[8]; 717edc7532SDavid du Colombier }; 727edc7532SDavid du Colombier 737edc7532SDavid du Colombier struct Hist 747edc7532SDavid du Colombier { 757edc7532SDavid du Colombier Hist* link; 767edc7532SDavid du Colombier char* name; 777edc7532SDavid du Colombier long line; 787edc7532SDavid du Colombier vlong offset; 797edc7532SDavid du Colombier }; 807edc7532SDavid du Colombier #define H ((Hist*)0) 817edc7532SDavid du Colombier 827edc7532SDavid du Colombier enum 837edc7532SDavid du Colombier { 847edc7532SDavid du Colombier CLAST, 857edc7532SDavid du Colombier CMACARG, 867edc7532SDavid du Colombier CMACRO, 87*f8bc6aafSDavid du Colombier CPREPROC 887edc7532SDavid du Colombier }; 897edc7532SDavid du Colombier 907edc7532SDavid du Colombier EXTERN char debug[256]; 917edc7532SDavid du Colombier EXTERN Sym* hash[NHASH]; 927edc7532SDavid du Colombier EXTERN char* Dlist[30]; 937edc7532SDavid du Colombier EXTERN int nDlist; 947edc7532SDavid du Colombier EXTERN Hist* ehist; 957edc7532SDavid du Colombier EXTERN int newflag; 967edc7532SDavid du Colombier EXTERN Hist* hist; 977edc7532SDavid du Colombier EXTERN char* hunk; 987edc7532SDavid du Colombier EXTERN char* include[NINCLUDE]; 997edc7532SDavid du Colombier EXTERN Io* iofree; 1007edc7532SDavid du Colombier EXTERN Io* ionext; 1017edc7532SDavid du Colombier EXTERN Io* iostack; 1027edc7532SDavid du Colombier EXTERN long lineno; 1037edc7532SDavid du Colombier EXTERN int nerrors; 1047edc7532SDavid du Colombier EXTERN long nhunk; 1057edc7532SDavid du Colombier EXTERN int nosched; 1067edc7532SDavid du Colombier EXTERN int ninclude; 1077edc7532SDavid du Colombier EXTERN Gen nullgen; 1087edc7532SDavid du Colombier EXTERN char* outfile; 1097edc7532SDavid du Colombier EXTERN int pass; 1107edc7532SDavid du Colombier EXTERN char* pathname; 1117edc7532SDavid du Colombier EXTERN vlong pc; 1127edc7532SDavid du Colombier EXTERN int peekc; 1137edc7532SDavid du Colombier EXTERN int sym; 1147edc7532SDavid du Colombier EXTERN char symb[NSYMB]; 1157edc7532SDavid du Colombier EXTERN int thechar; 1167edc7532SDavid du Colombier EXTERN char* thestring; 1177edc7532SDavid du Colombier EXTERN long thunk; 1187edc7532SDavid du Colombier EXTERN Biobuf obuf; 1197edc7532SDavid du Colombier 1207edc7532SDavid du Colombier void* alloc(long); 1217edc7532SDavid du Colombier void* allocn(void*, long, long); 1227edc7532SDavid du Colombier void errorexit(void); 1237edc7532SDavid du Colombier void pushio(void); 1247edc7532SDavid du Colombier void newio(void); 1257edc7532SDavid du Colombier void newfile(char*, int); 1267edc7532SDavid du Colombier Sym* slookup(char*); 1277edc7532SDavid du Colombier Sym* lookup(void); 1287edc7532SDavid du Colombier void syminit(Sym*); 1297edc7532SDavid du Colombier long yylex(void); 1307edc7532SDavid du Colombier int getc(void); 1317edc7532SDavid du Colombier int getnsc(void); 1327edc7532SDavid du Colombier void unget(int); 1337edc7532SDavid du Colombier int escchar(int); 1347edc7532SDavid du Colombier void cinit(void); 1357edc7532SDavid du Colombier void pinit(char*); 1367edc7532SDavid du Colombier void cclean(void); 1377edc7532SDavid du Colombier int isreg(Gen*); 1387edc7532SDavid du Colombier void outcode(int, Gen*, int, Gen*); 1397edc7532SDavid du Colombier void zname(char*, int, int); 1407edc7532SDavid du Colombier void zaddr(Gen*, int); 1417edc7532SDavid du Colombier void ieeedtod(Ieee*, double); 1427edc7532SDavid du Colombier int filbuf(void); 1437edc7532SDavid du Colombier Sym* getsym(void); 1447edc7532SDavid du Colombier void domacro(void); 1457edc7532SDavid du Colombier void macund(void); 1467edc7532SDavid du Colombier void macdef(void); 1477edc7532SDavid du Colombier void macexpand(Sym*, char*); 1487edc7532SDavid du Colombier void macinc(void); 1497edc7532SDavid du Colombier void maclin(void); 1507edc7532SDavid du Colombier void macprag(void); 1517edc7532SDavid du Colombier void macif(int); 1527edc7532SDavid du Colombier void macend(void); 1537edc7532SDavid du Colombier void outhist(void); 1547edc7532SDavid du Colombier void dodefine(char*); 1557edc7532SDavid du Colombier void prfile(long); 1567edc7532SDavid du Colombier void linehist(char*, int); 1577edc7532SDavid du Colombier void gethunk(void); 1587edc7532SDavid du Colombier void yyerror(char*, ...); 1597edc7532SDavid du Colombier int yyparse(void); 1607edc7532SDavid du Colombier void setinclude(char*); 1617edc7532SDavid du Colombier int assemble(char*); 1627edc7532SDavid du Colombier 1637edc7532SDavid du Colombier /* 1647edc7532SDavid du Colombier * system-dependent stuff from ../cc/compat.c 1657edc7532SDavid du Colombier */ 1667edc7532SDavid du Colombier 1677edc7532SDavid du Colombier enum /* keep in synch with ../cc/cc.h */ 1687edc7532SDavid du Colombier { 1697edc7532SDavid du Colombier Plan9 = 1<<0, 1707edc7532SDavid du Colombier Unix = 1<<1, 171*f8bc6aafSDavid du Colombier Windows = 1<<2 1727edc7532SDavid du Colombier }; 1737edc7532SDavid du Colombier int mywait(int*); 1747edc7532SDavid du Colombier int mycreat(char*, int); 1757edc7532SDavid du Colombier int systemtype(int); 1767edc7532SDavid du Colombier int pathchar(void); 1777edc7532SDavid du Colombier char* mygetwd(char*, int); 1787edc7532SDavid du Colombier int myexec(char*, char*[]); 1797edc7532SDavid du Colombier int mydup(int, int); 1807edc7532SDavid du Colombier int myfork(void); 1817edc7532SDavid du Colombier int mypipe(int*); 1827edc7532SDavid du Colombier void* mysbrk(ulong); 183