mirror of
https://github.com/paleotronic/diskm8.git
synced 2024-09-07 21:54:28 +00:00
207 lines
4.5 KiB
Go
207 lines
4.5 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"io/ioutil"
|
||
|
"os"
|
||
|
"path/filepath"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
type SearchResultContext int
|
||
|
|
||
|
const (
|
||
|
SRC_UNKNOWN SearchResultContext = iota
|
||
|
SRC_FILE
|
||
|
SRC_DISK
|
||
|
)
|
||
|
|
||
|
type SearchResultItem struct {
|
||
|
DiskPath string
|
||
|
File *DiskFile
|
||
|
}
|
||
|
|
||
|
func searchForFilename(filename string, filter []string) {
|
||
|
|
||
|
fd := GetAllFiles("*_*_*_*.fgp", filter)
|
||
|
|
||
|
fmt.Printf("Filter: %s\n", filter)
|
||
|
|
||
|
fmt.Println()
|
||
|
fmt.Println()
|
||
|
|
||
|
fmt.Printf("SEARCH RESULTS FOR '%s'\n", filename)
|
||
|
|
||
|
fmt.Println()
|
||
|
|
||
|
for diskname, list := range fd {
|
||
|
//fmt.Printf("Checking: %s\n", diskname)
|
||
|
for _, f := range list {
|
||
|
if strings.Contains(strings.ToLower(f.Filename), strings.ToLower(filename)) {
|
||
|
fmt.Printf("%32s:\n %s (%s, %d bytes, sha: %s)\n\n", diskname, f.Filename, f.Type, f.Size, f.SHA256)
|
||
|
if *extract == "@" {
|
||
|
ExtractFile(diskname, f, *adornedCP, false)
|
||
|
} else if *extract == "#" {
|
||
|
ExtractDisk(diskname)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
func searchForSHA256(sha string, filter []string) {
|
||
|
|
||
|
fd := GetAllFiles("*_*_*_*.fgp", filter)
|
||
|
|
||
|
fmt.Println()
|
||
|
fmt.Println()
|
||
|
|
||
|
fmt.Printf("SEARCH RESULTS FOR SHA256 '%s'\n", sha)
|
||
|
|
||
|
fmt.Println()
|
||
|
|
||
|
for diskname, list := range fd {
|
||
|
for _, f := range list {
|
||
|
if f.SHA256 == sha {
|
||
|
fmt.Printf("%32s:\n %s (%s, %d bytes, sha: %s)\n\n", diskname, f.Filename, f.Type, f.Size, f.SHA256)
|
||
|
if *extract == "@" {
|
||
|
ExtractFile(diskname, f, *adornedCP, false)
|
||
|
} else if *extract == "#" {
|
||
|
ExtractDisk(diskname)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
func searchForTEXT(text string, filter []string) {
|
||
|
|
||
|
fd := GetAllFiles("*_*_*_*.fgp", filter)
|
||
|
|
||
|
fmt.Println()
|
||
|
fmt.Println()
|
||
|
|
||
|
fmt.Printf("SEARCH RESULTS FOR TEXT CONTENT '%s'\n", text)
|
||
|
|
||
|
fmt.Println()
|
||
|
|
||
|
for diskname, list := range fd {
|
||
|
for _, f := range list {
|
||
|
if strings.Contains(strings.ToLower(string(f.Text)), strings.ToLower(text)) {
|
||
|
fmt.Printf("%32s:\n %s (%s, %d bytes, sha: %s)\n\n", diskname, f.Filename, f.Type, f.Size, f.SHA256)
|
||
|
if *extract == "@" {
|
||
|
ExtractFile(diskname, f, *adornedCP, false)
|
||
|
} else if *extract == "#" {
|
||
|
ExtractDisk(diskname)
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
func directory(filter []string, format string) {
|
||
|
|
||
|
fd := GetAllFiles("*_*_*_*.fgp", filter)
|
||
|
|
||
|
fmt.Println()
|
||
|
fmt.Println()
|
||
|
|
||
|
fmt.Println()
|
||
|
|
||
|
for diskname, list := range fd {
|
||
|
fmt.Printf("CATALOG RESULTS FOR '%s'\n", diskname)
|
||
|
//fmt.Printf("Checking: %s\n", diskname)
|
||
|
out := ""
|
||
|
for _, file := range list {
|
||
|
tmp := format
|
||
|
// size
|
||
|
tmp = strings.Replace(tmp, "{size:blocks}", fmt.Sprintf("%3d Blocks", file.Size/256+1), -1)
|
||
|
tmp = strings.Replace(tmp, "{size:kb}", fmt.Sprintf("%4d Kb", file.Size/1024+1), -1)
|
||
|
tmp = strings.Replace(tmp, "{size:b}", fmt.Sprintf("%6d Bytes", file.Size), -1)
|
||
|
tmp = strings.Replace(tmp, "{size}", fmt.Sprintf("%6d", file.Size), -1)
|
||
|
// format
|
||
|
tmp = strings.Replace(tmp, "{filename}", fmt.Sprintf("%-36s", file.Filename), -1)
|
||
|
// type
|
||
|
tmp = strings.Replace(tmp, "{type}", fmt.Sprintf("%-20s", file.Type), -1)
|
||
|
// sha256
|
||
|
tmp = strings.Replace(tmp, "{sha256}", file.SHA256, -1)
|
||
|
|
||
|
out += tmp + "\n"
|
||
|
|
||
|
if *extract == "@" {
|
||
|
ExtractFile(diskname, file, *adornedCP, false)
|
||
|
} else if *extract == "#" {
|
||
|
ExtractDisk(diskname)
|
||
|
}
|
||
|
}
|
||
|
fmt.Println(out + "\n\n")
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
var fileExtractCounter int
|
||
|
|
||
|
func ExtractFile(diskname string, fd *DiskFile, adorned bool, local bool) error {
|
||
|
|
||
|
var name string
|
||
|
|
||
|
if adorned {
|
||
|
name = fd.GetNameAdorned()
|
||
|
} else {
|
||
|
name = fd.GetName()
|
||
|
}
|
||
|
|
||
|
path := binpath() + "/extract" + diskname
|
||
|
|
||
|
if local {
|
||
|
ext := filepath.Ext(diskname)
|
||
|
base := strings.Replace(filepath.Base(diskname), ext, "", -1)
|
||
|
path = "./" + base
|
||
|
}
|
||
|
|
||
|
if path != "." {
|
||
|
os.MkdirAll(path, 0755)
|
||
|
}
|
||
|
|
||
|
//fmt.Printf("FD.EXT=%s\n", fd.Ext)
|
||
|
|
||
|
f, err := os.Create(path + "/" + name)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
defer f.Close()
|
||
|
f.Write(fd.Data)
|
||
|
os.Stderr.WriteString("Extracted file to " + path + "/" + name + "\n")
|
||
|
|
||
|
if strings.ToLower(fd.Ext) == "int" || strings.ToLower(fd.Ext) == "bas" || strings.ToLower(fd.Ext) == "txt" {
|
||
|
f, err := os.Create(path + "/" + name + ".ASC")
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
defer f.Close()
|
||
|
f.Write(fd.Text)
|
||
|
os.Stderr.WriteString("Extracted file to " + path + "/" + name + ".ASC\n")
|
||
|
}
|
||
|
|
||
|
//os.Stderr.WriteString("Extracted file to " + path + "/" + name)
|
||
|
|
||
|
fileExtractCounter++
|
||
|
|
||
|
return nil
|
||
|
|
||
|
}
|
||
|
|
||
|
func ExtractDisk(diskname string) error {
|
||
|
path := binpath() + "/extract" + diskname
|
||
|
os.MkdirAll(path, 0755)
|
||
|
data, err := ioutil.ReadFile(diskname)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
target := path + "/" + filepath.Base(diskname)
|
||
|
return ioutil.WriteFile(target, data, 0755)
|
||
|
}
|