URI:
       tbetter \r handling - 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 0e25d6094f3afc39eea454adcbcb01827906ba3e
   DIR parent 7703861002dd128b498b18148ca0b7595bdb22a8
  HTML Author: rsc <devnull@localhost>
       Date:   Tue, 20 Apr 2004 06:49:32 +0000
       
       better \r handling
       
       Diffstat:
         M src/cmd/9term/9term.c               |      21 +++++++++++++++------
       
       1 file changed, 15 insertions(+), 6 deletions(-)
       ---
   DIR diff --git a/src/cmd/9term/9term.c b/src/cmd/9term/9term.c
       t@@ -88,7 +88,7 @@ void        doreshape(void);
        void        runewrite(Rune*, int);
        void        consread(void);
        void        conswrite(char*, int);
       -int        bswidth(Rune c);
       +int        bswidth(Rune c, uint start, int eatnl);
        void        cut(void);
        void        paste(Rune*, int, int);
        void        snarfupdate(void);
       t@@ -888,7 +888,7 @@ key(Rune r)
                case 0x15:        /* ^U: erase line */
                case 0x17:        /* ^W: erase word */
                        if (t.q0 != 0 && t.q0 != t.qh)
       -                        t.q0 -= bswidth(r);
       +                        t.q0 -= bswidth(r, t.q0, 1);
                        cut();
                        break;
                default:
       t@@ -900,7 +900,7 @@ key(Rune r)
        }
        
        int
       -bswidth(Rune c)
       +bswidth(Rune c, uint start, int eatnl)
        {
                uint q, eq, stop;
                Rune r;
       t@@ -909,7 +909,7 @@ bswidth(Rune c)
                /* there is known to be at least one character to erase */
                if(c == 0x08)        /* ^H: erase character */
                        return 1;
       -        q = t.q0;
       +        q = start;
                stop = 0;
                if(q > t.qh)
                        stop = t.qh;
       t@@ -917,7 +917,7 @@ bswidth(Rune c)
                while(q > stop){
                        r = t.r[q-1];
                        if(r == '\n'){                /* eat at most one more character */
       -                        if(q == t.q0)        /* eat the newline */
       +                        if(q == start && eatnl)        /* eat the newline */
                                        --q;
                                break; 
                        }
       t@@ -930,7 +930,7 @@ bswidth(Rune c)
                        }
                        --q;
                }
       -        return t.q0-q;
       +        return start-q;
        }
        
        int
       t@@ -1069,6 +1069,15 @@ runewrite(Rune *r, int n)
                                        initial++;
                                else
                                        --q;
       +                } else if(*p == '\r') {        /* treat like ^U */
       +                        /* convert CR without NL into erased line */
       +                        /* i feel really sleazy about this but it helps */
       +                        if(i<n-1 && *(p+1) != '\n'){
       +                                while(q > r && *(q-1) != '\n')
       +                                        q--;
       +                                if(q==r)
       +                                        initial = bswidth(0x15, t.qh, 0);
       +                        }
                        } else if(*p)
                                *q++ = *p;
                        p++;