Add flags to command line

This commit is contained in:
Terence Boldt 2021-06-06 20:15:41 -04:00
parent a701c6bc51
commit fa0e76cf84
4 changed files with 86 additions and 37 deletions

59
main.go
View File

@ -1,48 +1,49 @@
package main package main
import ( import (
"flag"
"fmt" "fmt"
"io/fs"
"os" "os"
"github.com/tjboldt/ProDOS-Utilities/prodos" "github.com/tjboldt/ProDOS-Utilities/prodos"
) )
func main() { func main() {
if len(os.Args) < 2 || len(os.Args) > 3 { var fileName string
fmt.Printf("Usage:\n") var pathName string
fmt.Printf(" ProDOS-Utilities DRIVE_IMAGE\n") var command string
fmt.Printf(" ProDOS-Utilities DRIVE_IMAGE /FULL_PATH\n") var outFileName string
flag.StringVar(&fileName, "driveimage", "", "A ProDOS format drive image")
flag.StringVar(&pathName, "path", "", "Path name in ProDOS drive image")
flag.StringVar(&command, "command", "ls", "Command to execute: ls, get, put, volumebitmap")
flag.StringVar(&outFileName, "outfile", "export.bin", "Name of file to write")
flag.Parse()
if len(fileName) == 0 {
fmt.Printf("Missing driveimage. Run with --help for more info.\n")
os.Exit(1) os.Exit(1)
} }
fileName := os.Args[1]
pathName := ""
if len(os.Args) == 3 {
pathName = os.Args[2]
}
file, err := os.OpenFile(fileName, os.O_RDWR, 0755) file, err := os.OpenFile(fileName, os.O_RDWR, 0755)
if err != nil { if err != nil {
os.Exit(1) os.Exit(1)
} }
// empty path or volume name means read root directory switch command {
volumeHeader, fileEntries := prodos.ReadDirectory(file, pathName) case "ls":
volumeHeader, fileEntries := prodos.ReadDirectory(file, pathName)
fmt.Printf("VOLUME: %s\n\n", volumeHeader.VolumeName) prodos.DumpDirectory(volumeHeader, fileEntries)
fmt.Printf("NAME TYPE BLOCKS MODIFIED CREATED ENDFILE SUBTYPE\n\n") case "volumebitmap":
volumeBitmap := prodos.ReadVolumeBitmap(file)
for i := 0; i < len(fileEntries); i++ { prodos.DumpBlock(volumeBitmap)
fmt.Printf("%-15s %s %7d %s %s %8d %8d\n", case "get":
fileEntries[i].FileName, if len(pathName) == 0 {
prodos.FileTypeToString(fileEntries[i].FileType), fmt.Println("Missing pathname")
fileEntries[i].BlocksUsed, os.Exit(1)
prodos.TimeToString(fileEntries[i].ModifiedTime), }
prodos.TimeToString(fileEntries[i].CreationTime), getFile := prodos.LoadFile(file, pathName)
fileEntries[i].EndOfFile, os.WriteFile(outFileName, getFile, fs.FileMode(os.O_RDWR))
fileEntries[i].AuxType, default:
) os.Exit(1)
} }
fmt.Printf("\n")
} }

37
prodos/bitmap.go Normal file
View File

@ -0,0 +1,37 @@
package prodos
import "os"
func ReadVolumeBitmap(file *os.File) []byte {
headerBlock := ReadBlock(file, 2)
volumeHeader := parseVolumeHeader(headerBlock)
bitmap := make([]byte, volumeHeader.TotalBlocks/8+1)
totalBitmapBlocks := volumeHeader.TotalBlocks / 8 / 512
for i := 0; i <= totalBitmapBlocks; i++ {
bitmapBlock := ReadBlock(file, i+volumeHeader.BitmapStartBlock)
for j := 0; j < 512; j++ {
bitmap[i*512+j] = bitmapBlock[j]
}
}
return bitmap
}
func WriteVolumeBitmap(file *os.File, bitmap []byte) {
headerBlock := ReadBlock(file, 2)
volumeHeader := parseVolumeHeader(headerBlock)
for i := 0; i < len(bitmap)/512/8; i++ {
WriteBlock(file, volumeHeader.BitmapStartBlock+1, bitmap[i*512:i*512+513])
}
}
func FindFreeBlocks(numberOfBlocks int) []int {
return nil
}

View File

@ -1,7 +1,6 @@
package prodos package prodos
import ( import (
"fmt"
"os" "os"
"strings" "strings"
) )
@ -20,7 +19,7 @@ func LoadFile(file *os.File, path string) []byte {
directory := directoryBuilder.String() directory := directoryBuilder.String()
fileName := paths[len(paths)-1] fileName := paths[len(paths)-1]
volumeHeader, fileEntries := ReadDirectory(file, directory) _, fileEntries := ReadDirectory(file, directory)
if fileEntries == nil { if fileEntries == nil {
return nil return nil
@ -34,12 +33,6 @@ func LoadFile(file *os.File, path string) []byte {
} }
} }
DumpVolumeHeader(volumeHeader)
fmt.Println()
DumpFileEntry(fileEntry)
switch fileEntry.StorageType { switch fileEntry.StorageType {
case StorageSeedling: case StorageSeedling:
return ReadBlock(file, fileEntry.StartingBlock)[0:fileEntry.EndOfFile] return ReadBlock(file, fileEntry.StartingBlock)[0:fileEntry.EndOfFile]

View File

@ -120,3 +120,21 @@ func DumpBlock(buffer []byte) {
fmt.Printf("\n") fmt.Printf("\n")
} }
} }
func DumpDirectory(volumeHeader VolumeHeader, fileEntries []FileEntry) {
fmt.Printf("VOLUME: %s\n\n", volumeHeader.VolumeName)
fmt.Printf("NAME TYPE BLOCKS MODIFIED CREATED ENDFILE SUBTYPE\n\n")
for i := 0; i < len(fileEntries); i++ {
fmt.Printf("%-15s %s %7d %s %s %8d %8d\n",
fileEntries[i].FileName,
FileTypeToString(fileEntries[i].FileType),
fileEntries[i].BlocksUsed,
TimeToString(fileEntries[i].ModifiedTime),
TimeToString(fileEntries[i].CreationTime),
fileEntries[i].EndOfFile,
fileEntries[i].AuxType,
)
}
fmt.Printf("\n")
}