| // 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) |
| ) |