/* Global definitions of limits and constants */ #define MAX_LINE_LENGTH 1024 #define MAX_LINE_TOKENS 1024 typedef enum { ArrayTag, FunctionTag, HybridTag, MonadicOpTag, DyadicOpTag, BoundFunctionTag, /* Function with left arg bound */ LParTag, RParTag, ArrowTag, AssignmentTag, NameTag, } datumTag; typedef enum { AtypeInt, AtypeFloat, AtypeRune, AtypeArray, } arrayDataType; typedef enum { OperatortypeDop, OperatortypePrim, } operatorType; typedef enum { FunctypeDfn, FunctypePrim, FunctypeOp, FunctypeQuad, } functionType; typedef enum { ESyntax = 1, EParse, EValue, EDomain, ERank, EType, ELength, EIndex, EShape, ENotImplemented, } errorCodes; /* Data types */ typedef struct Array Array; typedef struct Statement Statement; typedef struct Operator Operator; typedef struct Function Function; typedef struct Datum Datum; typedef struct Symbol Symbol; typedef struct Symtab Symtab; typedef struct QuadnameDef QuadnameDef; typedef struct ErrorHandler ErrorHandler; struct Array { arrayDataType type; int rank; int *shape; int size; int stranded; /* 1 if build directly by stranding */ int refs; /* reference counting */ union { char *rawdata; vlong *intdata; double *floatdata; Rune *runedata; Array **arraydata; }; }; struct Statement { int ntoks; Datum *toks; Statement *guard; Statement *next; }; struct Operator { operatorType type; int dyadic; union { int code; Rune *dop; }; Datum *left; Datum *right; }; struct Function { functionType type; union { int code; Rune *dfn; Operator operator; QuadnameDef *quad; }; Array *left; }; struct Datum { datumTag tag; int shy; union { Array *array; Statement stmt; Function func; Operator operator; Symbol *symbol; }; }; struct Symbol { int undefined; Rune *name; Datum value; Datum *(*getfn)(void); int (*setfn)(Datum); }; struct Symtab { int nsyms; int io; /* index origin */ Symbol **syms; }; typedef Array* (*fnmonad)(Array*); typedef Array* (*fndyad)(Array*, Array*); typedef Array* (*opmonad)(Datum *, Array *, Array *); typedef Array* (*opdyad)(Datum *, Datum *, Array *, Array *); struct QuadnameDef { Rune *name; datumTag tag; Datum *(*get)(void); int (*set)(Datum); fnmonad monadfn; fndyad dyadfn; opmonad monadop; opdyad dyadop; }; struct ErrorHandler { Rune *msg; jmp_buf jmp; }; /* Function prototypes for the different source files */ /* main.c */ Datum *evalline(Rune *, int); Rune *prompt(Rune *); /* print.c */ Rune *ppdatum(Datum); Rune *ppdatums(Datum *, int); Rune *pparray(Array *); Rune *ppoperator(Operator); /* lexer.c */ Statement *lexline(Rune *, int); /* array.c */ Array *mkscalarint(vlong); Array *mkscalarfloat(double); Array *mkscalarrune(Rune); Array *mkrunearray(Rune *); Array *duparray(Array *); int simplearray(Array *); int simplescalar(Array *); Array *extend(Array *, Array *); int scalarextend(Array *, Array *, Array **, Array **); int commontype(Array *, Array *, Array **, Array **, int); Array *arrayitem(Array *, int); Array *simplifyarray(Array *); int comparearray(Array *, Array *, int); Array *fillelement(Array *); /* eval.c */ Datum *eval(Statement *, int); /* symbol.c */ Symbol *getsym(Symtab *, Rune *); Symtab *newsymtab(void); void freesymtab(Symtab *); /* memory.c */ void *emalloc(ulong); void checkmem(char *); Array *allocarray(int, int, int); void freearray(Array *); void incref(Array *); /* functions.c */ Array *runfunc(Function, Array *,Array *); Array *rundfn(Rune *, Array *, Array *); /* quadnames.c */ Datum quadnamedatum(QuadnameDef); /* error.c */ void throwerror(Rune *, int); #define SETUPERROR(e) {\ jmp_buf old;\ memcpy(old, globalerror.jmp, sizeof(jmp_buf));\ e = setjmp(globalerror.jmp);\ if(e != 0)\ memcpy(globalerror.jmp, old, sizeof(jmp_buf));\ } /* Monadic functions from function.c */ Array *fnSame(Array *); Array *fnTally(Array *); Array *fnMix(Array *); Array *fnSplit(Array *); Array *fnEnclose(Array *); Array *fnNest(Array *); Array *fnGradeUp(Array *); Array *fnGradeDown(Array *); Array *fnIndexGenerator(Array *); Array *fnRavel(Array *); Array *fnTable(Array *); Array *fnShape(Array *); Array *fnReverseLast(Array *); Array *fnReverseFirst(Array *); Array *fnTranspose(Array *); /* Dyadic functions from function.c */ Array *fnPlus(Array *, Array *); Array *fnMinus(Array *, Array *); Array *fnTimes(Array *, Array *); Array *fnDivide(Array *, Array *); Array *fnPower(Array *, Array *); Array *fnLogarithm(Array *, Array *); Array *fnLeft(Array *, Array *); Array *fnRight(Array *, Array *); Array *fnMatch(Array *, Array *); Array *fnTake(Array *, Array *); Array *fnIndex(Array *, Array *); Array *fnCatenateFirst(Array *, Array *); Array *fnReshape(Array *, Array *); /* Monadic operators from operators.c */ Array *opEach(Datum *, Array *, Array *); Array *opSwitch(Datum *, Array *, Array *); /* Dyadic operators from operators.c */ Array *opOver(Datum *, Datum *, Array *, Array *); /* Global variables */ extern int traceeval; /* eval.c */ extern int debugmem; /* memory.c */ extern int datasizes[]; /* array.c */ extern Rune primfuncnames[]; /* functions.c */ extern Rune primmonopnames[]; /* operators.c */ extern Rune primdyadopnames[]; /* operators.c */ extern Rune primhybridnames[]; /* lexer.c */ extern fnmonad monadfunctiondefs[]; /* functions.c */ extern fndyad dyadfunctiondefs[]; /* functions.c */ extern opmonad monadoperatordefs[]; /* operators.c */ extern opdyad dyadoperatordefs[]; /* operators.c */ extern Symtab *globalsymtab; /* symbol.c */ extern Symtab *currentsymtab; /* symbol.c */ extern int alloccounts; /* memory.c */ extern QuadnameDef quadnames[]; /* quadnames.c */ extern int printprecision; /* print.c */ extern ErrorHandler globalerror; /* error.c */ extern Rune *errorstrs[]; /* error.c */