diff options
author | Peter Mikkelsen <peter@pmikkelsen.com> | 2022-02-09 01:16:03 +0000 |
---|---|---|
committer | Peter Mikkelsen <peter@pmikkelsen.com> | 2022-02-09 01:16:03 +0000 |
commit | 6ed5b9f6d3fdeeed8ecd43b18bae642ec1ec24b1 (patch) | |
tree | cee3f787af7fb7e8b892fb661f63dc9248cd5f61 /quadnames.c | |
parent | 8fd005f6185ac76ed0ac2495bd97ee817b472040 (diff) |
Add much better memory handling (We now track and free Datum * structs)
Diffstat (limited to 'quadnames.c')
-rw-r--r-- | quadnames.c | 74 |
1 files changed, 33 insertions, 41 deletions
diff --git a/quadnames.c b/quadnames.c index 7d5884c..57c5dbb 100644 --- a/quadnames.c +++ b/quadnames.c @@ -6,15 +6,15 @@ #include "apl9.h" Datum *getquotequad(void); -void setquotequad(Datum); +void setquotequad(Datum *); Datum *getquad(void); -void setquad(Datum); +void setquad(Datum *); Datum *getio(void); -void setio(Datum); +void setio(Datum *); Datum *getpp(void); -void setpp(Datum); +void setpp(Datum *); Datum *getdiv(void); -void setdiv(Datum); +void setdiv(Datum *); Datum *geta(void); Datum *getd(void); Datum *getself(void); @@ -66,26 +66,25 @@ initquadnames(void) } } -Datum +Datum * quadnamedatum(QuadnameDef q) { - Datum d; - d.tag = q.tag; + Datum *d = allocdatum(q.tag, 0); switch(q.tag){ case NameTag: - d.name = q.name; + d->name = runestrdup(q.name); break; case FunctionTag: - d.func.type = FunctypeQuad; - d.func.quad = malloc(sizeof(QuadnameDef)); - *d.func.quad = q; - d.func.left = nil; + d->func.type = FunctypeQuad; + d->func.quad = emalloc(sizeof(QuadnameDef)); + *d->func.quad = q; + d->func.left = nil; break; case MonadicOpTag: case DyadicOpTag: default: print("Can't use quad names with type=%d\n", q.tag); - exits(nil); + threadexitsall(nil); } return d; } @@ -104,21 +103,20 @@ getquotequad(void) sizemax = size+1; quadquotebuf = nil; }else{ - input = malloc(sizeof(Rune) * sizemax); + input = emalloc(sizeof(Rune) * sizemax); size = 0; } do{ if(size == sizemax-1){ sizemax += 512; - input = realloc(input, sizeof(Rune) * sizemax); + input = erealloc(input, sizeof(Rune) * sizemax); } input[size] = Bgetrune(stdin); size++; }while(input[size-1] != '\n'); input[size-1] = 0; - Datum *result = mallocz(sizeof(Datum), 1); - result->tag = ArrayTag; + Datum *result = allocdatum(ArrayTag, 0); result->array = mkrunearray(input); free(input); unlock(&quadlock); @@ -126,7 +124,7 @@ getquotequad(void) } void -setquotequad(Datum new) +setquotequad(Datum *new) { lock(&quadlock); Rune *str = ppdatum(new); @@ -158,7 +156,7 @@ getquad(void) } void -setquad(Datum new) +setquad(Datum *new) { lock(&quadlock); needsnewline = 0; @@ -170,65 +168,61 @@ setquad(Datum new) Datum * getio(void) { - Datum *d = mallocz(sizeof(Datum), 1); - d->tag = ArrayTag; + Datum *d = allocdatum(ArrayTag, 0); d->array = mkscalarint(globalIO()); return d; } void -setio(Datum new) +setio(Datum *new) { - if(new.tag != ArrayTag || new.array->rank != 0 || new.array->type != AtypeInt || (new.array->intdata[0] != 0 && new.array->intdata[0] != 1)) + if(new->tag != ArrayTag || new->array->rank != 0 || new->array->type != AtypeInt || (new->array->intdata[0] != 0 && new->array->intdata[0] != 1)) throwerror(nil, EDomain); else - globalIOset(new.array->intdata[0]); + globalIOset(new->array->intdata[0]); } /* ⎕PP */ Datum * getpp(void) { - Datum *d = mallocz(sizeof(Datum), 1); - d->tag = ArrayTag; + Datum *d = allocdatum(ArrayTag, 0); d->array = mkscalarint(printprecision); return d; } void -setpp(Datum new) +setpp(Datum *new) { - if(new.tag != ArrayTag || new.array->rank != 0 || new.array->type != AtypeInt || new.array->intdata[0] < 0) + if(new->tag != ArrayTag || new->array->rank != 0 || new->array->type != AtypeInt || new->array->intdata[0] < 0) throwerror(nil, EDomain); else - printprecision = new.array->intdata[0]; + printprecision = new->array->intdata[0]; } /* ⎕DIV */ Datum * getdiv(void) { - Datum *d = mallocz(sizeof(Datum), 1); - d->tag = ArrayTag; + Datum *d = allocdatum(ArrayTag, 0); d->array = mkscalarint(globalDIV()); return d; } void -setdiv(Datum new) +setdiv(Datum *new) { - if(new.tag != ArrayTag || new.array->rank != 0 || new.array->type != AtypeInt || (new.array->intdata[0] != 0 && new.array->intdata[0] != 1)) + if(new->tag != ArrayTag || new->array->rank != 0 || new->array->type != AtypeInt || (new->array->intdata[0] != 0 && new->array->intdata[0] != 1)) throwerror(nil, EDomain); else - globalDIVset(new.array->intdata[0]); + globalDIVset(new->array->intdata[0]); } /* ⎕A */ Datum * geta(void) { - Datum *d = mallocz(sizeof(Datum), 1); - d->tag = ArrayTag; + Datum *d = allocdatum(ArrayTag, 0); d->array = mkrunearray(L"ABCDEFGHIJKLMNOPQRSTUVWXYZ"); return d; } @@ -237,8 +231,7 @@ geta(void) Datum * getd(void) { - Datum *d = mallocz(sizeof(Datum), 1); - d->tag = ArrayTag; + Datum *d = allocdatum(ArrayTag, 0); d->array = mkrunearray(L"0123456789"); return d; } @@ -247,8 +240,7 @@ getd(void) Datum * getself(void) { - Datum *d = mallocz(sizeof(Datum), 1); - d->tag = ArrayTag; + Datum *d = allocdatum(ArrayTag, 0); d->array = mkscalarint(threadid()); return d; } |