1 #include <u.h> 2 #include <libc.h> 3 #include <bio.h> 4 #include "../vc/v.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 vlong 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 vlong 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 vlong 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 nosched; 106 EXTERN int ninclude; 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 int isreg(Gen*); 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 maclin(void); 150 void macprag(void); 151 void macif(int); 152 void macend(void); 153 void outhist(void); 154 void dodefine(char*); 155 void prfile(long); 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