URI: 
       tacme: save/restore multiline tags in Dump/Load - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit d28913a9e6609fef96f5baf6e9f4d5055ede744c
   DIR parent a0691bc460cbef889d017a640034f3321bd36b9d
  HTML Author: Russ Cox <rsc@swtch.com>
       Date:   Tue, 14 Jan 2020 16:38:34 -0500
       
       acme: save/restore multiline tags in Dump/Load
       
       The dump substitutes each \n in a multiline tag with a 0xff byte.
       Since it is not valid UTF it cannot occur in an ordinary dump file.
       Old acmes will just read it in as an error rune.
       
       Fixes #135.
       Fixes #153.
       
       Diffstat:
         M src/cmd/acme/rows.c                 |      20 ++++++++++++++++----
       
       1 file changed, 16 insertions(+), 4 deletions(-)
       ---
   DIR diff --git a/src/cmd/acme/rows.c b/src/cmd/acme/rows.c
       t@@ -316,7 +316,7 @@ rowclean(Row *row)
        void
        rowdump(Row *row, char *file)
        {
       -        int i, j, fd, m, n, dumped;
       +        int i, j, fd, m, n, start, dumped;
                uint q0, q1;
                Biobuf *b;
                char *buf, *a, *fontname;
       t@@ -434,9 +434,17 @@ rowdump(Row *row, char *file)
                                m = min(RBUFSIZE, w->tag.file->b.nc);
                                bufread(&w->tag.file->b, 0, r, m);
                                n = 0;
       -                        while(n<m && r[n]!='\n')
       -                                n++;
       -                        Bprint(b, "%.*S\n", n, r);
       +                        while(n<m) {
       +                                start = n;
       +                                while(n<m && r[n]!='\n')
       +                                        n++;
       +                                Bprint(b, "%.*S", n-start, r+start);
       +                                if(n<m) {
       +                                        Bputc(b, 0xff); // \n in tag becomes 0xff byte (invalid UTF)
       +                                        n++;
       +                                }
       +                        }
       +                        Bprint(b, "\n");
                                if(dumped){
                                        q0 = 0;
                                        q1 = t->file->b.nc;
       t@@ -719,6 +727,10 @@ rowload(Row *row, char *file, int initing)
                        if(l == nil)
                                goto Rescue2;
                        l[Blinelen(b)-1] = 0;
       +                /* convert 0xff in multiline tag back to \n */
       +                for(i = 0; l[i] != 0; i++)
       +                        if((uchar)l[i] == 0xff)
       +                                l[i] = '\n';
                        r = bytetorune(l+5*12, &nr);
                        ns = -1;
                        for(n=0; n<nr; n++){