rigs completed
This commit is contained in:
+20
-1
@@ -25,6 +25,21 @@ type Record map[string]string
|
||||
// Returning a non-nil error from fn stops parsing and is propagated.
|
||||
// The header (text before <EOH>) is silently discarded.
|
||||
func Parse(r io.Reader, fn func(Record) error) error {
|
||||
return parseWith(r, nil, fn)
|
||||
}
|
||||
|
||||
// ParseWithDecoder is like Parse but applies decodeValue to each field's
|
||||
// raw bytes before storing as a string. ADIF field lengths are byte
|
||||
// counts in the file's native encoding, so decoding MUST happen after
|
||||
// reading exactly N bytes — wrapping the reader in a decoder would shift
|
||||
// byte boundaries and chop multibyte chars in half (e.g. "<QTH:7>YAOUNDÉ"
|
||||
// in Windows-1252 is 7 bytes; after upfront decoding it'd be 8 bytes of
|
||||
// UTF-8 and the parser would only read the first 7, splitting É).
|
||||
func ParseWithDecoder(r io.Reader, decodeValue func([]byte) string, fn func(Record) error) error {
|
||||
return parseWith(r, decodeValue, fn)
|
||||
}
|
||||
|
||||
func parseWith(r io.Reader, decodeValue func([]byte) string, fn func(Record) error) error {
|
||||
br := bufio.NewReaderSize(r, 64*1024)
|
||||
|
||||
rec := Record{}
|
||||
@@ -69,7 +84,11 @@ func Parse(r io.Reader, fn func(Record) error) error {
|
||||
return fmt.Errorf("read field %s: %w", name, err)
|
||||
}
|
||||
if headerDone && name != "" {
|
||||
rec[name] = string(val)
|
||||
if decodeValue != nil {
|
||||
rec[name] = decodeValue(val)
|
||||
} else {
|
||||
rec[name] = string(val)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user