URI: 
       trc: handle utf-8 in $ifs - 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 72f66c2d3ca556d35b818158e9de578c4bfa153e
   DIR parent c4071243a591037f159e15618364521133b8d7ec
  HTML Author: Russ Cox <rsc@swtch.com>
       Date:   Sun,  2 Jan 2011 13:43:20 -0500
       
       rc: handle utf-8 in $ifs
       
       R=rsc
       http://codereview.appspot.com/3798046
       
       Diffstat:
         M src/cmd/rc/havefork.c               |      24 ++++++++++++++++--------
       
       1 file changed, 16 insertions(+), 8 deletions(-)
       ---
   DIR diff --git a/src/cmd/rc/havefork.c b/src/cmd/rc/havefork.c
       t@@ -112,13 +112,14 @@ Xbackq(void)
        {
                struct thread *p = runq;
                char wd[8193];
       -        int c;
       -        char *s, *ewd=&wd[8192], *stop;
       +        int c, n;
       +        char *s, *ewd=&wd[8192], *stop, *q;
                struct io *f;
                var *ifs = vlook("ifs");
                word *v, *nextv;
                int pfd[2];
                int pid;
       +        Rune r;
                stop = ifs->val?ifs->val->word:"";
                if(pipe(pfd)<0){
                        Xerror("can't make pipe");
       t@@ -143,14 +144,21 @@ Xbackq(void)
                        s = wd;
                        v = 0;
                        while((c = rchr(f))!=EOF){
       -                        if(strchr(stop, c) || s==ewd){
       -                                if(s!=wd){
       -                                        *s='\0';
       -                                        v = newword(wd, v);
       -                                        s = wd;
       +                        if(s != ewd) {
       +                                *s++ = c;
       +                                for(q=stop; *q; q+=n) {
       +                                        n = chartorune(&r, q);
       +                                        if(s-wd >= n && memcmp(s-n, q, n) == 0) {
       +                                                s -= n;
       +                                                goto stop;
       +                                        }
                                        }
       +                                continue;
                                }
       -                        else *s++=c;
       +                stop:
       +                        *s = '\0';
       +                        v = newword(wd, v);
       +                        s = wd;
                        }
                        if(s!=wd){
                                *s='\0';