commit 72f66c2d3ca556d35b818158e9de578c4bfa153e from: Russ Cox date: Sun Jan 02 18:43:20 2011 UTC rc: handle utf-8 in $ifs R=rsc http://codereview.appspot.com/3798046 commit - c4071243a591037f159e15618364521133b8d7ec commit + 72f66c2d3ca556d35b818158e9de578c4bfa153e blob - 74abfe17cb8fb17f73d1f321517bff13c7de83b5 blob + 549b1966ec94316d25abeb1d12047d64d9fc9ac8 --- src/cmd/rc/havefork.c +++ src/cmd/rc/havefork.c @@ -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"); @@ -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';