func ParseXml(r io.Reader, path string) (*types.Dat, []byte, error) { br := bufio.NewReader(r) hr := hashingReader{ ir: br, h: sha1.New(), } lr := lineCountingReader{ ir: hr, } d := new(types.Dat) decoder := xml.NewDecoder(lr) err := decoder.Decode(d) if err != nil { return nil, nil, fmt.Errorf("xml parsing error %d: %v", lr.line, err) } for _, g := range d.Games { for _, rom := range g.Roms { fixHashes(rom) } for _, rom := range g.Disks { fixHashes(rom) } for _, rom := range g.Parts { fixHashes(rom) } for _, rom := range g.Regions { fixHashes(rom) } } for _, g := range d.Software { for _, rom := range g.Roms { fixHashes(rom) } for _, rom := range g.Disks { fixHashes(rom) } for _, rom := range g.Parts { fixHashes(rom) } for _, rom := range g.Regions { fixHashes(rom) } } d.Normalize() d.Path = path return d, hr.h.Sum(nil), nil }
func ParseXml(r io.Reader, path string) (*types.Dat, []byte, error) { br := bufio.NewReader(r) hr := hashingReader{ ir: br, h: sha1.New(), } lr := lineCountingReader{ ir: hr, } d := new(types.Dat) decoder := xml.NewDecoder(lr) err := decoder.Decode(d) if err != nil { derrStr := fmt.Sprintf("error in file %s on line %d: %v", path, lr.line, err) derr := XMLParseError.NewWith(derrStr, setErrorFilePath(path), setErrorLineNumber(lr.line)) return nil, nil, derr } for _, g := range d.Games { for _, rom := range g.Roms { fixHashes(rom) } for _, rom := range g.Parts { fixHashes(rom) } for _, rom := range g.Regions { fixHashes(rom) } } for _, g := range d.Software { for _, rom := range g.Roms { fixHashes(rom) } for _, rom := range g.Parts { fixHashes(rom) } for _, rom := range g.Regions { fixHashes(rom) } } for _, g := range d.Machines { for _, rom := range g.Roms { fixHashes(rom) } for _, rom := range g.Parts { fixHashes(rom) } for _, rom := range g.Regions { fixHashes(rom) } } d.Normalize() d.Path = path return d, hr.h.Sum(nil), nil }