summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apl9.h2
-rw-r--r--concurrency.c6
-rw-r--r--main.c16
-rw-r--r--quadnames.c89
-rw-r--r--tests/chain.apl3
5 files changed, 102 insertions, 14 deletions
diff --git a/apl9.h b/apl9.h
index ce30be9..cc4051c 100644
--- a/apl9.h
+++ b/apl9.h
@@ -329,6 +329,8 @@ Array *runtrain(Function *, int, Array *, Array *, Array *);
/* quadnames.c */
void initquadnames(void);
Datum *quadnamedatum(QuadnameDef);
+void setquotequad(Datum *);
+Array *runfile(Array *);
/* error.c */
ErrorGuard *newerrorguard(Array *, Statement *);
diff --git a/concurrency.c b/concurrency.c
index 31464f7..3eb6685 100644
--- a/concurrency.c
+++ b/concurrency.c
@@ -86,6 +86,7 @@ void
messagesend(Array *a, int id)
{
ThreadData *td = nil;
+ ThreadData *selftd = getthreaddata();
lock(&threadlock);
for(int i = 0; i < nthreads && td == nil; i++)
if(threads[i]->id == id)
@@ -94,7 +95,10 @@ messagesend(Array *a, int id)
if(td != nil){
qlock(&td->lock);
Mail *newmail = emalloc(sizeof(Mail));
- newmail->contents = fnSame(a);
+ newmail->contents = allocarray(AtypeArray, 1, 2);
+ newmail->contents->shape[0] = 2;
+ newmail->contents->arraydata[0] = mkscalarint(selftd->id);
+ newmail->contents->arraydata[1] = fnSame(a);
newmail->next = 0;
if(td->lastmail != nil)
td->lastmail->next = newmail;
diff --git a/main.c b/main.c
index d67d742..adcc662 100644
--- a/main.c
+++ b/main.c
@@ -7,6 +7,8 @@
#include "apl9.h"
Biobuf *stdin;
+static int booted = 0;
+static Rune *startfile = L"runtime/start.apl";
void
threadmain(int argc, char *argv[])
@@ -46,16 +48,22 @@ restart:
goto restart;
}
+ if(!booted){
+ booted = 1;
+ Array *path = mkrunearray(startfile);
+ runfile(path);
+ freearray(path);
+ }
+
while(!off){
checkmem("main loop");
- if(needsnewline){
+ /* if(needsnewline){
print("\n");
needsnewline = 0;
- }
- print("\t");
+ } */
Datum *result = evalline(nil, stdin, 1);
if(result && !result->shy)
- print("%S\n", ppdatum(result));
+ setquotequad(result);
freedatum(result);
/*
print("Unfreed arrays: %d\n", arrayalloccounts);
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 *
diff --git a/tests/chain.apl b/tests/chain.apl
index 62bc1a9..af09a2b 100644
--- a/tests/chain.apl
+++ b/tests/chain.apl
@@ -1,6 +1,3 @@
-send←⍈ ⍝ I can't type those easily so give them names
-recv←⍇
-
worker←{
msg←{1 ⍵}recv ⍬
⍵≡⍬: ⎕←'DONE'