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