func parseHeader()

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
}