예제 #1
0
파일: table.go 프로젝트: rainycape/gondola
func readString(r io.Reader) (string, error) {
	var s int32
	if err := binary.Read(r, binary.BigEndian, &s); err != nil {
		return "", err
	}
	b := make([]byte, int(s))
	if _, err := r.Read(b); err != nil {
		return "", err
	}
	return string(b), nil
}
예제 #2
0
파일: table.go 프로젝트: rainycape/gondola
func Decode(data string) (*Table, error) {
	r, err := gzip.NewReader(strings.NewReader(data))
	if err != nil {
		return nil, err
	}
	defer r.Close()
	var count int32
	if err := binary.Read(r, binary.BigEndian, &count); err != nil {
		return nil, err
	}
	c := int(count)
	translations := make(map[string]Translation, c)
	for ii := 0; ii < c; ii++ {
		key, err := readString(r)
		if err != nil {
			return nil, err
		}
		var tcount int32
		if err := binary.Read(r, binary.BigEndian, &tcount); err != nil {
			return nil, err
		}
		tc := int(tcount)
		value := make([]string, tc)
		for jj := 0; jj < tc; jj++ {
			tr, err := readString(r)
			if err != nil {
				return nil, err
			}
			value[jj] = tr
		}
		translations[key] = value
	}
	return &Table{
		translations: translations,
	}, nil
}