\x00 for NUL in type string.
R=rsc
DELTA=14 (9 added, 0 deleted, 5 changed)
OCL=18281
CL=18281
diff --git a/src/lib/reflect/test.go b/src/lib/reflect/test.go
index 0ed53a3..9ec22d1 100644
--- a/src/lib/reflect/test.go
+++ b/src/lib/reflect/test.go
@@ -119,7 +119,7 @@
typedump("struct {a int8; b int8; c int8; d int8; b int32}", "struct{a int8; b int8; c int8; d int8; b int32}");
typedump("struct {a int8; b int8; c int8; d int8; e int8; b int32}", "struct{a int8; b int8; c int8; d int8; e int8; b int32}");
typedump("struct {a int8 \"hi there\"; }", "struct{a int8 \"hi there\"}");
- typedump("struct {a int8 \"hi \\0there\\t\\n\\\"\\\\\"; }", "struct{a int8 \"hi \\0there\\t\\n\\\"\\\\\"}");
+ typedump("struct {a int8 \"hi \\x00there\\t\\n\\\"\\\\\"; }", "struct{a int8 \"hi \\x00there\\t\\n\\\"\\\\\"}");
valuedump("int8", "8");
valuedump("int16", "16");
diff --git a/src/lib/reflect/tostring.go b/src/lib/reflect/tostring.go
index c57e199..963ab0f 100644
--- a/src/lib/reflect/tostring.go
+++ b/src/lib/reflect/tostring.go
@@ -25,7 +25,7 @@
case '\t':
out += `\t`;
case '\x00':
- out += `\0`;
+ out += `\x00`;
case '"':
out += `\"`;
case '\\':
diff --git a/src/lib/reflect/type.go b/src/lib/reflect/type.go
index 0d73944..3e51791 100644
--- a/src/lib/reflect/type.go
+++ b/src/lib/reflect/type.go
@@ -453,7 +453,7 @@
typename =
name '.' name
doublequotedstring =
- string in " "; escapes are \0 (NUL) \n \t \" \\
+ string in " "; escapes are \x00 (NUL) \n \t \" \\
fieldlist =
[ field { [ ',' | ';' ] field } ]
field =
@@ -492,6 +492,10 @@
return false;
}
+func hex00(s string, i int) bool {
+ return i + 2 < len(s) && s[i] == '0' && s[i+1] == '0'
+}
+
// Process backslashes. String known to be well-formed.
// Initial double-quote is left in, as an indication this token is a string.
func unescape(s string, backslash bool) string {
@@ -509,8 +513,13 @@
c = '\n';
case 't':
c = '\t';
- case '0': // it's not a legal go string but \0 means NUL
- c = '\x00';
+ case 'x':
+ if hex00(s, i+1) {
+ i += 2;
+ c = 0;
+ break;
+ }
+ // otherwise just put an 'x'; erroneous but safe.
// default is correct already; \\ is \; \" is "
}
}