1bd389b36SDavid du Colombier /* acid.h */ 2bd389b36SDavid du Colombier enum 3bd389b36SDavid du Colombier { 4bd389b36SDavid du Colombier Eof = -1, 5219b2ee8SDavid du Colombier Strsize = 4096, 6bd389b36SDavid du Colombier Hashsize = 128, 7219b2ee8SDavid du Colombier Maxarg = 512, 8bd389b36SDavid du Colombier NFD = 100, 9bd389b36SDavid du Colombier Maxproc = 50, 10bd389b36SDavid du Colombier Maxval = 10, 11219b2ee8SDavid du Colombier Mempergc = 1024*1024, 12bd389b36SDavid du Colombier }; 13bd389b36SDavid du Colombier 147dd7cddfSDavid du Colombier #pragma varargck type "L" void 157dd7cddfSDavid du Colombier 16bd389b36SDavid du Colombier typedef struct Node Node; 17bd389b36SDavid du Colombier typedef struct String String; 18bd389b36SDavid du Colombier typedef struct Lsym Lsym; 19bd389b36SDavid du Colombier typedef struct List List; 20bd389b36SDavid du Colombier typedef struct Store Store; 21bd389b36SDavid du Colombier typedef struct Gc Gc; 22bd389b36SDavid du Colombier typedef struct Strc Strc; 23bd389b36SDavid du Colombier typedef struct Rplace Rplace; 24bd389b36SDavid du Colombier typedef struct Ptab Ptab; 25bd389b36SDavid du Colombier typedef struct Value Value; 26bd389b36SDavid du Colombier typedef struct Type Type; 27219b2ee8SDavid du Colombier typedef struct Frtype Frtype; 28bd389b36SDavid du Colombier 297dd7cddfSDavid du Colombier Extern int kernel; 30219b2ee8SDavid du Colombier Extern int remote; 31bd389b36SDavid du Colombier Extern int text; 32219b2ee8SDavid du Colombier Extern int silent; 33bd389b36SDavid du Colombier Extern Fhdr fhdr; 34bd389b36SDavid du Colombier Extern int line; 35bd389b36SDavid du Colombier Extern Biobuf* bout; 36219b2ee8SDavid du Colombier Extern Biobuf* io[32]; 37219b2ee8SDavid du Colombier Extern int iop; 38bd389b36SDavid du Colombier Extern char symbol[Strsize]; 39bd389b36SDavid du Colombier Extern int interactive; 40bd389b36SDavid du Colombier Extern int na; 41bd389b36SDavid du Colombier Extern int wtflag; 42bd389b36SDavid du Colombier Extern Map* cormap; 43bd389b36SDavid du Colombier Extern Map* symmap; 44bd389b36SDavid du Colombier Extern Lsym* hash[Hashsize]; 45bd389b36SDavid du Colombier Extern long dogc; 46bd389b36SDavid du Colombier Extern Rplace* ret; 47bd389b36SDavid du Colombier Extern char* aout; 48bd389b36SDavid du Colombier Extern int gotint; 49bd389b36SDavid du Colombier Extern Gc* gcl; 50bd389b36SDavid du Colombier Extern int stacked; 51bd389b36SDavid du Colombier Extern jmp_buf err; 52219b2ee8SDavid du Colombier Extern Node* prnt; 53219b2ee8SDavid du Colombier Extern List* tracelist; 54219b2ee8SDavid du Colombier Extern int initialising; 55219b2ee8SDavid du Colombier Extern int quiet; 56*7c70c028SDavid du Colombier 57219b2ee8SDavid du Colombier extern void (*expop[])(Node*, Node*); 58219b2ee8SDavid du Colombier #define expr(n, r) (r)->comt=0; (*expop[(n)->op])(n, r); 59*7c70c028SDavid du Colombier extern int fmtsize(Value *v) ; 60bd389b36SDavid du Colombier 61bd389b36SDavid du Colombier enum 62bd389b36SDavid du Colombier { 63bd389b36SDavid du Colombier TINT, 64bd389b36SDavid du Colombier TFLOAT, 65bd389b36SDavid du Colombier TSTRING, 66bd389b36SDavid du Colombier TLIST, 67219b2ee8SDavid du Colombier TCODE, 68bd389b36SDavid du Colombier }; 69bd389b36SDavid du Colombier 70bd389b36SDavid du Colombier struct Type 71bd389b36SDavid du Colombier { 72bd389b36SDavid du Colombier Type* next; 73bd389b36SDavid du Colombier int offset; 74bd389b36SDavid du Colombier char fmt; 75219b2ee8SDavid du Colombier char depth; 76219b2ee8SDavid du Colombier Lsym* type; 77219b2ee8SDavid du Colombier Lsym* tag; 78219b2ee8SDavid du Colombier Lsym* base; 79219b2ee8SDavid du Colombier }; 80219b2ee8SDavid du Colombier 81219b2ee8SDavid du Colombier struct Frtype 82219b2ee8SDavid du Colombier { 83219b2ee8SDavid du Colombier Lsym* var; 84219b2ee8SDavid du Colombier Type* type; 85219b2ee8SDavid du Colombier Frtype* next; 86bd389b36SDavid du Colombier }; 87bd389b36SDavid du Colombier 88bd389b36SDavid du Colombier struct Ptab 89bd389b36SDavid du Colombier { 90bd389b36SDavid du Colombier int pid; 91bd389b36SDavid du Colombier int ctl; 92bd389b36SDavid du Colombier }; 93bd389b36SDavid du Colombier Extern Ptab ptab[Maxproc]; 94bd389b36SDavid du Colombier 95bd389b36SDavid du Colombier struct Rplace 96bd389b36SDavid du Colombier { 97bd389b36SDavid du Colombier jmp_buf rlab; 98219b2ee8SDavid du Colombier Node* stak; 99bd389b36SDavid du Colombier Node* val; 100bd389b36SDavid du Colombier Lsym* local; 101bd389b36SDavid du Colombier Lsym** tail; 102bd389b36SDavid du Colombier }; 103bd389b36SDavid du Colombier 104bd389b36SDavid du Colombier struct Gc 105bd389b36SDavid du Colombier { 106bd389b36SDavid du Colombier char gcmark; 107bd389b36SDavid du Colombier Gc* gclink; 108bd389b36SDavid du Colombier }; 109bd389b36SDavid du Colombier 110bd389b36SDavid du Colombier struct Store 111bd389b36SDavid du Colombier { 112bd389b36SDavid du Colombier char fmt; 113bd389b36SDavid du Colombier Type* comt; 114bd389b36SDavid du Colombier union { 1157dd7cddfSDavid du Colombier vlong ival; 116bd389b36SDavid du Colombier double fval; 117bd389b36SDavid du Colombier String* string; 118bd389b36SDavid du Colombier List* l; 119219b2ee8SDavid du Colombier Node* cc; 120bd389b36SDavid du Colombier }; 121bd389b36SDavid du Colombier }; 122bd389b36SDavid du Colombier 123bd389b36SDavid du Colombier struct List 124bd389b36SDavid du Colombier { 125bd389b36SDavid du Colombier Gc; 126bd389b36SDavid du Colombier List* next; 127bd389b36SDavid du Colombier char type; 128bd389b36SDavid du Colombier Store; 129bd389b36SDavid du Colombier }; 130bd389b36SDavid du Colombier 131bd389b36SDavid du Colombier struct Value 132bd389b36SDavid du Colombier { 133bd389b36SDavid du Colombier char set; 134bd389b36SDavid du Colombier char type; 135bd389b36SDavid du Colombier Store; 136bd389b36SDavid du Colombier Value* pop; 137bd389b36SDavid du Colombier Lsym* scope; 138bd389b36SDavid du Colombier Rplace* ret; 139bd389b36SDavid du Colombier }; 140bd389b36SDavid du Colombier 141bd389b36SDavid du Colombier struct Lsym 142bd389b36SDavid du Colombier { 143bd389b36SDavid du Colombier char* name; 144bd389b36SDavid du Colombier int lexval; 145bd389b36SDavid du Colombier Lsym* hash; 146bd389b36SDavid du Colombier Value* v; 147bd389b36SDavid du Colombier Type* lt; 148bd389b36SDavid du Colombier Node* proc; 149219b2ee8SDavid du Colombier Frtype* local; 150bd389b36SDavid du Colombier void (*builtin)(Node*, Node*); 151bd389b36SDavid du Colombier }; 152bd389b36SDavid du Colombier 153bd389b36SDavid du Colombier struct Node 154bd389b36SDavid du Colombier { 155bd389b36SDavid du Colombier Gc; 156bd389b36SDavid du Colombier char op; 157bd389b36SDavid du Colombier char type; 158bd389b36SDavid du Colombier Node* left; 159bd389b36SDavid du Colombier Node* right; 160bd389b36SDavid du Colombier Lsym* sym; 1610b459c2cSDavid du Colombier int builtin; 162bd389b36SDavid du Colombier Store; 163bd389b36SDavid du Colombier }; 164bd389b36SDavid du Colombier #define ZN (Node*)0 165bd389b36SDavid du Colombier 166bd389b36SDavid du Colombier struct String 167bd389b36SDavid du Colombier { 168bd389b36SDavid du Colombier Gc; 169bd389b36SDavid du Colombier char *string; 170bd389b36SDavid du Colombier int len; 171bd389b36SDavid du Colombier }; 172bd389b36SDavid du Colombier 173bd389b36SDavid du Colombier List* addlist(List*, List*); 174bd389b36SDavid du Colombier List* al(int); 175bd389b36SDavid du Colombier Node* an(int, Node*, Node*); 176bd389b36SDavid du Colombier void append(Node*, Node*, Node*); 177bd389b36SDavid du Colombier int bool(Node*); 178bd389b36SDavid du Colombier void build(Node*); 179bd389b36SDavid du Colombier void call(char*, Node*, Node*, Node*, Node*); 180bd389b36SDavid du Colombier void catcher(void*, char*); 181bd389b36SDavid du Colombier void checkqid(int, int); 182bd389b36SDavid du Colombier void cmd(void); 1834de34a7eSDavid du Colombier Node* con(vlong); 184bd389b36SDavid du Colombier List* construct(Node*); 185bd389b36SDavid du Colombier void ctrace(int); 186219b2ee8SDavid du Colombier void decl(Node*); 187219b2ee8SDavid du Colombier void defcomplex(Node*, Node*); 188bd389b36SDavid du Colombier void deinstall(int); 189bd389b36SDavid du Colombier void delete(List*, int n, Node*); 190bd389b36SDavid du Colombier void dostop(int); 191bd389b36SDavid du Colombier Lsym* enter(char*, int); 192bd389b36SDavid du Colombier void error(char*, ...); 193bd389b36SDavid du Colombier void execute(Node*); 194bd389b36SDavid du Colombier void fatal(char*, ...); 195bd389b36SDavid du Colombier void flatten(Node**, Node*); 196219b2ee8SDavid du Colombier void gc(void); 197219b2ee8SDavid du Colombier char* getstatus(int); 198bd389b36SDavid du Colombier void* gmalloc(long); 1994de34a7eSDavid du Colombier void indir(Map*, uvlong, char, Node*); 200bd389b36SDavid du Colombier void installbuiltin(void); 201bd389b36SDavid du Colombier void kinit(void); 2029a747e4fSDavid du Colombier int Lfmt(Fmt*); 203bd389b36SDavid du Colombier int listcmp(List*, List*); 204219b2ee8SDavid du Colombier int listlen(List*); 2054de34a7eSDavid du Colombier List* listvar(char*, vlong); 206219b2ee8SDavid du Colombier void loadmodule(char*); 207219b2ee8SDavid du Colombier void loadvars(void); 208bd389b36SDavid du Colombier Lsym* look(char*); 209bd389b36SDavid du Colombier void ltag(char*); 210219b2ee8SDavid du Colombier void marklist(List*); 211bd389b36SDavid du Colombier Lsym* mkvar(char*); 212bd389b36SDavid du Colombier void msg(int, char*); 213bd389b36SDavid du Colombier void notes(int); 214bd389b36SDavid du Colombier int nproc(char**); 215bd389b36SDavid du Colombier void nthelem(List*, int, Node*); 216bd389b36SDavid du Colombier int numsym(char); 217219b2ee8SDavid du Colombier void odot(Node*, Node*); 218bd389b36SDavid du Colombier void pcode(Node*, int); 219bd389b36SDavid du Colombier void pexpr(Node*); 220219b2ee8SDavid du Colombier int popio(void); 221bd389b36SDavid du Colombier void pstr(String*); 222219b2ee8SDavid du Colombier void pushfile(char*); 223219b2ee8SDavid du Colombier void pushstr(Node*); 224bd389b36SDavid du Colombier void readtext(char*); 225219b2ee8SDavid du Colombier void restartio(void); 2264de34a7eSDavid du Colombier uvlong rget(Map*, char*); 227219b2ee8SDavid du Colombier String *runenode(Rune*); 228bd389b36SDavid du Colombier int scmp(String*, String*); 229bd389b36SDavid du Colombier void sproc(int); 230bd389b36SDavid du Colombier String* stradd(String*, String*); 231ab3dc52fSDavid du Colombier String* straddrune(String*, Rune); 232bd389b36SDavid du Colombier String* strnode(char*); 233219b2ee8SDavid du Colombier String* strnodlen(char*, int); 2347dd7cddfSDavid du Colombier char* system(void); 2354de34a7eSDavid du Colombier void trlist(Map*, uvlong, uvlong, Symbol*); 236bd389b36SDavid du Colombier void unwind(void); 237219b2ee8SDavid du Colombier void userinit(void); 238bd389b36SDavid du Colombier void varreg(void); 239bd389b36SDavid du Colombier void varsym(void); 2409a747e4fSDavid du Colombier Waitmsg* waitfor(int); 241bd389b36SDavid du Colombier void whatis(Lsym*); 242219b2ee8SDavid du Colombier void windir(Map*, Node*, Node*, Node*); 243bd389b36SDavid du Colombier void yyerror(char*, ...); 244bd389b36SDavid du Colombier int yylex(void); 245bd389b36SDavid du Colombier int yyparse(void); 246bd389b36SDavid du Colombier 247bd389b36SDavid du Colombier enum 248bd389b36SDavid du Colombier { 249bd389b36SDavid du Colombier ONAME, 250bd389b36SDavid du Colombier OCONST, 251bd389b36SDavid du Colombier OMUL, 252bd389b36SDavid du Colombier ODIV, 253bd389b36SDavid du Colombier OMOD, 254bd389b36SDavid du Colombier OADD, 255bd389b36SDavid du Colombier OSUB, 256bd389b36SDavid du Colombier ORSH, 257bd389b36SDavid du Colombier OLSH, 258bd389b36SDavid du Colombier OLT, 259bd389b36SDavid du Colombier OGT, 260bd389b36SDavid du Colombier OLEQ, 261bd389b36SDavid du Colombier OGEQ, 262bd389b36SDavid du Colombier OEQ, 263bd389b36SDavid du Colombier ONEQ, 264bd389b36SDavid du Colombier OLAND, 265bd389b36SDavid du Colombier OXOR, 266bd389b36SDavid du Colombier OLOR, 267bd389b36SDavid du Colombier OCAND, 268bd389b36SDavid du Colombier OCOR, 269bd389b36SDavid du Colombier OASGN, 270bd389b36SDavid du Colombier OINDM, 271bd389b36SDavid du Colombier OEDEC, 272bd389b36SDavid du Colombier OEINC, 273bd389b36SDavid du Colombier OPINC, 274bd389b36SDavid du Colombier OPDEC, 275bd389b36SDavid du Colombier ONOT, 276bd389b36SDavid du Colombier OIF, 277bd389b36SDavid du Colombier ODO, 278bd389b36SDavid du Colombier OLIST, 279bd389b36SDavid du Colombier OCALL, 280bd389b36SDavid du Colombier OCTRUCT, 281bd389b36SDavid du Colombier OWHILE, 282bd389b36SDavid du Colombier OELSE, 283bd389b36SDavid du Colombier OHEAD, 284bd389b36SDavid du Colombier OTAIL, 285bd389b36SDavid du Colombier OAPPEND, 286bd389b36SDavid du Colombier ORET, 287bd389b36SDavid du Colombier OINDEX, 288bd389b36SDavid du Colombier OINDC, 289bd389b36SDavid du Colombier ODOT, 290bd389b36SDavid du Colombier OLOCAL, 291bd389b36SDavid du Colombier OFRAME, 292bd389b36SDavid du Colombier OCOMPLEX, 293bd389b36SDavid du Colombier ODELETE, 294219b2ee8SDavid du Colombier OCAST, 295219b2ee8SDavid du Colombier OFMT, 296219b2ee8SDavid du Colombier OEVAL, 297219b2ee8SDavid du Colombier OWHAT, 298bd389b36SDavid du Colombier }; 299