| // Copyright 2014 The Go Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style | |
| // license that can be found in the LICENSE file. | |
| package riff_test | |
| import ( | |
| "fmt" | |
| "io" | |
| "io/ioutil" | |
| "log" | |
| "strings" | |
| "golang.org/x/image/riff" | |
| ) | |
| func ExampleReader() { | |
| formType, r, err := riff.NewReader(strings.NewReader(data)) | |
| if err != nil { | |
| log.Fatal(err) | |
| } | |
| fmt.Printf("RIFF(%s)\n", formType) | |
| if err := dump(r, ".\t"); err != nil { | |
| log.Fatal(err) | |
| } | |
| // Output: | |
| // RIFF(ROOT) | |
| // . ZERO "" | |
| // . ONE "a" | |
| // . LIST(META) | |
| // . . LIST(GOOD) | |
| // . . . ONE "a" | |
| // . . . FIVE "klmno" | |
| // . . ZERO "" | |
| // . . LIST(BAD ) | |
| // . . . THRE "def" | |
| // . TWO "bc" | |
| // . LIST(UGLY) | |
| // . . FOUR "ghij" | |
| // . . SIX "pqrstu" | |
| } | |
| func dump(r *riff.Reader, indent string) error { | |
| for { | |
| chunkID, chunkLen, chunkData, err := r.Next() | |
| if err == io.EOF { | |
| return nil | |
| } | |
| if err != nil { | |
| return err | |
| } | |
| if chunkID == riff.LIST { | |
| listType, list, err := riff.NewListReader(chunkLen, chunkData) | |
| if err != nil { | |
| return err | |
| } | |
| fmt.Printf("%sLIST(%s)\n", indent, listType) | |
| if err := dump(list, indent+".\t"); err != nil { | |
| return err | |
| } | |
| continue | |
| } | |
| b, err := ioutil.ReadAll(chunkData) | |
| if err != nil { | |
| return err | |
| } | |
| fmt.Printf("%s%s %q\n", indent, chunkID, b) | |
| } | |
| } | |
| func encodeU32(u uint32) string { | |
| return string([]byte{ | |
| byte(u >> 0), | |
| byte(u >> 8), | |
| byte(u >> 16), | |
| byte(u >> 24), | |
| }) | |
| } | |
| func encode(chunkID, contents string) string { | |
| n := len(contents) | |
| if n&1 == 1 { | |
| contents += "\x00" | |
| } | |
| return chunkID + encodeU32(uint32(n)) + contents | |
| } | |
| func encodeMulti(typ0, typ1 string, chunks ...string) string { | |
| n := 4 | |
| for _, c := range chunks { | |
| n += len(c) | |
| } | |
| s := typ0 + encodeU32(uint32(n)) + typ1 | |
| for _, c := range chunks { | |
| s += c | |
| } | |
| return s | |
| } | |
| var ( | |
| d0 = encode("ZERO", "") | |
| d1 = encode("ONE ", "a") | |
| d2 = encode("TWO ", "bc") | |
| d3 = encode("THRE", "def") | |
| d4 = encode("FOUR", "ghij") | |
| d5 = encode("FIVE", "klmno") | |
| d6 = encode("SIX ", "pqrstu") | |
| l0 = encodeMulti("LIST", "GOOD", d1, d5) | |
| l1 = encodeMulti("LIST", "BAD ", d3) | |
| l2 = encodeMulti("LIST", "UGLY", d4, d6) | |
| l01 = encodeMulti("LIST", "META", l0, d0, l1) | |
| data = encodeMulti("RIFF", "ROOT", d0, d1, l01, d2, l2) | |
| ) |