1 #include <u.h> 2 #include <libc.h> 3 #include <bio.h> 4 #include "../5c/5.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 8192 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 name; 69 double dval; 70 char sval[8]; 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 Always = 14, 90 }; 91 92 EXTERN char debug[256]; 93 EXTERN Sym* hash[NHASH]; 94 EXTERN char* Dlist[30]; 95 EXTERN int nDlist; 96 EXTERN Hist* ehist; 97 EXTERN int newflag; 98 EXTERN Hist* hist; 99 EXTERN char* hunk; 100 EXTERN char* include[NINCLUDE]; 101 EXTERN Io* iofree; 102 EXTERN Io* ionext; 103 EXTERN Io* iostack; 104 EXTERN long lineno; 105 EXTERN int nerrors; 106 EXTERN long nhunk; 107 EXTERN int ninclude; 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 int isreg(Gen*); 139 void outcode(int, int, Gen*, int, Gen*); 140 void zname(char*, int, int); 141 void zaddr(Gen*, int); 142 void ieeedtod(Ieee*, double); 143 int filbuf(void); 144 Sym* getsym(void); 145 void domacro(void); 146 void macund(void); 147 void macdef(void); 148 void macexpand(Sym*, char*); 149 void macinc(void); 150 void maclin(void); 151 void macprag(void); 152 void macif(int); 153 void macend(void); 154 void outhist(void); 155 void dodefine(char*); 156 void prfile(long); 157 void linehist(char*, int); 158 void gethunk(void); 159 void yyerror(char*, ...); 160 int yyparse(void); 161 void setinclude(char*); 162 int assemble(char*); 163 164 /* 165 * system-dependent stuff from ../cc/compat.c 166 */ 167 168 enum /* keep in synch with ../cc/cc.h */ 169 { 170 Plan9 = 1<<0, 171 Unix = 1<<1, 172 Windows = 1<<2, 173 }; 174 int mywait(int*); 175 int mycreat(char*, int); 176 int systemtype(int); 177 int pathchar(void); 178 int myfork(void); 179 void* mysbrk(ulong); 180