diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a3b2e0f --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.mpq diff --git a/filesystem/filesystem.go b/filesystem/filesystem.go new file mode 100644 index 0000000..a1fbe0b --- /dev/null +++ b/filesystem/filesystem.go @@ -0,0 +1,50 @@ +package filesystem + +import ( + "bytes" + "io" + + "github.com/icza/mpq" +) + +type FileSystem interface { + Mount(root, path string) error + List() ([]string, error) + Open(path string) (io.ReadSeeker, error) +} + +func New() FileSystem { + return new(filesystem) +} + +type filesystem struct { + db *mpq.MPQ +} + +func (fs *filesystem) Mount(root, path string) error { + db, err := mpq.NewFromFile(path) + if err != nil { + return err + } + + fs.db = db + return nil +} + +func (fs *filesystem) List() ([]string, error) { + data, err := fs.db.FileByName("(listfile)") + if err != nil { + return nil, err + } + + return []string{string(data)}, nil +} + +func (fs *filesystem) Open(path string) (io.ReadSeeker, error) { + data, err := fs.db.FileByName(path) + if err != nil { + return nil, err + } + + return bytes.NewReader(data), nil +} diff --git a/tools/mpq/mpq.go b/tools/mpq/mpq.go new file mode 100644 index 0000000..86d05d2 --- /dev/null +++ b/tools/mpq/mpq.go @@ -0,0 +1,33 @@ +package main + +import ( + "flag" + "log" + "os" + + "github.com/FooSoft/lazarus/filesystem" +) + +func main() { + // var ( + // wildcard = flag.String("wildcard", "*.*", "wildcard filter") + // ) + flag.Parse() + + if flag.NArg() == 0 { + flag.PrintDefaults() + os.Exit(2) + } + + fs := filesystem.New() + if err := fs.Mount("", flag.Arg(0)); err != nil { + log.Fatal(err) + } + + paths, err := fs.List() + if err != nil { + log.Fatal(err) + } + + log.Print(paths) +}