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