summaryrefslogtreecommitdiff
path: root/quadnames.c
diff options
context:
space:
mode:
authorPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-26 09:40:50 +0000
committerPeter Mikkelsen <petermikkelsen10@gmail.com>2022-01-26 09:40:50 +0000
commitbcaf7f25f42b21067a26895e097ada73765ba7d5 (patch)
treeccfb887cf08619c17b3afa3b517bfc3dcdfa18ad /quadnames.c
parent57a86f761605b6261d1045558c9cb7c83d723b60 (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.c35
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