13
"google.golang.org/protobuf/internal/strs"
16
func (d *Decoder) parseString(in []byte) (string, int, error) {
19
return "", 0, ErrUnexpectedEOF
22
return "", 0, d.newSyntaxError(d.currPos(), "invalid character %q at start of string", in[0])
25
i := indexNeedEscapeInBytes(in)
26
in, out := in[i:], in[:i:i]
28
switch r, n := utf8.DecodeRune(in); {
29
case r == utf8.RuneError && n == 1:
30
return "", 0, d.newSyntaxError(d.currPos(), "invalid UTF-8 in string")
32
return "", 0, d.newSyntaxError(d.currPos(), "invalid character %q in string", r)
35
n := len(in0) - len(in)
36
return string(out), n, nil
39
return "", 0, ErrUnexpectedEOF
41
switch r := in[1]; r {
43
in, out = in[2:], append(out, r)
45
in, out = in[2:], append(out, '\b')
47
in, out = in[2:], append(out, '\f')
49
in, out = in[2:], append(out, '\n')
51
in, out = in[2:], append(out, '\r')
53
in, out = in[2:], append(out, '\t')
56
return "", 0, ErrUnexpectedEOF
58
v, err := strconv.ParseUint(string(in[2:6]), 16, 16)
60
return "", 0, d.newSyntaxError(d.currPos(), "invalid escape code %q in string", in[:6])
65
if utf16.IsSurrogate(r) {
67
return "", 0, ErrUnexpectedEOF
69
v, err := strconv.ParseUint(string(in[2:6]), 16, 16)
70
r = utf16.DecodeRune(r, rune(v))
71
if in[0] != '\\' || in[1] != 'u' ||
72
r == unicode.ReplacementChar || err != nil {
73
return "", 0, d.newSyntaxError(d.currPos(), "invalid escape code %q in string", in[:6])
77
out = append(out, string(r)...)
79
return "", 0, d.newSyntaxError(d.currPos(), "invalid escape code %q in string", in[:2])
82
i := indexNeedEscapeInBytes(in[n:])
83
in, out = in[n+i:], append(out, in[:n+i]...)
86
return "", 0, ErrUnexpectedEOF
91
func indexNeedEscapeInBytes(b []byte) int { return indexNeedEscapeInString(strs.UnsafeString(b)) }