1 #include <lib9.h> 2 #include <bio.h> 3 #include "../vc/v.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 8192 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 vlong 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 vlong offset; 65 short type; 66 short reg; 67 short name; 68 double dval; 69 char sval[8]; 70 }; 71 72 struct Hist 73 { 74 Hist* link; 75 char* name; 76 long line; 77 vlong offset; 78 }; 79 #define H ((Hist*)0) 80 81 enum 82 { 83 CLAST, 84 CMACARG, 85 CMACRO, 86 CPREPROC 87 }; 88 89 EXTERN char debug[256]; 90 EXTERN Sym* hash[NHASH]; 91 EXTERN char* Dlist[30]; 92 EXTERN int nDlist; 93 EXTERN Hist* ehist; 94 EXTERN int newflag; 95 EXTERN Hist* hist; 96 EXTERN char* hunk; 97 EXTERN char* include[NINCLUDE]; 98 EXTERN Io* iofree; 99 EXTERN Io* ionext; 100 EXTERN Io* iostack; 101 EXTERN long lineno; 102 EXTERN int nerrors; 103 EXTERN long nhunk; 104 EXTERN int nosched; 105 EXTERN int ninclude; 106 EXTERN Gen nullgen; 107 EXTERN char* outfile; 108 EXTERN int pass; 109 EXTERN char* pathname; 110 EXTERN long pc; 111 EXTERN int peekc; 112 EXTERN int sym; 113 EXTERN char symb[NSYMB]; 114 EXTERN int thechar; 115 EXTERN char* thestring; 116 EXTERN long thunk; 117 EXTERN Biobuf obuf; 118 119 void* alloc(long); 120 void* allocn(void*, long, long); 121 void errorexit(void); 122 void pushio(void); 123 void newio(void); 124 void newfile(char*, int); 125 Sym* slookup(char*); 126 Sym* lookup(void); 127 void syminit(Sym*); 128 long yylex(void); 129 int getc(void); 130 int getnsc(void); 131 void unget(int); 132 int escchar(int); 133 void cinit(void); 134 void pinit(char*); 135 void cclean(void); 136 int isreg(Gen*); 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 maclin(void); 149 void macprag(void); 150 void macif(int); 151 void macend(void); 152 void outhist(void); 153 void dodefine(char*); 154 void prfile(long); 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