richterm

"terminal emulator" with support for text fonts and images for plan9
git clone git://nsmpr.xyz/richterm.git
Log | Files | Refs | README

commit 569c4f884d4b3e5af1a6a33ccba698f1c14cfa4f
parent e9d452185710e8009db49c876c876312640455ec
Author: Pavel Renev <an2qzavok@gmail.com>
Date:   Tue, 17 Aug 2021 22:38:50 +0000

fix Array issues here and there

Diffstat:
MTODO | 2--
Mdevfs.c | 11++++++-----
Mfs.c | 40+++++++++++++++++++++++++++-------------
Mrichterm.c | 81++++++++++++++++++++++++++++++++++---------------------------------------------
Mrichterm.h | 9+++++++--
5 files changed, 75 insertions(+), 68 deletions(-)

diff --git a/TODO b/TODO @@ -3,5 +3,3 @@ Only store pointer offset in objects, so that offset of next obj is treated as e Remove Views and draw Objects directly, maybe even letter by letter. Keep track of object's positional info, such as start point, end poit and next line offset. - -After transitioning from Data to Array struct there are some inappropriate uses of Array (manual memory management instead of defined funcs, raw variable instead of pointer). Go over code and fix this. diff --git a/devfs.c b/devfs.c @@ -15,14 +15,15 @@ devfs_read(Req *r) { File *f; Devfsctl *dctl; - Array dv; + Array *dv; f = r->fid->file; dctl = f->aux; if (f == cons) { recv(dctl->rc, &dv); - r->ofcall.count = dv.n; - memcpy(r->ofcall.data, dv.p, dv.n); - free(dv.p); + //print("got: %s", dv->p); + r->ofcall.count = dv->count; + memcpy(r->ofcall.data, dv->p, dv->count); + arrayfree(dv); respond(r, nil); } else if (f == consctl) { respond(r, "not implemented"); @@ -59,7 +60,7 @@ initdevfs(void) dctl = mallocz(sizeof(Devfsctl), 1); dctl->wc = chancreate(sizeof(char *), 0); - dctl->rc = chancreate(sizeof(Array), 1024); + dctl->rc = chancreate(sizeof(Array *), 1024); srv.tree = alloctree("richterm", "richterm", DMDIR|0555, nil); if (srv.tree == nil) return nil; cons = createfile(srv.tree->root, "cons", "richterm", 0666, dctl); diff --git a/fs.c b/fs.c @@ -84,9 +84,7 @@ fs_read(Req *r) readstr(r, newobj->id); respond(r, nil); } else if (aux != nil) { - qlock(rich.l); - readbuf(r, aux->data->p, aux->data->n); - qunlock(rich.l); + aux->read(r); respond(r, nil); } else respond(r, "fs_read: f->aux is nil"); } @@ -94,8 +92,6 @@ fs_read(Req *r) void fs_write(Req *r) { - char *buf; - long n, m; File *f; Faux *aux; f = r->fid->file; @@ -112,14 +108,12 @@ fs_write(Req *r) } else if (aux != nil) { qlock(rich.l); /* TODO: this is not exactly finished */ - n = r->ifcall.offset + r->ifcall.count; - m = (r->ifcall.offset > aux->data->n) ? aux->data->n : r->ifcall.offset; - buf = mallocz(n + 1, 1); - memcpy(buf, aux->data->p, m); - memcpy(buf + r->ifcall.offset, r->ifcall.data, r->ifcall.count); - free(aux->data->p); - aux->data->p = buf; - aux->data->n = n; + + aux->data->count = 0; + arraygrow(aux->data, r->ifcall.offset + r->ifcall.count + 1); + memcpy(arrayget(aux->data, r->ifcall.offset), + r->ifcall.data, r->ifcall.count); + r->ofcall.count = r->ifcall.count; if (aux->type == FT_FONT) { @@ -156,3 +150,23 @@ initfs(void) threadpostmountsrv(&srv, "richterm", "/mnt/richterm", MREPL); return fsctl; } + +void +arrayread(Req *r) +{ + Faux *aux; + Array *data; + qlock(rich.l); + aux = r->fid->file->aux; + data = aux->data; + qlock(data->l); + readbuf(r, data->p, data->n); + qunlock(data->l); + qunlock(rich.l); +} + +void +arraywrite(Req *) +{ + /* stub */ +} diff --git a/richterm.c b/richterm.c @@ -34,7 +34,7 @@ Devfsctl *dctl; Fsctl *fsctl; Array *fonts; Image *Iscrollbar, *Ilink, *Inormbg, *Iselbg; -// Image *It1, *It2, *It3; + char *mitems[] = {"paste", "snarf", "plumb", nil}; void (*mfunc[])(Rich *) = {mpaste, msnarf, mplumb, nil}; @@ -68,7 +68,7 @@ threadmain(int argc, char **argv) int rv[2], mmode; Mouse mv; Rune kv; - Array dv; + Array *dv; ARGBEGIN{ case 'D': @@ -78,11 +78,6 @@ threadmain(int argc, char **argv) usage(); } ARGEND - //dv = (Data) {.p=nil, .n=0}; - dv.p = nil; - dv.n = 0; - dv.count = 0; - mmode = MM_NONE; if (initdraw(0, 0, "richterm") < 0) @@ -175,22 +170,20 @@ threadmain(int argc, char **argv) break; } if (kv == 0x08) { /* backspace */ - if (olast->dtext->n > 0) olast->dtext->n--; + if (olast->dtext->count > 0) olast->dtext->count--; redraw(1); break; } if (rich.objects->count > 0) { int n; + char *p; n = runelen(kv); qlock(rich.l); - olast->dtext->n+=n; - olast->dtext->p = realloc( - olast->dtext->p, olast->dtext->n + 1); + p = arraygrow(olast->dtext, n); - runetochar(olast->dtext->p + olast->dtext->n - n, &kv); - olast->dtext->p[olast->dtext->n] = '\0'; + runetochar(p, &kv); qunlock(rich.l); @@ -198,19 +191,18 @@ threadmain(int argc, char **argv) } if (kv == '\n') { Object *obj; - obj = mkobjectftree(newobject(&rich, nil), - fsctl->tree->root); - qlock(rich.l); - obj->dtext->n = olast->dtext->n; - obj->dtext->p = realloc(obj->dtext->p, obj->dtext->n); - memcpy(obj->dtext->p, olast->dtext->p, olast->dtext->n); + obj = mkobjectftree(newobject(&rich, nil), fsctl->tree->root); - olast->dtext->n = 0; + qlock(rich.l); + + dv = arraycreate(sizeof(char), olast->dtext->n, nil); + arraygrow(dv, olast->dtext->count); + memcpy(dv->p, olast->dtext->p, dv->count); - dv.p = mallocz(obj->dtext->n, 1); - dv.n = obj->dtext->n; - memcpy(dv.p, obj->dtext->p, dv.n); + arraygrow(obj->dtext, olast->dtext->n); + memcpy(obj->dtext->p, olast->dtext->p, olast->dtext->count); + olast->dtext->count = 0; qunlock(rich.l); @@ -508,7 +500,7 @@ generateviews(Rich *rich, Object *obj, View *v) views = rich->views; rprev = (v != nil) ? v->r : Rect(0, 0, 0, 0); - end = obj->dtext->p + obj->dtext->n; + end = obj->dtext->p + obj->dtext->count; sp = obj->dtext->p; for (p = sp, n = 0; p < end; p++, n++) { @@ -613,9 +605,7 @@ fauxalloc(Object *obj, Array *data, int type) { Faux *aux; aux = mallocz(sizeof(Faux), 1); - aux->obj = obj; - aux->data = data; - aux->type = type; + *aux = (Faux) {type, obj, data, arrayread, arraywrite}; return aux; } @@ -638,21 +628,22 @@ newobject(Rich *rich, char *text) *op = obj; - obj->dtext = mallocz(sizeof(Array), 1); - obj->dfont = mallocz(sizeof(Array), 1); - obj->dlink = mallocz(sizeof(Array), 1); - obj->dimage = mallocz(sizeof(Array), 1); + obj->dtext = arraycreate(sizeof(char), 4096, nil); + obj->dfont = arraycreate(sizeof(char), 4096, nil); + obj->dlink = arraycreate(sizeof(char), 4096, nil); + obj->dimage = arraycreate(sizeof(char), 4096, nil); if (text != nil) { - obj->dtext->p = text; - obj->dtext->n = strlen(text); - } else obj->dtext->p = strdup(""); + char *p; + p = arraygrow(obj->dtext, strlen(text)); + memcpy(p, text, strlen(text)); - obj->dfont->p = strdup(font->name); - obj->dfont->n = strlen(font->name); + p = arraygrow(rich->text, strlen(text)); + memcpy(p, text, strlen(text)); + }; - obj->dlink->p = strdup(""); - obj->dimage->p = strdup(""); + arraygrow(obj->dfont, strlen(font->name)); + memcpy(obj->dfont->p, font->name, strlen(font->name)); obj->id = smprint("%ulld", rich->idcount); @@ -847,7 +838,7 @@ getseltext(Rich *rich) for (om = arrayget(rich->objects, 0); *om != omin; om++); for (o = om, n = nmax - nmin; o[1] != omax; o++) - n += (*o)->dtext->n; + n += (*o)->dtext->count; d->n = n; d->p = malloc(n + 1); @@ -855,12 +846,12 @@ getseltext(Rich *rich) if ((*om)->dtext->p != nil) memcpy(d->p, (*om)->dtext->p + nmin, - (*om)->dtext->n - nmin); + (*om)->dtext->count - nmin); for (o = om + 1; o[1] != omax; o++) { if ((*o)->dtext->p != nil) - memcpy(d->p + n, (*o)->dtext->p, (*o)->dtext->n); - n += (*o)->dtext->n; + memcpy(d->p + n, (*o)->dtext->p, (*o)->dtext->count); + n += (*o)->dtext->count; } o++; @@ -872,9 +863,8 @@ getseltext(Rich *rich) } void -mpaste(Rich *rich) +mpaste(Rich *) { - print("plumbing\n"); } void @@ -901,8 +891,7 @@ msnarf(Rich *rich) } void -mplumb(Rich *rich) +mplumb(Rich *) { - print("plumbing\n"); } diff --git a/richterm.h b/richterm.h @@ -1,8 +1,6 @@ void redraw(int); void drawscrollbar(void); -typedef Array Data; - typedef struct Object Object; struct Object { @@ -102,6 +100,8 @@ struct Faux { int type; Object *obj; Array *data; + void (*read)(Req *); + void (*write)(Req *); }; enum { @@ -112,3 +112,8 @@ enum { }; Faux * fauxalloc(Object *, Array *, int); + +void textread(Req *); +void textwrite(Req *); +void arrayread(Req *); +void arraywrite(Req *);