diff options
author | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-01-25 16:45:04 +0100 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@gmx.de> | 2013-01-25 16:45:04 +0100 |
commit | 98dd0aebef1c3bbc05750d534582392695f801f5 (patch) | |
tree | 57ce798d195c2bd5558b0c726137c6b963a1f733 /sys | |
parent | 180e04ee41f988e707078620bae65d598c91314c (diff) |
acme: fix unicode handling for editout (from sources)
Diffstat (limited to 'sys')
-rw-r--r-- | sys/src/cmd/acme/xfid.c | 59 |
1 files changed, 35 insertions, 24 deletions
diff --git a/sys/src/cmd/acme/xfid.c b/sys/src/cmd/acme/xfid.c index 3f7611f5d..bf3223ab1 100644 --- a/sys/src/cmd/acme/xfid.c +++ b/sys/src/cmd/acme/xfid.c @@ -260,7 +260,7 @@ xfidread(Xfid *x) int n, q; uint off; char *b; - char buf[128]; + char buf[256]; Window *w; q = FILE(x->f->qid); @@ -369,11 +369,42 @@ xfidread(Xfid *x) winunlock(w); } +static Rune* +fullrunewrite(Xfid *x, int *inr) +{ + int q, cnt, c, nb, nr; + Rune *r; + + q = x->f->nrpart; + cnt = x->count; + if(q > 0){ + memmove(x->data+q, x->data, cnt); /* there's room; see fsysproc */ + memmove(x->data, x->f->rpart, q); + cnt += q; + x->f->nrpart = 0; + } + r = runemalloc(cnt); + cvttorunes(x->data, cnt-UTFmax, r, &nb, &nr, nil); + /* approach end of buffer */ + while(fullrune(x->data+nb, cnt-nb)){ + c = nb; + nb += chartorune(&r[nr], x->data+c); + if(r[nr]) + nr++; + } + if(nb < cnt){ + memmove(x->f->rpart, x->data+nb, cnt-nb); + x->f->nrpart = cnt-nb; + } + *inr = nr; + return r; +} + void xfidwrite(Xfid *x) { Fcall fc; - int c, cnt, qid, q, nb, nr, eval; + int c, qid, nb, nr, eval; char buf[64], *err; Window *w; Rune *r; @@ -429,7 +460,7 @@ xfidwrite(Xfid *x) case Qeditout: case QWeditout: - r = bytetorune(x->data, &nr); + r = fullrunewrite(x, &nr); if(w) err = edittext(w, w->wrselrange.q1, r, nr); else @@ -504,27 +535,7 @@ xfidwrite(Xfid *x) goto BodyTag; BodyTag: - q = x->f->nrpart; - cnt = x->count; - if(q > 0){ - memmove(x->data+q, x->data, cnt); /* there's room; see fsysproc */ - memmove(x->data, x->f->rpart, q); - cnt += q; - x->f->nrpart = 0; - } - r = runemalloc(cnt); - cvttorunes(x->data, cnt-UTFmax, r, &nb, &nr, nil); - /* approach end of buffer */ - while(fullrune(x->data+nb, cnt-nb)){ - c = nb; - nb += chartorune(&r[nr], x->data+c); - if(r[nr]) - nr++; - } - if(nb < cnt){ - memmove(x->f->rpart, x->data+nb, cnt-nb); - x->f->nrpart = cnt-nb; - } + r = fullrunewrite(x, &nr); if(nr > 0){ wincommit(w, t); if(qid == QWwrsel){ |