From e86169b4cb198aa499c22cb8c64b1a8df5a45210 Mon Sep 17 00:00:00 2001 From: mzz2017 Date: Sun, 14 Aug 2022 21:39:53 +0800 Subject: [PATCH 1/7] fix: a problem that cannot read mtr output from pipe --- cmd/root.go | 2 ++ go.sum | 24 ------------------------ pkg/common/scan.go | 28 ++++++++++++++++++++++++++++ 3 files changed, 30 insertions(+), 24 deletions(-) create mode 100644 pkg/common/scan.go diff --git a/cmd/root.go b/cmd/root.go index fe8ed774..f064ec56 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -3,6 +3,7 @@ package cmd import ( "bufio" "fmt" + "github.com/zu1k/nali/pkg/common" "log" "os" "strings" @@ -63,6 +64,7 @@ Find document on: https://github.com/zu1k/nali if len(args) == 0 { stdin := bufio.NewScanner(os.Stdin) + stdin.Split(common.ScanLines) for stdin.Scan() { line := stdin.Text() if gbk { diff --git a/go.sum b/go.sum index 6cc14e1b..41ddd174 100644 --- a/go.sum +++ b/go.sum @@ -127,14 +127,8 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1: github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= -github.com/ip2location/ip2location-go/v9 v9.3.0 h1:qfgr4ppf21ZyrOrmh4/db4SamL9hj+YYEl06dbf1cGM= -github.com/ip2location/ip2location-go/v9 v9.3.0/go.mod h1:s5SV6YZL10TpfPpXw//7fEJC65G/yH7Oh+Tjq9JcQEQ= github.com/ip2location/ip2location-go/v9 v9.4.0 h1:VV+clcfWo+BCi37+1zVOLCoyy01GT18/RTtAeIR5EP0= github.com/ip2location/ip2location-go/v9 v9.4.0/go.mod h1:s5SV6YZL10TpfPpXw//7fEJC65G/yH7Oh+Tjq9JcQEQ= -github.com/ipipdotnet/ipdb-go v1.3.1 h1:iMTt7a4o8r5FmTMzuHLg8XPtz8vb06gpEzJVSZzDZMY= -github.com/ipipdotnet/ipdb-go v1.3.1/go.mod h1:yZ+8puwe3R37a/3qRftXo40nZVQbxYDLqls9o5foexs= -github.com/ipipdotnet/ipdb-go v1.3.2 h1:kAW7+FvQqE+EhKi5niHAeverwRlCAOu2OqSSO4gDpOw= -github.com/ipipdotnet/ipdb-go v1.3.2/go.mod h1:yZ+8puwe3R37a/3qRftXo40nZVQbxYDLqls9o5foexs= github.com/ipipdotnet/ipdb-go v1.3.3 h1:GLSAW9ypLUd6EF9QNK2Uhxew9Jzs4XMJ9gOZEFnJm7U= github.com/ipipdotnet/ipdb-go v1.3.3/go.mod h1:yZ+8puwe3R37a/3qRftXo40nZVQbxYDLqls9o5foexs= github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= @@ -148,14 +142,6 @@ github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/lionsoul2014/ip2region v2.2.0-release+incompatible h1:1qp9iks+69h7IGLazAplzS9Ca14HAxuD5c0rbFdPGy4= github.com/lionsoul2014/ip2region v2.2.0-release+incompatible/go.mod h1:+ZBN7PBoh5gG6/y0ZQ85vJDBe21WnfbRrQQwTfliJJI= -github.com/lionsoul2014/ip2region/binding/golang v0.0.0-20220624075035-53e6777abd9d h1:E9eY3SL8JWS+mJds+Uk0OGAbLMLvMvEiebAGmo2fp1U= -github.com/lionsoul2014/ip2region/binding/golang v0.0.0-20220624075035-53e6777abd9d/go.mod h1:bChUKvbKVC3zL/lLLIcu6alhQaL8uWD/DA+jRdyggdI= -github.com/lionsoul2014/ip2region/binding/golang v0.0.0-20220704023600-9376c56688c8 h1:aHOC8Mcbd3TiCb+L9cSbU/NdZinWuaKSoL4qD4I3MQo= -github.com/lionsoul2014/ip2region/binding/golang v0.0.0-20220704023600-9376c56688c8/go.mod h1:bChUKvbKVC3zL/lLLIcu6alhQaL8uWD/DA+jRdyggdI= -github.com/lionsoul2014/ip2region/binding/golang v0.0.0-20220705082050-0f0c0cb4a5a6 h1:4lJlR7mskbInnkGSixv0l7Ew/SD+xQUqWKu0KwvkpiI= -github.com/lionsoul2014/ip2region/binding/golang v0.0.0-20220705082050-0f0c0cb4a5a6/go.mod h1:bChUKvbKVC3zL/lLLIcu6alhQaL8uWD/DA+jRdyggdI= -github.com/lionsoul2014/ip2region/binding/golang v0.0.0-20220720083843-0856b034bc24 h1:fH0FBog66FmNQD2abDsRNK2tzkFFEXII8/g5SHPtwrY= -github.com/lionsoul2014/ip2region/binding/golang v0.0.0-20220720083843-0856b034bc24/go.mod h1:bChUKvbKVC3zL/lLLIcu6alhQaL8uWD/DA+jRdyggdI= github.com/lionsoul2014/ip2region/binding/golang v0.0.0-20220725052544-4dab11be988d h1:F0bclU05Jl4yAgTlx7+e2JM+3DzwgbxIVSS9ckjh3r8= github.com/lionsoul2014/ip2region/binding/golang v0.0.0-20220725052544-4dab11be988d/go.mod h1:bChUKvbKVC3zL/lLLIcu6alhQaL8uWD/DA+jRdyggdI= github.com/magiconair/properties v1.8.6 h1:5ibWZ6iY0NctNGWo87LalDlEZ6R41TqbbDamhfG/Qzo= @@ -190,8 +176,6 @@ github.com/saracen/go7z-fixtures v0.0.0-20190623165746-aa6b8fba1d2f h1:PF9WV5j/x github.com/saracen/go7z-fixtures v0.0.0-20190623165746-aa6b8fba1d2f/go.mod h1:6Ff0ADODZ6S3gYepgZ2w7OqFrTqtFcfwDUhmm8jsUhs= github.com/saracen/solidblock v0.0.0-20190426153529-45df20abab6f h1:1cJITU3JUI8qNS5T0BlXwANsVdyoJQHQ4hvOxbunPCw= github.com/saracen/solidblock v0.0.0-20190426153529-45df20abab6f/go.mod h1:LyBTue+RWeyIfN3ZJ4wVxvDuvlGJtDgCLgCb6HCPgps= -github.com/spf13/afero v1.8.2 h1:xehSyVa0YnHWsJ49JFljMpg1HX19V6NDZ1fkm1Xznbo= -github.com/spf13/afero v1.8.2/go.mod h1:CtAatgMJh6bJEIs48Ay/FOnkljP3WeGUG0MC1RfAqwo= github.com/spf13/afero v1.9.2 h1:j49Hj62F0n+DaZ1dDCvhABaPNSGNkt32oRFxI33IEMw= github.com/spf13/afero v1.9.2/go.mod h1:iUV7ddyEEZPO5gA3zD4fJt6iStLlL+Lg4m2cihcDf8Y= github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= @@ -354,14 +338,6 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810 h1:rHZQSjJdAI4Xf5Qzeh2bBc5YJIkPFVM6oDtMFYmgws0= -golang.org/x/sys v0.0.0-20220624220833-87e55d714810/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b h1:2n253B2r0pYSmEV+UNCQoPfU/FiaizQEK5Gu4Bq4JE8= -golang.org/x/sys v0.0.0-20220627191245-f75cf1eec38b/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e h1:CsOuNlbOuf0mzxJIefr6Q4uAUetRUwZE4qt7VfzP+xo= -golang.org/x/sys v0.0.0-20220704084225-05e143d24a9e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10 h1:WIoqL4EROvwiPdUtaip4VcDdpZ4kha7wBWZrbVKCIZg= golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= diff --git a/pkg/common/scan.go b/pkg/common/scan.go new file mode 100644 index 00000000..d92c3578 --- /dev/null +++ b/pkg/common/scan.go @@ -0,0 +1,28 @@ +package common + +import ( + "bytes" + "regexp" +) + +var newlineReg = regexp.MustCompile(`\r?\n|\r\n?`) + +func ScanLines(data []byte, atEOF bool) (advance int, token []byte, err error) { + if atEOF && len(data) == 0 { + return 0, nil, nil + } + if loc := newlineReg.FindIndex(data); len(loc) > 0 { + delimiterLen := 1 + i := loc[0] + if i+1 < len(data) && data[i+1] == '\n' { + delimiterLen = 2 + } + return i + delimiterLen, data[:i], nil + } + // If we're at EOF, we have a final, non-terminated line. Return it. + if atEOF { + return len(data), bytes.TrimSuffix(data, []byte{'\r'}), nil + } + // Request more data. + return 0, nil, nil +} From 264b95238a05c53400d9f28882952ce71eae90f9 Mon Sep 17 00:00:00 2001 From: mzz2017 Date: Sun, 14 Aug 2022 22:37:48 +0800 Subject: [PATCH 2/7] fix: the continuous two \n case. --- pkg/common/scan.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/common/scan.go b/pkg/common/scan.go index d92c3578..08d2e905 100644 --- a/pkg/common/scan.go +++ b/pkg/common/scan.go @@ -14,7 +14,7 @@ func ScanLines(data []byte, atEOF bool) (advance int, token []byte, err error) { if loc := newlineReg.FindIndex(data); len(loc) > 0 { delimiterLen := 1 i := loc[0] - if i+1 < len(data) && data[i+1] == '\n' { + if i+1 < len(data) && data[i] == '\r' && data[i+1] == '\n' { delimiterLen = 2 } return i + delimiterLen, data[:i], nil From 2072a5ce3d5aec998aaa33d3c686e608cf7a74a1 Mon Sep 17 00:00:00 2001 From: mzz2017 Date: Sun, 14 Aug 2022 22:40:52 +0800 Subject: [PATCH 3/7] chore: format the import --- cmd/root.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/root.go b/cmd/root.go index f064ec56..d61a2513 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -3,7 +3,6 @@ package cmd import ( "bufio" "fmt" - "github.com/zu1k/nali/pkg/common" "log" "os" "strings" @@ -14,6 +13,7 @@ import ( "golang.org/x/text/transform" "github.com/zu1k/nali/internal/constant" + "github.com/zu1k/nali/pkg/common" "github.com/zu1k/nali/pkg/entity" ) From a40fa6824000980a1c4f7f2284197f9d8ca561db Mon Sep 17 00:00:00 2001 From: mzz2017 Date: Sun, 14 Aug 2022 22:54:24 +0800 Subject: [PATCH 4/7] fix: destroyed format --- cmd/root.go | 2 +- pkg/common/scan.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/root.go b/cmd/root.go index d61a2513..509c3a7d 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -73,7 +73,7 @@ Find document on: https://github.com/zu1k/nali if line == "quit" || line == "exit" { return } - _, _ = fmt.Fprintf(color.Output, "%s\n", entity.ParseLine(line).ColorString()) + _, _ = fmt.Fprintf(color.Output, "%s", entity.ParseLine(line).ColorString()) } } else { _, _ = fmt.Fprintf(color.Output, "%s\n", entity.ParseLine(strings.Join(args, " ")).ColorString()) diff --git a/pkg/common/scan.go b/pkg/common/scan.go index 08d2e905..476dbdc7 100644 --- a/pkg/common/scan.go +++ b/pkg/common/scan.go @@ -17,7 +17,7 @@ func ScanLines(data []byte, atEOF bool) (advance int, token []byte, err error) { if i+1 < len(data) && data[i] == '\r' && data[i+1] == '\n' { delimiterLen = 2 } - return i + delimiterLen, data[:i], nil + return i + delimiterLen, data[:i+delimiterLen], nil } // If we're at EOF, we have a final, non-terminated line. Return it. if atEOF { From 5b722a6afe187fcd7a3f03d9de3eaa30d6dabcc4 Mon Sep 17 00:00:00 2001 From: mzz2017 Date: Sun, 14 Aug 2022 22:57:14 +0800 Subject: [PATCH 5/7] fix: keep data at EOF --- pkg/common/scan.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pkg/common/scan.go b/pkg/common/scan.go index 476dbdc7..64f10ebd 100644 --- a/pkg/common/scan.go +++ b/pkg/common/scan.go @@ -1,12 +1,12 @@ package common import ( - "bytes" "regexp" ) var newlineReg = regexp.MustCompile(`\r?\n|\r\n?`) +// ScanLines scan lines but keep the suffix \r and \n func ScanLines(data []byte, atEOF bool) (advance int, token []byte, err error) { if atEOF && len(data) == 0 { return 0, nil, nil @@ -21,7 +21,7 @@ func ScanLines(data []byte, atEOF bool) (advance int, token []byte, err error) { } // If we're at EOF, we have a final, non-terminated line. Return it. if atEOF { - return len(data), bytes.TrimSuffix(data, []byte{'\r'}), nil + return len(data), data, nil } // Request more data. return 0, nil, nil From 24cdbcfe449ac192605ae9de5d54e5efcb648750 Mon Sep 17 00:00:00 2001 From: mzz2017 Date: Sun, 14 Aug 2022 23:36:01 +0800 Subject: [PATCH 6/7] optimize: remove regexp and use bytes.IndexByte to improve the performance --- pkg/common/scan.go | 29 ++++++++++++++++++++--------- 1 file changed, 20 insertions(+), 9 deletions(-) diff --git a/pkg/common/scan.go b/pkg/common/scan.go index 64f10ebd..02e7223b 100644 --- a/pkg/common/scan.go +++ b/pkg/common/scan.go @@ -1,23 +1,34 @@ package common import ( - "regexp" + "bytes" ) -var newlineReg = regexp.MustCompile(`\r?\n|\r\n?`) - // ScanLines scan lines but keep the suffix \r and \n func ScanLines(data []byte, atEOF bool) (advance int, token []byte, err error) { if atEOF && len(data) == 0 { return 0, nil, nil } - if loc := newlineReg.FindIndex(data); len(loc) > 0 { - delimiterLen := 1 - i := loc[0] - if i+1 < len(data) && data[i] == '\r' && data[i+1] == '\n' { - delimiterLen = 2 + if i, j := bytes.IndexByte(data, '\r'), bytes.IndexByte(data, '\n'); i >= 0 || j >= 0 { + // case 1: TOKEN\r\nTOKEN + if i >= 0 && j >= 0 { + if i+1 == j { + return i + 2, data[:i+2], nil + } + if i < j { + // case 2: TOKEN\rTOKEN\nTOKEN + return i + 1, data[:i+1], nil + } else { + // case 3: TOKEN\nTOKEN\rTOKEN + return j + 1, data[:j+1], nil + } + } else if i >= 0 { + // case 4: TOKEN\rTOKEN + return i + 1, data[:i+1], nil + } else { + // case 5: TOKEN\nTOKEN + return j + 1, data[:j+1], nil } - return i + delimiterLen, data[:i+delimiterLen], nil } // If we're at EOF, we have a final, non-terminated line. Return it. if atEOF { From eaeae3d7a7fe9c936e8bc3b56ebfcfe4655829c8 Mon Sep 17 00:00:00 2001 From: mzz2017 Date: Sun, 14 Aug 2022 23:38:36 +0800 Subject: [PATCH 7/7] fix: annotation --- pkg/common/scan.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/common/scan.go b/pkg/common/scan.go index 02e7223b..c8951ed7 100644 --- a/pkg/common/scan.go +++ b/pkg/common/scan.go @@ -10,9 +10,9 @@ func ScanLines(data []byte, atEOF bool) (advance int, token []byte, err error) { return 0, nil, nil } if i, j := bytes.IndexByte(data, '\r'), bytes.IndexByte(data, '\n'); i >= 0 || j >= 0 { - // case 1: TOKEN\r\nTOKEN if i >= 0 && j >= 0 { if i+1 == j { + // case 1: TOKEN\r\nTOKEN return i + 2, data[:i+2], nil } if i < j {