]> Cypherpunks repositories - gostls13.git/commitdiff
encoding/xml: rewrite func procInst
authorJes Cok <xigua67damn@gmail.com>
Wed, 7 Feb 2024 04:56:26 +0000 (04:56 +0000)
committerGopher Robot <gobot@golang.org>
Thu, 8 Feb 2024 20:33:51 +0000 (20:33 +0000)
This CL tries to make function procInst more exact,
also adds test cases, however, including tricky ones.

Change-Id: If421299fc84d136e56a25dba7a4919c4424702c8
GitHub-Last-Rev: b9a3192718ae5535d66fddd260c27b48d93b4af1
GitHub-Pull-Request: golang/go#64336
Reviewed-on: https://go-review.googlesource.com/c/go/+/544475
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Dmitri Shuralyov <dmitshur@google.com>
Auto-Submit: Ian Lance Taylor <iant@google.com>
Reviewed-by: Ian Lance Taylor <iant@google.com>
src/encoding/xml/xml.go
src/encoding/xml/xml_test.go

index 73eedad290f36bd09046304051d040ced05eb0e8..6b8f2e79784fa1f35799848610f4c23284dd6c6f 100644 (file)
@@ -2045,16 +2045,27 @@ func procInst(param, s string) string {
        // TODO: this parsing is somewhat lame and not exact.
        // It works for all actual cases, though.
        param = param + "="
-       _, v, _ := strings.Cut(s, param)
-       if v == "" {
-               return ""
+       lenp := len(param)
+       i := 0
+       var sep byte
+       for i < len(s) {
+               sub := s[i:]
+               k := strings.Index(sub, param)
+               if k < 0 || lenp+k >= len(sub) {
+                       return ""
+               }
+               i += lenp + k + 1
+               if c := sub[lenp+k]; c == '\'' || c == '"' {
+                       sep = c
+                       break
+               }
        }
-       if v[0] != '\'' && v[0] != '"' {
+       if sep == 0 {
                return ""
        }
-       unquote, _, ok := strings.Cut(v[1:], v[:1])
-       if !ok {
+       j := strings.IndexByte(s[i:], sep)
+       if j < 0 {
                return ""
        }
-       return unquote
+       return s[i : i+j]
 }
index 42f5f5f8a601c7ade0ff25a2c2d85ed249d85b7f..4bec4e7f1e9d49dd26b2dd505fdfd6629804253d 100644 (file)
@@ -830,6 +830,13 @@ var procInstTests = []struct {
        {`version="1.0" encoding='utf-8' `, [2]string{"1.0", "utf-8"}},
        {`version="1.0" encoding=utf-8`, [2]string{"1.0", ""}},
        {`encoding="FOO" `, [2]string{"", "FOO"}},
+       {`version=2.0 version="1.0" encoding=utf-7 encoding='utf-8'`, [2]string{"1.0", "utf-8"}},
+       {`version= encoding=`, [2]string{"", ""}},
+       {`encoding="version=1.0"`, [2]string{"", "version=1.0"}},
+       {``, [2]string{"", ""}},
+       // TODO: what's the right approach to handle these nested cases?
+       {`encoding="version='1.0'"`, [2]string{"1.0", "version='1.0'"}},
+       {`version="encoding='utf-8'"`, [2]string{"encoding='utf-8'", "utf-8"}},
 }
 
 func TestProcInstEncoding(t *testing.T) {