tacme: correct writes of runes on auspicious byte boundaries - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 5b6028903dc9a0d1561a54764a520aaa1b1100e4
 (DIR) parent ca9ae08876bc9ce2107fac50cf703760ecf10901
 (HTM) Author: Erik Quanstrom <quanstro@quanstro.net>
       Date:   Fri,  5 Oct 2012 16:42:25 -0400
       
       acme: correct writes of runes on auspicious byte boundaries
       
       R=rsc, r
       CC=plan9port.codebot
       http://codereview.appspot.com/6586067
       
       Diffstat:
         M CONTRIBUTORS                        |       1 +
         M src/cmd/acme/xfid.c                 |      57 ++++++++++++++++++-------------
       
       2 files changed, 35 insertions(+), 23 deletions(-)
       ---
 (DIR) diff --git a/CONTRIBUTORS b/CONTRIBUTORS
       t@@ -17,6 +17,7 @@ David Jeannot <djeannot24@gmail.com>
        David Swasey <david.swasey@gmail.com>
        Enrique Soriano <enrique.soriano@gmail.com>
        Eoghan Sherry <ejsherry@gmail.com>
       +Erik Quanstrom <quanstro@quanstro.net>
        Fazlul Shahriar <fshahriar@gmail.com>
        Ingo Dreilich <yngoto@gmail.com>
        Justin Davis <jrcd83@gmail.com>
 (DIR) diff --git a/src/cmd/acme/xfid.c b/src/cmd/acme/xfid.c
       t@@ -403,11 +403,42 @@ shouldscroll(Text *t, uint q0, int qid)
                return t->org <= q0 && q0 <= t->org+t->fr.nchars;
        }
        
       +static Rune*
       +fullrunewrite(Xfid *x, int *inr)
       +{
       +        int q, cnt, c, nb, nr;
       +        Rune *r;
       +
       +        q = x->f->nrpart;
       +        cnt = x->fcall.count;
       +        if(q > 0){
       +                memmove(x->fcall.data+q, x->fcall.data, cnt);        /* there's room; see fsysproc */
       +                memmove(x->fcall.data, x->f->rpart, q);
       +                cnt += q;
       +                x->f->nrpart = 0;
       +        }
       +        r = runemalloc(cnt);
       +        cvttorunes(x->fcall.data, cnt-UTFmax, r, &nb, &nr, nil);
       +        /* approach end of buffer */
       +        while(fullrune(x->fcall.data+nb, cnt-nb)){
       +                c = nb;
       +                nb += chartorune(&r[nr], x->fcall.data+c);
       +                if(r[nr])
       +                        nr++;
       +        }
       +        if(nb < cnt){
       +                memmove(x->f->rpart, x->fcall.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;
       t@@ -463,7 +494,7 @@ xfidwrite(Xfid *x)
        
                case Qeditout:
                case QWeditout:
       -                r = bytetorune(x->fcall.data, &nr);
       +                r = fullrunewrite(x, &nr);
                        if(w)
                                err = edittext(w, w->wrselrange.q1, r, nr);
                        else
       t@@ -538,27 +569,7 @@ xfidwrite(Xfid *x)
                        goto BodyTag;
        
                BodyTag:
       -                q = x->f->nrpart;
       -                cnt = x->fcall.count;
       -                if(q > 0){
       -                        memmove(x->fcall.data+q, x->fcall.data, cnt);        /* there's room; see fsysproc */
       -                        memmove(x->fcall.data, x->f->rpart, q);
       -                        cnt += q;
       -                        x->f->nrpart = 0;
       -                }
       -                r = runemalloc(cnt);
       -                cvttorunes(x->fcall.data, cnt-UTFmax, r, &nb, &nr, nil);
       -                /* approach end of buffer */
       -                while(fullrune(x->fcall.data+nb, cnt-nb)){
       -                        c = nb;
       -                        nb += chartorune(&r[nr], x->fcall.data+c);
       -                        if(r[nr])
       -                                nr++;
       -                }
       -                if(nb < cnt){
       -                        memmove(x->f->rpart, x->fcall.data+nb, cnt-nb);
       -                        x->f->nrpart = cnt-nb;
       -                }
       +                r = fullrunewrite(x, &nr);
                        if(nr > 0){
                                wincommit(w, t);
                                if(qid == QWwrsel){