diskm8/search.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)
}