]> Cypherpunks repositories - gostls13.git/commitdiff
make %Z handle embedded NULs; remove fixed-size buffer
authorRuss Cox <rsc@golang.org>
Fri, 31 Oct 2008 21:57:57 +0000 (14:57 -0700)
committerRuss Cox <rsc@golang.org>
Fri, 31 Oct 2008 21:57:57 +0000 (14:57 -0700)
R=r
DELTA=44  (2 added, 15 deleted, 27 changed)
OCL=18270
CL=18273

src/cmd/gc/subr.c

index d188db60cd80b0f925448134f30065c7829be732..09cba7d61bb22d7830732e8464854d9809ce2330 100644 (file)
@@ -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), "<nil>");
-               goto out;
-       }
+       if(sp == nil)
+               return fmtstrcpy(fp, "<nil>");
+
        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[] =
 {