From: Russ Cox Date: Fri, 31 Oct 2008 21:57:57 +0000 (-0700) Subject: make %Z handle embedded NULs; remove fixed-size buffer X-Git-Tag: weekly.2009-11-06~2833 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=8a1ad756448d0761320f780c9c8bd4abb182aab6;p=gostls13.git make %Z handle embedded NULs; remove fixed-size buffer R=r DELTA=44 (2 added, 15 deleted, 27 changed) OCL=18270 CL=18273 --- diff --git a/src/cmd/gc/subr.c b/src/cmd/gc/subr.c index d188db60cd..09cba7d61b 100644 --- a/src/cmd/gc/subr.c +++ b/src/cmd/gc/subr.c @@ -1325,54 +1325,41 @@ treecopy(Node *n) int Zconv(Fmt *fp) { - char *s, *se; - char *p; - char buf[500]; - int c; + Rune r; String *sp; + char *s, *se; sp = va_arg(fp->args, String*); - if(sp == nil) { - snprint(buf, sizeof(buf), ""); - goto out; - } + if(sp == nil) + return fmtstrcpy(fp, ""); + s = sp->s; se = s + sp->len; - - p = buf; - -loop: - c = *s++; - if(s > se) - c = 0; - switch(c) { - default: - *p++ = c; - break; - case 0: - *p = 0; - goto out; - case '\t': - *p++ = '\\'; - *p++ = 't'; - break; - case '\n': - *p++ = '\\'; - *p++ = 'n'; - break; - case '\"': - case '\\': - *p++ = '\\'; - *p++ = c; - break; + while(s < se) { + s += chartorune(&r, s); + switch(r) { + default: + fmtrune(fp, r); + break; + case '\0': + fmtstrcpy(fp, "\\x00"); + break; + case '\t': + fmtstrcpy(fp, "\\t"); + break; + case '\n': + fmtstrcpy(fp, "\\n"); + break; + case '\"': + case '\\': + fmtrune(fp, '\\'); + fmtrune(fp, r); + break; + } } - goto loop; - -out: - return fmtstrcpy(fp, buf); + return 0; } - static char* wnames[] = {