/*
* Copyright (c) 2024 Ross Cunniff
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
/* Note that the order of this enumeration is architected, and embedded
* in generated code. Changing the order breaks backward compatibility.
*/
typedef enum {
/* Procedure argument / local variable builtins */
BI_ARG = 0x00, /* arg(n) => argument #n */
BI_NARGS, /* nargs() => number of arguments */
BI_ARGVEC, /* argvec() => array of arguments */
BI_GETLOCAL, /* getlocal(offs) => local at stack[offs] */
BI_SETLOCAL, /* setlocal(offs,val) => stack[offs] = val */
BI_MATCHVEC, /* matchvec() => the match vector */
BI_SETGLOBAL, /* setglobal(offs,val) => globs[offs] = val */
BI_SETPROP, /* setprop(offs,val) => self[offs] = val */
/* Unused: 0x08 - 0x0F */
/* Type utilities */
BI_TYPEOF = 0x10, /* typeof(v) => type of v */
BI_TYPECHECK, /* typecheck(v,typ) => NIL (raise $TYPECHECK if fail) */
BI_IS_A, /* is_a(a,b) - true iff b is a parent of a */
BI_ISARRAY, /* isarray(a) => true iff a is an array */
BI_ISINTEGER, /* a.isinter() => true iff a has an integral type */
BI_ISFLOAT, /* a.isfloat() => true iff a has a floating pt type */
BI_ISCHAR, /* a.ischar() => true iff a has a character type */
BI_ISSTRING, /* a.isstring() => true iff a is a string or lstr */
BI_ARRBASE, /* a.arrbase() => base type of a, or Array if het. */
BI_ISNUMERIC, /* a.isnumeric() => true iff a is a numeric type */
BI_PROMOTE, /* a.promote(b) => promoted type of a op b */
BI_PACKTYPE, /* a.packtype(opt-rank) => packed arr type of base a */
/* Unused: 0x1C - 0x1F */
/* Memory management utilities */
BI_COPY = 0x20, /* copy(v) => copy of (possibly read-only) v */
BI_PERM, /* perm(a) => permanent copy of a */
BI_GC, /* gc() => nil - collect garbage */
BI_PROTECT, /* protect(a) => write-protected version of a */
BI_DEEP_COPY, /* deepcopy(v) => recursive copy of v */
BI_READONLY, /* readonly(a) or readonly(a,b) */
BI_TRANSIENT, /* transient(a) => true iff array a can go away */
BI_DELETED, /* deleted(obj) => true iff the object is a zombie */
/* Unused: 0x28 - 0x2F */
/* Control flow */
BI_SETJMP = 0x30, /* setjmp(a) => nil on set, lonjump v on jump */
BI_LONGJMP, /* longjmp(a,v) => does not return */
BI_HALT, /* halt() - does not return (halts current thread) */
BI_SAVE, /* save(v) - returns true/false/nil dep on restore */
BI_RESTORE, /* restore(v) - does not return if successful */
BI_RESTART, /* restart() - does not return if successful */
/* Unused: 0x36 - 0x3F */
/* Misc numerics */
BI_FIX2FLT = 0x40, /* fix2flt(a,typ) => (a / (tmax(typeof(a)))) => typ */
BI_FLT2FIX, /* flt2fix(a,typ) => (a * tmax(typ)) => typ */
BI_MIN, /* min(a,b) => (a < b) ? a : b */
BI_MAX, /* max(a,b) => (a > b) ? a : b */
BI_CLAMP, /* clamp(a,mn,mx) => (a<mn) ? mn : ((a>mx) : mx : a) */
BI_LERP, /* lerp(a,mn,mx) => (1-a)*mn + a*mx (a clamped 0..1) */
BI_SATADD, /* satadd(a,b,mn,mx) => clamp(a+b,mn,mx) */
BI_SATSUB, /* satsub(a,b,mn,mx) => clamp(a-b,mn,mx) */
BI_ABS, /* abs(a) => absolute value of a */
BI_SIGNUM, /* signum(a) => signum of a (-1, 0, 1) */
/* Unused: 0x4A - 0x4F */
/* Internal variables */
BI_ERR_50 = 0x50, /* Unused for now */
BI_ERR_51, /* Unused for now */
BI_INTR_PUSH, /* intrpush() - returns depth of intrinsic stack */
BI_INTR_POP, /* intrpop() - pops the intrinsic stack */
BI_INTR_EXIT, /* intrexit() - resets the intrinsic stack */
/* Unused: 0x55 - 0x5F */
/* Array / dict handling */
BI_ARRAY = 0x60, /* array(shape) => n-element array */
BI_PACKED, /* packed(type,shape) => shaped packed array of type */
BI_STRING, /* string(n) => n-element string */
BI_LSTRING, /* lstring(n) => n-element wide string */
BI_PACK, /* pack(a) => packed version of array a */
BI_UNPACK, /* unpack(a) => generic array version of packed a */
BI_LENGTH, /* length(a) => length of array a (elem 0 of shape) */
BI_SHAPE, /* shape(a) => shape of array a */
BI_RANK, /* rank(a) => shape of array a */
BI_CONCAT, /* concat(a,b) => a ## b */
BI_SUBR, /* subr(val,i1,i2,...,in) => val[i1:i2,...,in-1,in] */
BI_ITERATE, /* iterate(shape) => {0,1,2,3,...,n-1} */
BI_RESHAPE, /* reshape(v,shape) => reshaped copy of v */
BI_DICT, /* dict(n) => dictionary of size n */
BI_SIZEOF, /* sizeof(arr) => total # of elements of arr */
BI_WIDTH, /* width(arr) => length of last axis of arr */
/* More array operations */
BI_REDUCE = 0x70, /* arr.reduce(op,ax) */
BI_ACCUM, /* arr.accum(op,ax) */
BI_INNER, /* arr1.inner(op,arr2) */
BI_ENCLOSE, /* arr.enclose(ax) */
BI_OUTER, /* arr1.outer(op1,op2,arr2) */
BI_REPLICATE, /* arr.replicate(vec,ax) */
BI_DISCLOSE, /* encl.disclose() */
BI_REVERSE, /* arr.reverse(ax) */
BI_ROTATE, /* arr.rotate(ax) */
BI_TRANSPOSE, /* arr.transpose(ax) */
BI_TAKE, /* arr.take(vec,ax) */
BI_DROP, /* arr.drop(vec,ax) */
BI_RAVEL, /* arr.ravel(ax) */
BI_LAMINATE, /* arr1.laminate(arr2,ax) */
BI_MEMBER, /* arr1.member(arr2) */
BI_POSITION, /* arr1.position(vec) */
/* Even more array operations */
BI_ENCODE = 0x80, /* arr.encode(vec) */
BI_DECODE, /* arr1.decode(arr2) */
BI_SORT, /* arr.sort() */
BI_UNIQUE, /* vec.unique() */
BI_UNION, /* vec.union(arr) */
BI_INTERSECT, /* vec.intersect(arr) */
BI_WITHOUT, /* vec.without(arr) */
BI_INCREMENT, /* idx.increment(shp) - odometer function */
BI_STRIDE, /* arr.stride() - return the array stride */
BI_VECSUM, /* vecsum(vec) - sum of a vector w/o promotion - no pub! */
BI_GETIDX, /* arr.getidx#(idxarr) */
BI_SETIDX, /* arr.setidx#(idxarr ## val) */
BI_ARRCMP, /* arr1.arrcmp(vec2) - like strcmp but generalized */
BI_FLATTEN, /* arr.flatten() - returns a vector with no nesting */
BI_NREDUCE, /* arr.nreduce(nred,op,ax) */
/* Unused: 0x8F - 0xCF */
/* I/O builtins */
BI_SAY = 0xD0, /* say(a,b,c,...) or f.say(a,b,c,...) */
BI_CLOSE, /* f.close() */
BI_READSTR, /* a = readstr() or a = f.readstr() */
BI_PRINT, /* print(fmt,a,b,c,...) or f.print(fmt,a,b,c,...) */
BI_READ, /* arr = f.read(fmt,t,...) or arr = f.read(t,...) */
BI_WRITE, /* f.write(a,b,c,...) */
BI_FORMAT, /* a = format(fmt, a, b, c) */
BI_REWIND, /* f.rewind() */
BI_FSEEK, /* f.fseek(pos) */
BI_GETCHAR, /* c = f.getchar() */
BI_PUTCHAR, /* f.putchar(c) */
BI_FFLUSH, /* f.fflush() */
BI_UNGETC, /* f.ungetc(c) */
BI_GETLIST, /* a = f.getlist() */
BI_PUTLIST, /* f.putlist(a,b,c,...) */
/* Unused: 0xDF - 0xDF */
/* I/O attribute builtins */
BI_FERROR = 0xE0, /* err = f.ferror() */
BI_FEOF, /* tf = f.feof() */
BI_FTELL, /* pos = f.ftell() */
BI_BINARY, /* tf = f.binary() */
BI_ISPIPE, /* tf = f.ispipe() */
BI_GETSWAB, /* tf = f.getswab() */
BI_SETSWAB, /* f.setswab(tf) */
BI_CLEARERR, /* f.clearerr() */
/* Other attribute builtins */
BI_MINVAL = 0xE8, /* typ.minval() */
BI_MAXVAL = 0xE9, /* typ.maxval() */
/* #LIST / #EDIT builtins */
BI_X_LIST = 0xEA, /* f.list(val,name) */
BI_X_EDIT, /* f.edit(name) */
/* Unused: 0xEC - 0xEF */
/* Pseudo-builtins - not directly callable with procedure syntax */
BI_NEW = 0xF0, /* new(cls,obj) - create object with given class */
BI_TYPECONV, /* typeconv(val,typ) => (val => typ) */
BI_ASSERT, /* assert(expr) => nil (throws $ASSERT$ if false) */
BI_MKLIST, /* mklist(v0,v1,...,vn) => {v0,v1,...,vn} */
BI_MKDICT, /* mkdict(v0,v1,...,v2n+1) => <<<v0,v1,...,v2n+1>>> */
BI_MKARR, /* mkarr(rank,s0,..,v0,...) => [[v0,...],[...],...] */
BI_MIN_N, /* min(a,b,...,z) => minimum value of elements */
BI_MAX_N, /* max(a,b,...,z) => maximum value of elements */
BI_CONCAT_N, /* concat(a,b,...,z) => a ## b ## ... ## z */
BI_ITERATOR, /* [a:b:c] => a b c ITERATOR */
BI_MKSUBARR, /* val n mksubarr => new array with n dims */
BI_OBJPROP, /* obj offs objprop => obj[objprop] - for debugger */
BI_SETOBJPROP, /* obj offs val setobjprop - for debugger */
BI_MKMATRIX, /* mkmatrix(rank,s0,...,v0,...) => #{{v0,...],[...],...] */
/* Unused: 0xFE - 0xFF */
} Builtins;
typedef enum {
/* Architectural publics */
PUB_PARENT = 0,
PUB_CREATE = 1,
PUB_DESTROY = 2,
PUB_ASSIGN = 3,
PUB_OP_COMPLETE = 4,
PUB_NUM_ARCHITECTURAL, // Pseudo-public, not allocated
/* operators for overloading */
PUB_OP_OR = PUB_NUM_ARCHITECTURAL,
PUB_OP_XOR,
PUB_OP_AND,
PUB_OP_LT,
PUB_OP_GT,
PUB_OP_PLUS,
PUB_OP_MINUS,
PUB_OP_MUL,
PUB_OP_DIV,
PUB_OP_MOD,
PUB_OP_NOT,
PUB_OP_BANG,
PUB_OP_EQEQ,
PUB_OP_ARR_EQ,
PUB_OP_NE,
PUB_OP_LE,
PUB_OP_GE,
PUB_OP_LSHIFT,
PUB_OP_RSHIFT,
PUB_OP_CALL,
PUB_OP_INDEX,
PUB_OP_INDEX_ASSIGN,
PUB_OP_EQGT,
PUB_OP_MATCHES,
PUB_OP_POW,
PUB_OP_HASH_IDX,
PUB_OP_HASH_IDX_ASSIGN,
PUB_OP_INC,
PUB_OP_DEC,
PUB_OP_NEGATIVE,
/* Right-arg versions of overloaded operators */
PUB_OP_OR_R,
PUB_OP_XOR_R,
PUB_OP_AND_R,
PUB_OP_LT_R,
PUB_OP_GT_R,
PUB_OP_PLUS_R,
PUB_OP_MINUS_R,
PUB_OP_MUL_R,
PUB_OP_DIV_R,
PUB_OP_MOD_R,
PUB_OP_EQEQ_R,
PUB_OP_ARR_EQ_R,
PUB_OP_NE_R,
PUB_OP_LE_R,
PUB_OP_GE_R,
PUB_OP_LSHIFT_R,
PUB_OP_RSHIFT_R,
PUB_OP_EQGT_R,
PUB_OP_MATCHES_R,
PUB_OP_POW_R,
// Public versions of builtins - overloadable
PUB_ISARRAY, // val.isarray()
PUB_ISINTEGER, // val.isinteger()
PUB_ISFLOAT, // val.isfloat()
PUB_ISCHAR, // val.ischar()
PUB_ISSTRING, // val.isstring()
PUB_ARRBASE, // val.arrbase()
PUB_ISNUMERIC, // val.isnumeric()
PUB_PROMOTE, // val.promote(other)
PUB_PACKTYPE, // val.packtype(opt-rank)
PUB_PACK, // arr.pack()
PUB_UNPACK, // arr.unpack()
PUB_LENGTH, // arr.length()
PUB_WIDTH, // arr.width()
PUB_SHAPE, // arr.shape()
PUB_RANK, // arr.rank()
PUB_CONCAT, // arr.concat(other)
PUB_SUBR, // arr.subr(args)
PUB_ITERATE, // arr.iterate()
PUB_RESHAPE, // arr.reshape(args)
PUB_SIZEOF, // val.sizeof()
PUB_COPY, // val.copy()
PUB_DEEP_COPY, // val.deepcopy()
PUB_FIX2FLT, // val.fix2flt(typ)
PUB_FLT2FIX, // val.flt2fix(typ)
PUB_MIN, // val.min(other)
PUB_MAX, // val.max(other)
PUB_CLAMP, // val.clamp(min,max)
PUB_LERP, // val.lerp(min,max)
PUB_SATADD, // val.satadd(other)
PUB_SATSUB, // val.satsub(other)
PUB_ABS, // val.abs()
PUB_SIGNUM, // val.signum()
PUB_REDUCE, // val.reduce(op)
PUB_ACCUM, // val.accum(op)
PUB_INNER, // val.inner(op,other)
PUB_ENCLOSE, // val.enclose(ax)
PUB_OUTER, // val.outer(op1,op2,other)
PUB_REPLICATE, // val.replicate(other,ax)
PUB_DISCLOSE, // val.disclose()
PUB_REVERSE, // val.reverse(ax)
PUB_ROTATE, // val.rotate(ax)
PUB_TRANSPOSE, // val.transpose(ax)
PUB_TAKE, // val.take(num,ax)
PUB_DROP, // val.drop(num,ax)
PUB_RAVEL, // val.ravel(ax)
PUB_LAMINATE, // val.laminate(other,ax)
PUB_MEMBER, // val.member(other)
PUB_POSITION, // val.position(other)
PUB_ENCODE, // val.encode(other)
PUB_DECODE, // val.decode(other)
PUB_SORT, // val.sort()
PUB_UNIQUE, // val.unique()
PUB_UNION, // val.union(other)
PUB_INTERSECT, // val.intersect(other)
PUB_WITHOUT, // val.without(other)
PUB_INCREMENT, // arr.increment(shape)
PUB_STRIDE, // arr.stride()
PUB_ARRCMP, // arr.arrcmp(otharr)
PUB_FLATTEN, // arr.flatten()
PUB_NREDUCE, // arr.nreduce()
PUB_READONLY, // arr.readonly()
PUB_TRANSIENT, // arr.transient()
PUB_SAY, // f.say(a,b,c,...)
PUB_CLOSE, // f.close()
PUB_READSTR, // f.readstr()
PUB_PRINT, // f.print(fmt,a,b,c,...)
PUB_READ, // f.read()
PUB_WRITE, // f.write()
PUB_REWIND, // f.rewind()
PUB_FSEEK, // f.fseek()
PUB_GETCHAR, // f.getchar()
PUB_PUTCHAR, // f.putchar()
PUB_FFLUSH, // f.fflush()
PUB_UNGETC, // f.ungetc(c)
PUB_FERROR, // f.ferror()
PUB_FEOF, // f.feof()
PUB_FTELL, // f.ftell()
PUB_BINARY, // f.binary()
PUB_ISPIPE, // f.ispipe()
PUB_GETSWAB, // f.getswab()
PUB_SETSWAB, // f.setswab()
PUB_CLEARERR, // f.clearerr()
PUB_GETLIST, // f.getlist()
PUB_PUTLIST, // f.putlist()
PUB_MINVAL, // typ.minval()
PUB_MAXVAL, // typ.maxval()
PUB_NUM_PUBLICS // Always keep as the last public!
} PredefPublics;
#define V_PARENT OadlVar(OADL_VT_PUBLIC, PUB_PARENT)
#define V_CREATE OadlVar(OADL_VT_PUBLIC, PUB_CREATE)
#define V_DESTROY OadlVar(OADL_VT_PUBLIC, PUB_DESTROY)
#define V_COMPLETE OadlVar(OADL_VT_PUBLIC, PUB_OP_COMPLETE)
typedef enum {
GLOB_TYPE_PROMOTE, // Type promotion
GLOB_FIELD_WIDTH, // Printing field width
GLOB_NUM_DIGITS, // Printing num digits
GLOB_NUM_EXPONENT, // Printing num exponent digits
GLOB_INT_RADIX, // Radix for printing ints
GLOB_FLT_FORMAT_CHAR, // Float format char
GLOB_INT_FORMAT_CHAR, // Int format char
GLOB_FORMAT_FLAGS, // Printing flags
GLOB_MONETARY_FILL, // Monetary fill char
GLOB_CALC_PROMPT1, // First-level prompt for calculator
GLOB_CALC_PROMPT2, // Second-level prompt for calculator
GLOB_ITER_OPTIM, // Optimize iterators?
GLOB_ARGVEC, // Argument vector
GLOB_TERM_ROWS, // $ROWS
GLOB_TERM_COLUMNS, // $COLUMNS
GLOB_EDITOR, // $EDITOR
GLOB_NUM_GLOBALS // Always keep as last global!
} PredefGlobals;
extern const char *OADL_BuiltinNames[256];
extern const char OADL_BuiltinKinds[256];
#if defined(OADL_DEFINE_BUILTIN_TABLE) // [
const char *OADL_BuiltinNames[256] = {
"arg", "nargs", "argvec", "getlocal", // 00
"setlocal", "matchvec", "setglobal", "setprop", // 04
0, 0, 0, 0, // 08
0, 0, 0, 0, // 0C
"typeof", "typecheck", "is_a", "isarray", // 10
"isinteger", "isfloat", "ischar", "isstring", // 14
"arrbase", "isnumeric", "promote", "packtype", // 18
0, 0, 0, 0, // 1C
"copy", "perm", "gc", "protect", // 20
"deepcopy", "readonly", "transient", "deleted", // 24
0, 0, 0, 0, // 28
0, 0, 0, 0, // 2C
"setjmp", "longjmp", "halt", "save", // 30
"restore", "restart", 0, 0, // 34
0, 0, 0, 0, // 38
0, 0, 0, 0, // 3C
"fix2flt", "flt2fix", "min", "max", // 40
"clamp", "lerp", "satadd", "satsub", // 44
"abs", "signum", 0, 0, // 48
0, 0, 0, 0, // 4C
0, 0, "intrpush", "intrpop", // 50
"intrexit", 0, 0, 0, // 54
0, 0, 0, 0, // 58
0, 0, 0, 0, // 5C
"array", "packed", "string", "lstring", // 60
"pack", "unpack", "length", "shape", // 64
"rank", "concat", "subr", "iterate", // 68
"reshape", "dict", "sizeof", "width", // 6C
"reduce", "accum", "inner", "enclose", // 70
"outer", "replicate", "disclose", "reverse", // 74
"rotate", "transpose", "take", "drop", // 78
"ravel", "laminate", "member", "position", // 7C
"encode", "decode", "sort", "unique", // 80
"union", "intersect", "without", "increment", // 84
"stride", "vecsum", "getidx", "setidx", // 88
"arrcmp", "flatten", "nreduce", 0, // 8C
0, 0, 0, 0, // 90
0, 0, 0, 0, // 94
0, 0, 0, 0, // 98
0, 0, 0, 0, // 9C
0, 0, 0, 0, // A0
0, 0, 0, 0, // A4
0, 0, 0, 0, // A8
0, 0, 0, 0, // AC
0, 0, 0, 0, // B0
0, 0, 0, 0, // B4
0, 0, 0, 0, // B8
0, 0, 0, 0, // BC
0, 0, 0, 0, // C0
0, 0, 0, 0, // C4
0, 0, 0, 0, // C8
0, 0, 0, 0, // CC
"say", "close", "readstr", "print", // D0
"read", "write", "format", "rewind", // D4
"fseek", "getchar", "putchar", "fflush", // D8
"ungetc", 0, 0, 0, // DC
"ferror", "feof", "ftell", "binary", // E0
"ispipe", "getswab", "setswab", "clearerr", // E4
"minval", "maxval", "list", "edit", // E8
0, 0, 0, 0, // EC
0, 0, 0, 0, // F0
0, 0, 0, 0, // F4
0, 0, 0, 0, // F8
0, 0, 0, 0, // FC
};
// In this table, the entries have the following meanings:
// 0 - never enter the name
// 1 - always enter the name into the "oadl" namespace
// 2 - conditionally enter the name into the "oadl" namespace
// 3 - always enter the name into the global namespace
const char OADL_BuiltinKinds[256] = {
1, 1, 1, 2, // arg nargs argvec getlocal 00
2, 1, 2, 2, // setlocal matchvec setglobal setprop 04
0, 0, 0, 0, // 0 0 0 0 08
0, 0, 0, 0, // 0 0 0 0 0C
3, 1, 1, 2, // typeof typecheck is_a isarray 10
0, 0, 0, 0, // isinteger isfloat ischar isstring 14
2, 2, 2, 2, // arrbase isnumeric promote packtype 18
0, 0, 0, 0, // 0 0 0 0 1C
2, 1, 1, 1, // copy perm gc protect 20
2, 1, 1, 1, // deepcopy readonly transient deleted 24
0, 0, 0, 0, // 0 0 0 0 28
0, 0, 0, 0, // 0 0 0 0 2C
1, 1, 1, 1, // setjmp longjmp halt save 30
1, 1, 0, 0, // restore restart 0 0 34
0, 0, 0, 0, // 0 0 0 0 38
0, 0, 0, 0, // 0 0 0 0 3C
2, 2, 2, 2, // fix2flt flt2fix min max 40
2, 2, 2, 2, // clamp lerp satadd satsub 44
2, 2, 0, 0, // abs signum 0 0 48
0, 0, 0, 0, // 0 0 0 0 4C
0, 0, 2, 2, // 0 0 intrpush intrpop 50
2, 0, 0, 0, // intrexit 0 0 0 54
0, 0, 0, 0, // 0 0 0 0 58
0, 0, 0, 0, // 0 0 0 0 5C
2, 2, 2, 2, // array packed string lstring 60
2, 2, 1, 2, // pack unpack length shape 64
2, 2, 2, 2, // rank concat subr iterate 68
2, 2, 2, 0, // reshape dict sizeof width 6C
2, 0, 0, 2, // reduce accum inner enclose 70
0, 0, 2, 0, // outer replicate disclose reverse 74
0, 0, 0, 0, // rotate transpose take drop 78
0, 0, 0, 0, // ravel laminate member position 7C
0, 0, 0, 0, // encode decode sort unique 80
0, 0, 0, 0, // union intersect without increment 84
0, 2, 0, 0, // stride vecsum getidx setidx 88
2, 0, 0, 0, // arrcmp flatten 0 0 8C
0, 0, 0, 0, // 0 0 0 0 90
0, 0, 0, 0, // 0 0 0 0 94
0, 0, 0, 0, // 0 0 0 0 98
0, 0, 0, 0, // 0 0 0 0 9C
0, 0, 0, 0, // 0 0 0 0 A0
0, 0, 0, 0, // 0 0 0 0 A4
0, 0, 0, 0, // 0 0 0 0 A8
0, 0, 0, 0, // 0 0 0 0 AC
0, 0, 0, 0, // 0 0 0 0 B0
0, 0, 0, 0, // 0 0 0 0 B4
0, 0, 0, 0, // 0 0 0 0 B8
0, 0, 0, 0, // 0 0 0 0 BC
0, 0, 0, 0, // 0 0 0 0 C0
0, 0, 0, 0, // 0 0 0 0 C4
0, 0, 0, 0, // 0 0 0 0 C8
0, 0, 0, 0, // 0 0 0 0 CC
3, 0, 3, 3, // say close readstr print D0
3, 0, 3, 0, // read write format rewind D4
0, 3, 3, 0, // fseek getchar putchar fflush D8
3, 0, 0, 0, // ungetc 0 0 0 DC
0, 0, 0, 0, // ferror feof ftell binary E0
0, 0, 0, 0, // ispipe getswab setswab clearerr E4
0, 0, 0, 0, // minval maxval list edit E8
0, 0, 0, 0, // 0 0 0 0 EC
0, 0, 0, 0, // 0 0 0 0 F0
0, 0, 0, 0, // 0 0 0 0 F4
0, 0, 0, 0, // 0 0 0 0 F8
0, 0, 0, 0, // 0 0 0 0 FC
};
#endif // ]