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