1
0
mirror of https://github.com/golang/go synced 2024-10-03 20:11:22 -06:00

\x00 for NUL in type string.

R=rsc
DELTA=14  (9 added, 0 deleted, 5 changed)
OCL=18281
CL=18281
This commit is contained in:
Rob Pike 2008-10-31 15:26:14 -07:00
parent 8a1ad75644
commit 613a5c8bc6
3 changed files with 14 additions and 5 deletions

View File

@ -119,7 +119,7 @@ func main() {
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");

View File

@ -25,7 +25,7 @@ func DoubleQuote(s string) string {
case '\t':
out += `\t`;
case '\x00':
out += `\0`;
out += `\x00`;
case '"':
out += `\"`;
case '\\':

View File

@ -453,7 +453,7 @@ func init() {
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 @@ func special(c uint8) bool {
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 @@ func unescape(s string, backslash bool) string {
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 "
}
}