From c904fc3e8605ec95c0fac92654d773e8456bf130 Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Tue, 14 Feb 2023 18:39:25 -0700 Subject: mv compat/json/{compat,testcompat}_test.go --- compat/json/compat_test.go | 86 ------------------------------------------ compat/json/testcompat_test.go | 86 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+), 86 deletions(-) delete mode 100644 compat/json/compat_test.go create mode 100644 compat/json/testcompat_test.go (limited to 'compat/json') diff --git a/compat/json/compat_test.go b/compat/json/compat_test.go deleted file mode 100644 index 07c75bc..0000000 --- a/compat/json/compat_test.go +++ /dev/null @@ -1,86 +0,0 @@ -// Copyright (C) 2022-2023 Luke Shumaker -// -// SPDX-License-Identifier: GPL-2.0-or-later - -package json - -import ( - "bytes" - "encoding/json" - "io" - _ "unsafe" - - "git.lukeshu.com/go/lowmemjson" - "git.lukeshu.com/go/lowmemjson/internal/fastio" - "git.lukeshu.com/go/lowmemjson/internal/jsonparse" - "git.lukeshu.com/go/lowmemjson/internal/jsonstruct" -) - -var ( - parseTag = jsonstruct.ParseTag - clearCache = jsonstruct.ClearCache - cachedTypeFields = jsonstruct.IndexStruct -) - -type scanner = lowmemjson.ReEncoderConfig - -func checkValid(in []byte, scan *lowmemjson.ReEncoderConfig) error { - return reencode(io.Discard, in, *scan) -} - -func isValidNumber(s string) bool { - var parser jsonparse.Parser - for _, r := range s { - if t, _ := parser.HandleRune(r); !t.IsNumber() { - return false - } - } - if t, _ := parser.HandleEOF(); t == jsonparse.RuneTypeError { - return false - } - return true -} - -const ( - startDetectingCyclesAfter = 1000 -) - -func isSpace(c byte) bool { - switch c { - case 0x0020, 0x000A, 0x000D, 0x0009: - return true - default: - return false - } -} - -type encodeState struct { - bytes.Buffer -} - -//go:linkname encodeStringFromString git.lukeshu.com/go/lowmemjson.encodeStringFromString -func encodeStringFromString(w fastio.AllWriter, escaper lowmemjson.BackslashEscaper, str string) error - -//go:linkname encodeStringFromBytes git.lukeshu.com/go/lowmemjson.encodeStringFromBytes -func encodeStringFromBytes(w fastio.AllWriter, escaper lowmemjson.BackslashEscaper, str []byte) error - -func (es *encodeState) string(str string, _ bool) { - if err := encodeStringFromString(&es.Buffer, nil, str); err != nil { - panic(err) - } -} - -func (es *encodeState) stringBytes(str []byte, _ bool) { - if err := encodeStringFromBytes(&es.Buffer, nil, str); err != nil { - panic(err) - } -} - -type ( - Token = json.Token - Delim = json.Delim -) - -func (dec *Decoder) Token() (Token, error) { - panic("not implemented") -} diff --git a/compat/json/testcompat_test.go b/compat/json/testcompat_test.go new file mode 100644 index 0000000..07c75bc --- /dev/null +++ b/compat/json/testcompat_test.go @@ -0,0 +1,86 @@ +// Copyright (C) 2022-2023 Luke Shumaker +// +// SPDX-License-Identifier: GPL-2.0-or-later + +package json + +import ( + "bytes" + "encoding/json" + "io" + _ "unsafe" + + "git.lukeshu.com/go/lowmemjson" + "git.lukeshu.com/go/lowmemjson/internal/fastio" + "git.lukeshu.com/go/lowmemjson/internal/jsonparse" + "git.lukeshu.com/go/lowmemjson/internal/jsonstruct" +) + +var ( + parseTag = jsonstruct.ParseTag + clearCache = jsonstruct.ClearCache + cachedTypeFields = jsonstruct.IndexStruct +) + +type scanner = lowmemjson.ReEncoderConfig + +func checkValid(in []byte, scan *lowmemjson.ReEncoderConfig) error { + return reencode(io.Discard, in, *scan) +} + +func isValidNumber(s string) bool { + var parser jsonparse.Parser + for _, r := range s { + if t, _ := parser.HandleRune(r); !t.IsNumber() { + return false + } + } + if t, _ := parser.HandleEOF(); t == jsonparse.RuneTypeError { + return false + } + return true +} + +const ( + startDetectingCyclesAfter = 1000 +) + +func isSpace(c byte) bool { + switch c { + case 0x0020, 0x000A, 0x000D, 0x0009: + return true + default: + return false + } +} + +type encodeState struct { + bytes.Buffer +} + +//go:linkname encodeStringFromString git.lukeshu.com/go/lowmemjson.encodeStringFromString +func encodeStringFromString(w fastio.AllWriter, escaper lowmemjson.BackslashEscaper, str string) error + +//go:linkname encodeStringFromBytes git.lukeshu.com/go/lowmemjson.encodeStringFromBytes +func encodeStringFromBytes(w fastio.AllWriter, escaper lowmemjson.BackslashEscaper, str []byte) error + +func (es *encodeState) string(str string, _ bool) { + if err := encodeStringFromString(&es.Buffer, nil, str); err != nil { + panic(err) + } +} + +func (es *encodeState) stringBytes(str []byte, _ bool) { + if err := encodeStringFromBytes(&es.Buffer, nil, str); err != nil { + panic(err) + } +} + +type ( + Token = json.Token + Delim = json.Delim +) + +func (dec *Decoder) Token() (Token, error) { + panic("not implemented") +} -- cgit v1.2.3-2-g168b From a6cd78ec94f76feba180fa75e942bb5cdeae115f Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Thu, 16 Feb 2023 21:05:24 -0700 Subject: Move string-encoding to an internal/jsonstring package --- compat/json/testcompat_test.go | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) (limited to 'compat/json') diff --git a/compat/json/testcompat_test.go b/compat/json/testcompat_test.go index 07c75bc..42cbf5c 100644 --- a/compat/json/testcompat_test.go +++ b/compat/json/testcompat_test.go @@ -11,8 +11,8 @@ import ( _ "unsafe" "git.lukeshu.com/go/lowmemjson" - "git.lukeshu.com/go/lowmemjson/internal/fastio" "git.lukeshu.com/go/lowmemjson/internal/jsonparse" + "git.lukeshu.com/go/lowmemjson/internal/jsonstring" "git.lukeshu.com/go/lowmemjson/internal/jsonstruct" ) @@ -58,20 +58,14 @@ type encodeState struct { bytes.Buffer } -//go:linkname encodeStringFromString git.lukeshu.com/go/lowmemjson.encodeStringFromString -func encodeStringFromString(w fastio.AllWriter, escaper lowmemjson.BackslashEscaper, str string) error - -//go:linkname encodeStringFromBytes git.lukeshu.com/go/lowmemjson.encodeStringFromBytes -func encodeStringFromBytes(w fastio.AllWriter, escaper lowmemjson.BackslashEscaper, str []byte) error - func (es *encodeState) string(str string, _ bool) { - if err := encodeStringFromString(&es.Buffer, nil, str); err != nil { + if err := jsonstring.EncodeStringFromString(&es.Buffer, lowmemjson.EscapeDefault, str); err != nil { panic(err) } } func (es *encodeState) stringBytes(str []byte, _ bool) { - if err := encodeStringFromBytes(&es.Buffer, nil, str); err != nil { + if err := jsonstring.EncodeStringFromBytes(&es.Buffer, lowmemjson.EscapeDefault, str); err != nil { panic(err) } } -- cgit v1.2.3-2-g168b From 851452243879498117cd7e71ac12856af44657cb Mon Sep 17 00:00:00 2001 From: Luke Shumaker Date: Tue, 14 Feb 2023 11:44:36 -0700 Subject: reencode: Don't have the ReEncoderConfig member be public --- compat/json/compat.go | 43 +++++++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 16 deletions(-) (limited to 'compat/json') diff --git a/compat/json/compat.go b/compat/json/compat.go index 3678135..c96470d 100644 --- a/compat/json/compat.go +++ b/compat/json/compat.go @@ -72,8 +72,11 @@ func Marshal(v any) ([]byte, error) { } type Encoder struct { - out io.Writer - buf bytes.Buffer + out io.Writer + buf bytes.Buffer + + cfg lowmemjson.ReEncoderConfig + encoder *lowmemjson.Encoder formatter *lowmemjson.ReEncoder } @@ -81,17 +84,23 @@ type Encoder struct { func NewEncoder(w io.Writer) *Encoder { ret := &Encoder{ out: w, - } - ret.formatter = lowmemjson.NewReEncoder(&ret.buf, lowmemjson.ReEncoderConfig{ - AllowMultipleValues: true, - Compact: true, - ForceTrailingNewlines: true, - }) - ret.encoder = lowmemjson.NewEncoder(ret.formatter) + cfg: lowmemjson.ReEncoderConfig{ + AllowMultipleValues: true, + + Compact: true, + ForceTrailingNewlines: true, + }, + } + ret.refreshConfig() return ret } +func (enc *Encoder) refreshConfig() { + enc.formatter = lowmemjson.NewReEncoder(&enc.buf, enc.cfg) + enc.encoder = lowmemjson.NewEncoder(enc.formatter) +} + func (enc *Encoder) Encode(v any) error { if err := convertEncodeError(enc.encoder.Encode(v)); err != nil { enc.buf.Reset() @@ -104,17 +113,19 @@ func (enc *Encoder) Encode(v any) error { } func (enc *Encoder) SetEscapeHTML(on bool) { - var escaper lowmemjson.BackslashEscaper - if !on { - escaper = lowmemjson.EscapeDefaultNonHTMLSafe + if on { + enc.cfg.BackslashEscape = lowmemjson.EscapeDefault + } else { + enc.cfg.BackslashEscape = lowmemjson.EscapeDefaultNonHTMLSafe } - enc.formatter.BackslashEscape = escaper + enc.refreshConfig() } func (enc *Encoder) SetIndent(prefix, indent string) { - enc.formatter.Compact = prefix == "" && indent == "" - enc.formatter.Prefix = prefix - enc.formatter.Indent = indent + enc.cfg.Compact = prefix == "" && indent == "" + enc.cfg.Prefix = prefix + enc.cfg.Indent = indent + enc.refreshConfig() } // ReEncode wrappers ///////////////////////////////////////////////// -- cgit v1.2.3-2-g168b