ref: 1da09c81867fc8416f99b8d7a24d73b2e3acf6e6
dir: /dat.h/
enum DataTag { DataAux, DataSession, DataSessionList, DataModule, DataModuleList, DataSymtab, DataSymbol, DataEnumeration, DataTokenList, DataArray, DataAst, DataByteCode, DataValueStack, DataCallStack, DataFunction, DataLocalList, DataErrorCtx, DataErrorTrap, DataMax, }; typedef struct DataSpec DataSpec; struct DataSpec { usize size; }; extern DataSpec dataspecs[DataMax]; /* memory.c */ typedef struct Symbol Symbol; typedef struct Symtab Symtab; struct Symbol { char *name; void *value; Qid qsymbol; Symtab *table; uvlong id; }; struct Symtab { RWLock lock; uvlong count; Symbol **symbols; }; typedef struct Module Module; struct Module { uvlong id; char *name; Symtab *symtab; Qid qsession; Qid qmodule; }; typedef struct ModuleList ModuleList; struct ModuleList { RWLock lock; uvlong count; Module **modules; }; typedef struct Session Session; struct Session { uvlong id; char *name; int active; /* is the session alive? */ ModuleList *modules; /* file server stuff */ Qid qsession; Qid qctl; Qid qcons; Qid qlog; Qid qmodules; Qid qthreads; QLock loglock; Rendez logwait; uvlong logsize; char *log; Channel *input; }; typedef struct Enumeration Enumeration; struct Enumeration { uvlong count; void **items; }; enum TokenTag { TokNumber, TokName, TokLparen, TokRparen, TokLbrack, TokRbrack, TokLbrace, TokRbrace, TokNewline, TokDiamond, TokPrimitive, TokDel, TokLarrow, TokSemi, TokString, TokEnd, }; typedef struct Token Token; struct Token { int tag; int nameclass; union { vlong num; /* TokNumber */ char *name; /* TokName: UTF-8 encoded name */ Rune *string; /* TokString: string contents */ int prim; /* TokPrimitive */ }; }; typedef struct TokenList TokenList; struct TokenList { uvlong count; Token *tokens; uvlong offset; }; enum ArrayType { TypeNumber, TypeChar, TypeArray, }; typedef struct Array Array; #pragma incomplete Array enum AstTag { AstProg, AstFunc, AstName, AstLocals, AstAssign, AstNiladic, AstMonadic, AstDyadic, AstConst, AstPrim, AstStrand, AstLater, /* parse at runtime */ }; typedef struct ByteCode ByteCode; typedef struct Ast Ast; struct Ast { int tag; char *name; int nameclass; int prim; int optional; /* optional left arg */ Ast *funcname; Ast *funcresult; Ast *funcleftarg; Ast *funcrightarg; Ast *funclocals; Ast *func; Ast *left; Ast *right; Array *val; TokenList *tokens; /* for AstLater */ uvlong childcount; Ast **children; }; enum Nameclass { NameclassUndef, /* Unknown name */ NameclassLocal, /* Local variable, but no value yet */ NameclassArray, /* Array value */ NameclassFunc, /* Function value */ }; struct ByteCode { uvlong count; u8int *instrs; }; enum Instr { IPushConst, IPushPrim, ILookup, IStrand, INiladic, IMonadic, IDyadic, IParse, IReturn, IAssign, ILocal, IPop, IDisplay, }; typedef struct ValueStack ValueStack; struct ValueStack { uvlong count; void **values; }; typedef struct Local Local; struct Local { uvlong id; void *value; }; typedef struct LocalList LocalList; struct LocalList { uvlong count; Local *list; }; typedef struct CallFrame CallFrame; struct CallFrame { /* Values stored when the frame is pushed */ ByteCode *code; uvlong offset; /* Old values of symbols before they were localised */ LocalList *locals; }; typedef struct CallStack CallStack; struct CallStack { uvlong count; CallFrame *frames; }; enum Valence { Niladic = 1, Monadic = 2, Dyadic = 4, Variadic = 6, }; typedef struct Function Function; struct Function { Ast *ast; int valence; int hasresult; uvlong symbol; ByteCode *code; int prim; }; enum ErrorNum { EAny, /* 0 = catch any error */ ESyntax, EValue, EInternal, EDomain, ErrorMax, }; typedef struct ErrorTrap ErrorTrap; struct ErrorTrap { jmp_buf env; int nums[ErrorMax]; }; typedef struct ErrorCtx ErrorCtx; struct ErrorCtx { char msg[4096]; int num; uvlong count; ErrorTrap **traps; };