summaryrefslogtreecommitdiff
path: root/quadnames.c
diff options
context:
space:
mode:
Diffstat (limited to 'quadnames.c')
-rw-r--r--quadnames.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/quadnames.c b/quadnames.c
index 5632cd4..7d5884c 100644
--- a/quadnames.c
+++ b/quadnames.c
@@ -1,5 +1,6 @@
#include <u.h>
#include <libc.h>
+#include <thread.h>
#include <bio.h>
#include "apl9.h"
@@ -16,6 +17,7 @@ Datum *getdiv(void);
void setdiv(Datum);
Datum *geta(void);
Datum *getd(void);
+Datum *getself(void);
Array *runfile(Array *);
Array *quadthrow1(Array *);
@@ -23,9 +25,11 @@ Array *quadthrow2(Array *, Array *);
Array *quadinfo(Array *);
Array *quadproto(Array *);
Array *quaducs(Array *);
+Array *quaddl(Array *);
int needsnewline = 0;
static Rune *quadquotebuf = nil;
+static Lock quadlock;
QuadnameDef quadnames[] = {
{L"⍞", NameTag, getquotequad, setquotequad, nil, nil},
@@ -35,11 +39,13 @@ QuadnameDef quadnames[] = {
{L"⎕DIV", NameTag, getdiv, setdiv, nil, nil},
{L"⎕A", NameTag, geta, nil, nil, nil},
{L"⎕D", NameTag, getd, nil, nil, nil},
+ {L"⎕SELF", NameTag, getself, nil, nil, nil},
{L"⎕RUN", FunctionTag, nil, nil, runfile, nil},
{L"⎕THROW", FunctionTag, nil, nil, quadthrow1, quadthrow2},
{L"⎕INFO", FunctionTag, nil, nil, quadinfo, nil},
{L"⎕PROTO", FunctionTag, nil, nil, quadproto, nil},
{L"⎕UCS", FunctionTag, nil, nil, quaducs, nil},
+ {L"⎕DL", FunctionTag, nil, nil, quaddl, nil},
{nil, 0, nil, nil, nil, nil} /* MUST BE LAST */
};
@@ -88,6 +94,7 @@ quadnamedatum(QuadnameDef q)
Datum *
getquotequad(void)
{
+ lock(&quadlock);
int sizemax = 512;
int size;
Rune *input;
@@ -114,12 +121,14 @@ getquotequad(void)
result->tag = ArrayTag;
result->array = mkrunearray(input);
free(input);
+ unlock(&quadlock);
return result;
}
void
setquotequad(Datum new)
{
+ lock(&quadlock);
Rune *str = ppdatum(new);
if(needsnewline && quadquotebuf != nil){
if(quadquotebuf){
@@ -135,6 +144,7 @@ setquotequad(Datum new)
needsnewline = 1;
print("%S", str);
free(str);
+ unlock(&quadlock);
}
/* ⎕ */
@@ -150,8 +160,10 @@ getquad(void)
void
setquad(Datum new)
{
+ lock(&quadlock);
needsnewline = 0;
print("%S\n", ppdatum(new));
+ unlock(&quadlock);
}
/* ⎕IO */
@@ -231,6 +243,17 @@ getd(void)
return d;
}
+/* ⎕SELF */
+Datum *
+getself(void)
+{
+ Datum *d = mallocz(sizeof(Datum), 1);
+ d->tag = ArrayTag;
+ d->array = mkscalarint(threadid());
+ return d;
+}
+
+
/* ⎕RUN */
Array *
runfile(Array *a)
@@ -337,4 +360,23 @@ quaducs(Array *a)
}else
throwerror(nil, EType);
return res;
+}
+
+/* ⎕DL */
+Array *
+quaddl(Array *a)
+{
+ /* TODO: return amount of seconds slept */
+ if(a->size != 1)
+ throwerror(nil, ELength);
+ if(a->type != AtypeInt && a->type != AtypeFloat)
+ throwerror(nil, EType);
+
+ if(a->type == AtypeInt && a->intdata[0] >= 0)
+ sleep(a->intdata[0] * 1000);
+ else if(a->type == AtypeFloat && a->floatdata[0] >= 0)
+ sleep(a->floatdata[0] * 1000);
+ else
+ throwerror(nil, EDomain);
+ return fnSame(a);
} \ No newline at end of file