diff options
author | Nigel Tao <nigeltao@golang.org> | 2011-04-14 09:56:42 +1000 |
---|---|---|
committer | Nigel Tao <nigeltao@golang.org> | 2011-04-14 09:56:42 +1000 |
commit | 4558fab0822c3f43451248cad34420e1e8c629fd (patch) | |
tree | 9ca434db3682d729693c913e0465acefcaec00a3 /src/pkg/image/format.go | |
parent | c4b5d8e45f332ca280e514e24fcbe54515d54620 (diff) | |
download | go-4558fab0822c3f43451248cad34420e1e8c629fd.tar.gz |
image: allow "?" wildcards when registering image formats.
R=r, nigeltao_gnome
CC=golang-dev
http://codereview.appspot.com/4404041
Diffstat (limited to 'src/pkg/image/format.go')
-rw-r--r-- | src/pkg/image/format.go | 22 |
1 files changed, 18 insertions, 4 deletions
diff --git a/src/pkg/image/format.go b/src/pkg/image/format.go index 1d541b094..b4859325e 100644 --- a/src/pkg/image/format.go +++ b/src/pkg/image/format.go @@ -25,7 +25,8 @@ var formats []format // RegisterFormat registers an image format for use by Decode. // Name is the name of the format, like "jpeg" or "png". -// Magic is the magic prefix that identifies the format's encoding. +// Magic is the magic prefix that identifies the format's encoding. The magic +// string can contain "?" wildcards that each match any one byte. // Decode is the function that decodes the encoded image. // DecodeConfig is the function that decodes just its configuration. func RegisterFormat(name, magic string, decode func(io.Reader) (Image, os.Error), decodeConfig func(io.Reader) (Config, os.Error)) { @@ -46,11 +47,24 @@ func asReader(r io.Reader) reader { return bufio.NewReader(r) } -// sniff determines the format of r's data. +// Match returns whether magic matches b. Magic may contain "?" wildcards. +func match(magic string, b []byte) bool { + if len(magic) != len(b) { + return false + } + for i, c := range b { + if magic[i] != c && magic[i] != '?' { + return false + } + } + return true +} + +// Sniff determines the format of r's data. func sniff(r reader) format { for _, f := range formats { - s, err := r.Peek(len(f.magic)) - if err == nil && string(s) == f.magic { + b, err := r.Peek(len(f.magic)) + if err == nil && match(f.magic, b) { return f } } |