From c27ab45bc262d670536a42423936ac7b14754ab3 Mon Sep 17 00:00:00 2001 From: xdrm-brackets Date: Mon, 12 Nov 2018 19:38:24 +0100 Subject: [PATCH] update cnf/parser/nginx encoder+decoder to read the last line even if no newline '\n' char --- internal/cnf/parser/nginx/decoder.go | 12 ++++++++++-- internal/cnf/parser/nginx/encoder.go | 21 +++++++++++++++------ 2 files changed, 25 insertions(+), 8 deletions(-) diff --git a/internal/cnf/parser/nginx/decoder.go b/internal/cnf/parser/nginx/decoder.go index 3213a3c..4af5ac4 100644 --- a/internal/cnf/parser/nginx/decoder.go +++ b/internal/cnf/parser/nginx/decoder.go @@ -32,23 +32,31 @@ func (d *decoder) Decode(v interface{}) error { // actual section stack stack := make([]*Line, 0) + eof := false for { n++ + if eof { + break + } l := &Line{Type: NONE} // 1. read line notrim, err := r.ReadString('\n') if err == io.EOF { - break + if len(notrim) > 0 { + eof = true + } else { + break + } } else if err != nil { return &LineError{n, err} } notrim = strings.Trim(notrim, "\r\n") // 2. ignore empty - line := strings.Trim(notrim, " \t") + line := strings.Trim(notrim, " \t\r\n") if len(line) < 1 { continue } diff --git a/internal/cnf/parser/nginx/encoder.go b/internal/cnf/parser/nginx/encoder.go index 0f83b87..567e1a9 100644 --- a/internal/cnf/parser/nginx/encoder.go +++ b/internal/cnf/parser/nginx/encoder.go @@ -7,22 +7,31 @@ import ( var ( defaultPrefix = "" - defaultIndent = " " + defaultIndent = "\t" ) // encoder implements parser.Encoder type encoder struct { writer io.Writer - prefix string - indent string + prefix []byte + indent []byte } func (e *encoder) SetIndent(prefix, indent string) { - e.prefix = prefix - e.indent = indent + e.prefix = make([]byte, 0) + e.prefix = append(e.prefix, []byte(prefix)...) + + e.indent = make([]byte, 0) + e.indent = append(e.indent, []byte(indent)...) } func (e *encoder) Encode(v interface{}) error { + + // default indentation + if e.prefix == nil || e.indent == nil { + e.SetIndent(defaultPrefix, defaultIndent) + } + // check 'v' vcast, ok := v.(*Line) if !ok { @@ -78,7 +87,7 @@ func (e *encoder) Encode(v interface{}) error { // 4.assignments } else if line.Type == ASSIGNMENT { - repr = append(repr, []byte(fmt.Sprintf("%s %s;\n", line.Components[0], line.Components[1]))...) + repr = append(repr, []byte(fmt.Sprintf("%s\t\t%s;\n", line.Components[0], line.Components[1]))...) // 5. include } else if line.Type == INCLUDE {