in pkg/ycd/header.go [66:135]
func parseHeader(reader *bufio.Reader) (*Header, error) {
var h Header
length := 0
line, err := reader.ReadString('\n')
if err != nil {
return nil, err
}
length += len(line)
if strings.TrimSpace(line) != "#Compressed Digit File" {
return nil, fmt.Errorf("first line should be '#Compressed Digit File': %s", strings.TrimSpace(line))
}
for {
line, err := reader.ReadString('\n')
if err != nil {
return nil, err
}
length += len(line)
// The delimiter is \r\n so it's two runes.
if len(line) == 2 {
continue
}
tokens := strings.Split(line, ":")
key := strings.TrimSpace(tokens[0])
if key == "EndHeader" {
break
}
value := strings.TrimSpace(tokens[1])
switch key {
case "FileVersion":
h.FileVersion = value
case "Base":
if i, err := strconv.Atoi(value); err == nil {
h.Radix = i
} else {
return nil, err
}
case "FirstDigits":
h.FirstDigits = value
case "TotalDigits":
if i, err := parseInt64(value); err == nil {
h.TotalDigits = i
} else {
return nil, err
}
case "Blocksize":
if i, err := parseInt64(value); err == nil {
h.BlockSize = i
} else {
return nil, err
}
case "BlockID":
if i, err := parseInt64(value); err == nil {
h.BlockID = i
} else {
return nil, err
}
default:
return nil, fmt.Errorf("unknown header key: %s", key)
}
}
if err := h.validate(); err != nil {
return nil, err
}
h.Length = length
return &h, nil
}