summaryrefslogtreecommitdiff
path: root/quadnames.c
diff options
context:
space:
mode:
Diffstat (limited to 'quadnames.c')
-rw-r--r--quadnames.c89
1 files changed, 83 insertions, 6 deletions
diff --git a/quadnames.c b/quadnames.c
index e3d3ca8..90a76ff 100644
--- a/quadnames.c
+++ b/quadnames.c
@@ -6,9 +6,13 @@
#include "apl9.h"
Datum *getquotequad(void);
-void setquotequad(Datum *);
+/* void setquotequad(Datum *); in apl9.h */
Datum *getquad(void);
void setquad(Datum *);
+Datum *getquotequadrawio(void);
+void setquotequadrawio(Datum *);
+Datum *getquadrawio(void);
+void setquadrawio(Datum *);
Datum *getio(void);
void setio(Datum *);
Datum *getpp(void);
@@ -19,8 +23,10 @@ Datum *geta(void);
Datum *getd(void);
Datum *geten(void);
Datum *getself(void);
+Datum *getsession(void);
+void setsession(Datum *);
-Array *runfile(Array *);
+/* Array *runfile(Array *); in apl9.h */
Array *quadem(Array *);
Array *quadsignal1(Array *);
Array *quadsignal2(Array *, Array *);
@@ -34,10 +40,13 @@ Array *quadtasks2(Array *, Array *);
int needsnewline = 0;
static Rune *quadquotebuf = nil;
static Lock quadlock;
+static Array *session = nil;
QuadnameDef quadnames[] = {
{L"⍞", NameTag, getquotequad, setquotequad, nil, nil},
{L"⎕", NameTag, getquad, setquad, nil, nil},
+ {L"⍞RAWIO", NameTag, getquotequadrawio, setquotequadrawio, nil, nil},
+ {L"⎕RAWIO", NameTag, getquadrawio, setquadrawio, nil, nil},
{L"⎕IO", NameTag, getio, setio, nil, nil},
{L"⎕PP", NameTag, getpp, setpp, nil, nil},
{L"⎕DIV", NameTag, getdiv, setdiv, nil, nil},
@@ -45,6 +54,7 @@ QuadnameDef quadnames[] = {
{L"⎕D", NameTag, getd, nil, nil, nil},
{L"⎕EN", NameTag, geten, nil, nil, nil},
{L"⎕SELF", NameTag, getself, nil, nil, nil},
+ {L"⎕SESSION", NameTag, getsession, setsession, nil, nil},
{L"⎕RUN", FunctionTag, nil, nil, runfile, nil},
{L"⎕EM", FunctionTag, nil, nil, quadem, nil},
{L"⎕SIGNAL", FunctionTag, nil, nil, quadsignal1, quadsignal2},
@@ -99,6 +109,42 @@ quadnamedatum(QuadnameDef q)
Datum *
getquotequad(void)
{
+ return getquotequadrawio();
+}
+
+void
+setquotequad(Datum *d)
+{
+ Rune *str = ppdatum(d);
+ Array *strarray = mkrunearray(str);
+ if(session)
+ rundfn(L"0::⍞RAWIO←⍶ ⋄ ⍺ ⍈ ⍵", d, nil, strarray, session);
+ else
+ setquotequadrawio(d);
+ free(str);
+ freearray(strarray);
+}
+
+/* ⎕ */
+Datum *
+getquad(void)
+{
+ return getquadrawio();
+}
+
+void
+setquad(Datum *d)
+{
+ if(session)
+ rundfn(L"0::⎕RAWIO←⍶ ⋄ ⍶ ⍈ ⍵", d, nil, nil, session);
+ else
+ setquadrawio(d);
+}
+
+/* ⍞RAWIO */
+Datum *
+getquotequadrawio(void)
+{
lock(&quadlock);
int sizemax = 512;
int size;
@@ -130,9 +176,16 @@ getquotequad(void)
}
void
-setquotequad(Datum *new)
+setquotequadrawio(Datum *new)
{
+ if(new->tag == ArrayTag && GetType(new->array) == AtypeRune){
+ for(int i = 0; i < GetSize(new->array); i++)
+ print("%C", new->array->runedata[i]);
+ return;
+ }
lock(&quadlock);
+
+
Rune *str = ppdatum(new);
if(needsnewline && quadquotebuf != nil){
if(quadquotebuf){
@@ -151,9 +204,9 @@ setquotequad(Datum *new)
unlock(&quadlock);
}
-/* ⎕ */
+/* ⎕RAWIO */
Datum *
-getquad(void)
+getquadrawio(void)
{
print("⎕:\n\t");
Datum *result = evalline(nil, nil, 1);
@@ -162,8 +215,14 @@ getquad(void)
}
void
-setquad(Datum *new)
+setquadrawio(Datum *new)
{
+ if(new->tag == ArrayTag && GetType(new->array) == AtypeRune){
+ for(int i = 0; i < GetSize(new->array); i++)
+ print("%C", new->array->runedata[i]);
+ print("\n");
+ return;
+ }
lock(&quadlock);
needsnewline = 0;
print("%S\n", ppdatum(new));
@@ -261,6 +320,24 @@ getself(void)
return d;
}
+/* ⎕SELF */
+Datum *
+getsession(void)
+{
+ Datum *d = allocdatum(ArrayTag, 0);
+ d->array = fnSame(session);
+ return d;
+}
+
+void
+setsession(Datum *new)
+{
+ if(new->tag != ArrayTag
+ || GetRank(new->array) != 0
+ || GetType(new->array) != AtypeInt)
+ throwerror(nil, EDomain);
+ session = fnSame(new->array);
+}
/* ⎕RUN */
Array *