From 3c72bfd7a1533b53a9ed0cd66473569f3b490951 Mon Sep 17 00:00:00 2001 From: Viacheslav Poturaev Date: Mon, 6 Feb 2023 09:54:16 +0100 Subject: [PATCH] Add a check for redundant . and e in number parser --- parser.go | 14 +++++++++++++- parser_test.go | 2 ++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/parser.go b/parser.go index 885e184..f0dcb7b 100644 --- a/parser.go +++ b/parser.go @@ -423,12 +423,24 @@ func parseRawString(s string) (string, string, error) { func parseRawNumber(s string) (string, string, error) { // The caller must ensure len(s) > 0 + dotFound := false + eFound := false + // Find the end of the number. for i := 0; i < len(s); i++ { ch := s[i] - if (ch >= '0' && ch <= '9') || ch == '.' || ch == '-' || ch == 'e' || ch == 'E' || ch == '+' { + if (ch >= '0' && ch <= '9') || ch == '-' || ch == '+' { + continue + } + if ch == '.' && !dotFound { + dotFound = true continue } + if (ch == 'e' || ch == 'E') && !eFound { + eFound = true + continue + } + if i == 0 || i == 1 && (s[0] == '-' || s[0] == '+') { if len(s[i:]) >= 3 { xs := s[i : i+3] diff --git a/parser_test.go b/parser_test.go index b691185..db975e5 100644 --- a/parser_test.go +++ b/parser_test.go @@ -44,6 +44,8 @@ func TestParseRawNumber(t *testing.T) { f("Inftail", "Inf", "tail") f("-INF", "-INF", "") f("-Inftail", "-Inf", "tail") + f("1.2.3.4", "1.2", ".3.4") + f("-12.345e67e70", "-12.345e67", "e70") }) t.Run("error", func(t *testing.T) {