diff options
author | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-26 09:40:50 +0000 |
---|---|---|
committer | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-26 09:40:50 +0000 |
commit | bcaf7f25f42b21067a26895e097ada73765ba7d5 (patch) | |
tree | ccfb887cf08619c17b3afa3b517bfc3dcdfa18ad /quadnames.c | |
parent | 57a86f761605b6261d1045558c9cb7c83d723b60 (diff) |
Implement a new "mixed" type which can be either of the three scalar types: int, float, rune. This allows scalar arrays with mixed scalar types
Diffstat (limited to 'quadnames.c')
-rw-r--r-- | quadnames.c | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/quadnames.c b/quadnames.c index 8ce54e1..2646840 100644 --- a/quadnames.c +++ b/quadnames.c @@ -16,6 +16,7 @@ void setdiv(Datum); Array *runfile(Array *); Array *quadthrow1(Array *); Array *quadthrow2(Array *, Array *); +Array *quadinfo(Array *); QuadnameDef quadnames[] = { {L"⎕", NameTag, getquad, setquad, nil, nil}, @@ -24,6 +25,7 @@ QuadnameDef quadnames[] = { {L"⎕DIV", NameTag, getdiv, setdiv, nil, nil}, {L"⎕RUN", FunctionTag, nil, nil, runfile, nil}, {L"⎕THROW", FunctionTag, nil, nil, quadthrow1, quadthrow2}, + {L"⎕INFO", FunctionTag, nil, nil, quadinfo, nil}, {nil, 0, nil, nil, nil, nil} /* MUST BE LAST */ }; @@ -190,4 +192,37 @@ quadthrow2(Array *msg, Array *code) throwerror(nil, ERank); throwerror(pparray(msg), code->intdata[0]); return nil; +} + +/* ⎕INFO */ +Array * +quadinfo(Array *a) +{ + if(a->type != AtypeRune) + throwerror(nil, EType); + Rune *code = pparray(a); + Datum *res = evalline(code, nil, 0); + Rune *info; + switch(res->tag){ + case ArrayTag:{ + char *typestring = "?"; + switch(res->array->type){ + case AtypeInt: typestring = "int"; break; + case AtypeFloat: typestring = "float"; break; + case AtypeRune: typestring = "rune"; break; + case AtypeMixed: typestring = "mixed"; break; + case AtypeArray: typestring = "array"; break; + } + uvlong size = arrayspaceused(res->array); + info = runesmprint("Type = %s, size in bytes = %ulld", typestring, size); + break; + } + default: + info = runesmprint("Can't show info for datum tag %d", res->tag); + } + Array *infoarr = mkrunearray(info); + free(code); + free(res); + free(info); + return infoarr; }
\ No newline at end of file |