mirror of https://github.com/zellyn/diskii.git
working on filetypes
This commit is contained in:
parent
ef9115dcaf
commit
bbf7d696db
|
@ -82,6 +82,7 @@ will be likely to get priority.
|
||||||
- [ ] Implement it for DOS 3.3
|
- [ ] Implement it for DOS 3.3
|
||||||
- [x] Add basic ProDOS structures
|
- [x] Add basic ProDOS structures
|
||||||
- [ ] Add ProDOS support
|
- [ ] Add ProDOS support
|
||||||
|
- [x] Make `filetypes` command use a tabwriter to write as a table
|
||||||
|
|
||||||
# Related tools
|
# Related tools
|
||||||
|
|
||||||
|
|
|
@ -5,39 +5,22 @@ package cmd
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
|
"text/tabwriter"
|
||||||
|
|
||||||
"github.com/spf13/cobra"
|
|
||||||
"github.com/zellyn/diskii/types"
|
"github.com/zellyn/diskii/types"
|
||||||
)
|
)
|
||||||
|
|
||||||
var all bool // flag for whether to show all filetypes
|
type FiletypesCmd struct {
|
||||||
|
All bool `kong:"help='Display all types, including SOS types and reserved ranges.'"`
|
||||||
// filetypesCmd represents the filetypes command, used to display
|
|
||||||
// valid filetypes recognized by diskii.
|
|
||||||
var filetypesCmd = &cobra.Command{
|
|
||||||
Use: "filetypes",
|
|
||||||
Short: "print a list of filetypes",
|
|
||||||
Long: `Print a list of filetypes understood by diskii`,
|
|
||||||
Run: func(cmd *cobra.Command, args []string) {
|
|
||||||
if err := runFiletypes(args); err != nil {
|
|
||||||
fmt.Fprintln(os.Stderr, err.Error())
|
|
||||||
os.Exit(-1)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func init() {
|
func (f *FiletypesCmd) Run(globals *types.Globals) error {
|
||||||
RootCmd.AddCommand(filetypesCmd)
|
w := tabwriter.NewWriter(os.Stdout, 0, 0, 1, ' ', 0)
|
||||||
filetypesCmd.Flags().BoolVarP(&all, "all", "a", false, "display all types, including SOS types and reserved ranges")
|
fmt.Fprintln(w, "Description\tName\tThree-letter Name\tOne-letter Name")
|
||||||
}
|
fmt.Fprintln(w, "-----------\t----\t-----------------\t---------------")
|
||||||
|
for _, typ := range types.FiletypeInfos(f.All) {
|
||||||
// runFiletypes performs the actual listing of filetypes.
|
fmt.Fprintf(w, "%s\t%s\t%s\t%s\n", typ.Desc, typ.Name, typ.ThreeLetter, typ.OneLetter)
|
||||||
func runFiletypes(args []string) error {
|
|
||||||
if len(args) != 0 {
|
|
||||||
return fmt.Errorf("filetypes expects no arguments")
|
|
||||||
}
|
|
||||||
for _, typ := range types.FiletypeNames(all) {
|
|
||||||
fmt.Println(typ)
|
|
||||||
}
|
}
|
||||||
|
w.Flush()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
5
main.go
5
main.go
|
@ -18,8 +18,9 @@ import (
|
||||||
var cli struct {
|
var cli struct {
|
||||||
Debug bool `kong:"short='v',help='Enable debug mode.'"`
|
Debug bool `kong:"short='v',help='Enable debug mode.'"`
|
||||||
|
|
||||||
Ls cmd.LsCmd `cmd:"" aliases:"cat,catalog" help:"List paths."`
|
Ls cmd.LsCmd `cmd:"" aliases:"cat,catalog" help:"List paths."`
|
||||||
Reorder cmd.ReorderCmd `cmd:"" help:"Reorder disk images."`
|
Reorder cmd.ReorderCmd `cmd:"" help:"Reorder disk images."`
|
||||||
|
Filetypes cmd.FiletypesCmd `cmd:"" help:"Print a list of filetypes understood by diskii."`
|
||||||
}
|
}
|
||||||
|
|
||||||
func run() error {
|
func run() error {
|
||||||
|
|
|
@ -57,62 +57,62 @@ const (
|
||||||
// | C0-EE | ProDOS | ProDOS reserved for future use
|
// | C0-EE | ProDOS | ProDOS reserved for future use
|
||||||
)
|
)
|
||||||
|
|
||||||
// filetypeInfo holds name information about filetype constants.
|
// FiletypeInfo holds name information about filetype constants.
|
||||||
type filetypeInfo struct {
|
type FiletypeInfo struct {
|
||||||
Type Filetype // The type itself
|
Type Filetype // The type itself
|
||||||
Name string // The constant name, without the "Filetype" prefix
|
Name string // The constant name, without the "Filetype" prefix
|
||||||
ThreeLetter string // The three-letter abbreviation (ProDOS)
|
ThreeLetter string // The three-letter abbreviation (ProDOS)
|
||||||
OneLetter string // The one-letter abbreviation (DOS 3.x)
|
OneLetter string // The one-letter abbreviation (DOS 3.x)
|
||||||
Desc string // The description of the type
|
Desc string // The description of the type
|
||||||
Stringified string // (Generated) result of calling String() on the Constant
|
|
||||||
Extra bool // If true, exclude from normal display listing
|
Extra bool // If true, exclude from normal display listing
|
||||||
|
|
||||||
|
Stringified string // (Generated) result of calling String() on the Constant
|
||||||
|
NamesString string // (Generated) the names usable for this filetype.
|
||||||
}
|
}
|
||||||
|
|
||||||
// names of Filetype constants above
|
// names of Filetype constants above
|
||||||
var filetypeInfos = []filetypeInfo{
|
var filetypeInfos = []FiletypeInfo{
|
||||||
{FiletypeTypeless, "Typeless", "", "", "Typeless file", "", false},
|
{Type: FiletypeTypeless, Name: "Typeless", Desc: "Typeless file"},
|
||||||
{FiletypeBadBlocks, "BadBlocks", "", "", "Bad blocks file", "", false},
|
{Type: FiletypeBadBlocks, Name: "BadBlocks", Desc: "Bad blocks file"},
|
||||||
{FiletypeSOSPascalCode, "SOSPascalCode", "", "", "PASCAL code file", "", true},
|
{Type: FiletypeSOSPascalCode, Name: "SOSPascalCode", Desc: "PASCAL code file", Extra: true},
|
||||||
{FiletypeSOSPascalText, "SOSPascalText", "", "", "PASCAL text file", "", true},
|
{Type: FiletypeSOSPascalText, Name: "SOSPascalText", Desc: "PASCAL text file", Extra: true},
|
||||||
{FiletypeASCIIText, "ASCIIText", "T", "TXT", "ASCII text file", "", false},
|
{Type: FiletypeASCIIText, Name: "ASCIIText", ThreeLetter: "TXT", OneLetter: "T", Desc: "ASCII text file"},
|
||||||
{FiletypeSOSPascalText2, "SOSPascalText2", "", "", "PASCAL text file", "", true},
|
{Type: FiletypeSOSPascalText2, Name: "SOSPascalText2", Desc: "PASCAL text file", Extra: true},
|
||||||
{FiletypeBinary, "Binary", "B", "BIN", "Binary file", "", false},
|
{Type: FiletypeBinary, Name: "Binary", ThreeLetter: "BIN", OneLetter: "B", Desc: "Binary file"},
|
||||||
{FiletypeFont, "Font", "", "", "Font file", "", true},
|
{Type: FiletypeFont, Name: "Font", Desc: "Font file", Extra: true},
|
||||||
{FiletypeGraphicsScreen, "GraphicsScreen", "", "", "Graphics screen file", "", true},
|
{Type: FiletypeGraphicsScreen, Name: "GraphicsScreen", Desc: "Graphics screen file", Extra: true},
|
||||||
{FiletypeBusinessBASIC, "BusinessBASIC", "", "", "Business BASIC program file", "", true},
|
{Type: FiletypeBusinessBASIC, Name: "BusinessBASIC", Desc: "Business BASIC program file", Extra: true},
|
||||||
{FiletypeBusinessBASICData, "BusinessBASICData", "", "", "Business BASIC data file", "", true},
|
{Type: FiletypeBusinessBASICData, Name: "BusinessBASICData", Desc: "Business BASIC data file", Extra: true},
|
||||||
{FiletypeSOSWordProcessor, "SOSWordProcessor", "", "", "Word processor file", "", true},
|
{Type: FiletypeSOSWordProcessor, Name: "SOSWordProcessor", Desc: "Word processor file", Extra: true},
|
||||||
{FiletypeSOSSystem, "SOSSystem", "", "", "SOS system file", "", true},
|
{Type: FiletypeSOSSystem, Name: "SOSSystem", Desc: "SOS system file", Extra: true},
|
||||||
{FiletypeDirectory, "Directory", "", "DIR", "Directory file", "", false},
|
{Type: FiletypeDirectory, Name: "Directory", ThreeLetter: "DIR", OneLetter: "D", Desc: "Directory file"},
|
||||||
{FiletypeRPSData, "RPSData", "", "", "RPS data file", "", true},
|
{Type: FiletypeRPSData, Name: "RPSData", Desc: "RPS data file", Extra: true},
|
||||||
{FiletypeRPSIndex, "RPSIndex", "", "", "RPS index file", "", true},
|
{Type: FiletypeRPSIndex, Name: "RPSIndex", Desc: "RPS index file", Extra: true},
|
||||||
{FiletypeAppleWorksDatabase, "AppleWorksDatabase", "", "ADB", "AppleWorks data base file", "", false},
|
{Type: FiletypeAppleWorksDatabase, Name: "AppleWorksDatabase", ThreeLetter: "ADB", Desc: "AppleWorks data base file"},
|
||||||
{FiletypeAppleWorksWordProcessor, "AppleWorksWordProcessor", "", "AWP", "AppleWorks word processing file", "", false},
|
{Type: FiletypeAppleWorksWordProcessor, Name: "AppleWorksWordProcessor", ThreeLetter: "AWP", Desc: "AppleWorks word processing file"},
|
||||||
{FiletypeAppleWorksSpreadsheet, "AppleWorksSpreadsheet", "", "ASP", "AppleWorks spreadsheet file", "", false},
|
{Type: FiletypeAppleWorksSpreadsheet, Name: "AppleWorksSpreadsheet", ThreeLetter: "ASP", Desc: "AppleWorks spreadsheet file"},
|
||||||
{FiletypePascal, "Pascal", "", "PAS", "ProDOS PASCAL file", "", false},
|
{Type: FiletypePascal, Name: "Pascal", ThreeLetter: "PAS", Desc: "ProDOS PASCAL file"},
|
||||||
{FiletypeCommand, "Command", "", "CMD", "Added command file", "", false},
|
{Type: FiletypeCommand, Name: "Command", ThreeLetter: "CMD", Desc: "Added command file"},
|
||||||
{FiletypeUserDefinedF1, "UserDefinedF1", "", "", "ProDOS user defined file type F1", "", true},
|
{Type: FiletypeUserDefinedF1, Name: "UserDefinedF1", Desc: "ProDOS user defined file type F1", Extra: true},
|
||||||
{FiletypeUserDefinedF2, "UserDefinedF2", "", "", "ProDOS user defined file type F2", "", true},
|
{Type: FiletypeUserDefinedF2, Name: "UserDefinedF2", Desc: "ProDOS user defined file type F2", Extra: true},
|
||||||
{FiletypeUserDefinedF3, "UserDefinedF3", "", "", "ProDOS user defined file type F3", "", true},
|
{Type: FiletypeUserDefinedF3, Name: "UserDefinedF3", Desc: "ProDOS user defined file type F3", Extra: true},
|
||||||
{FiletypeUserDefinedF4, "UserDefinedF4", "", "", "ProDOS user defined file type F4", "", true},
|
{Type: FiletypeUserDefinedF4, Name: "UserDefinedF4", Desc: "ProDOS user defined file type F4", Extra: true},
|
||||||
{FiletypeUserDefinedF5, "UserDefinedF5", "", "", "ProDOS user defined file type F5", "", true},
|
{Type: FiletypeUserDefinedF5, Name: "UserDefinedF5", Desc: "ProDOS user defined file type F5", Extra: true},
|
||||||
{FiletypeUserDefinedF6, "UserDefinedF6", "", "", "ProDOS user defined file type F6", "", true},
|
{Type: FiletypeUserDefinedF6, Name: "UserDefinedF6", Desc: "ProDOS user defined file type F6", Extra: true},
|
||||||
{FiletypeUserDefinedF7, "UserDefinedF7", "", "", "ProDOS user defined file type F7", "", true},
|
{Type: FiletypeUserDefinedF7, Name: "UserDefinedF7", Desc: "ProDOS user defined file type F7", Extra: true},
|
||||||
{FiletypeUserDefinedF8, "UserDefinedF8", "", "", "ProDOS user defined file type F8", "", true},
|
{Type: FiletypeUserDefinedF8, Name: "UserDefinedF8", Desc: "ProDOS user defined file type F8", Extra: true},
|
||||||
{FiletypeIntegerBASIC, "IntegerBASIC", "I", "INT", "Integer BASIC program file", "", false},
|
{Type: FiletypeIntegerBASIC, Name: "IntegerBASIC", ThreeLetter: "INT", OneLetter: "I", Desc: "Integer BASIC program file"},
|
||||||
{FiletypeIntegerBASICVariables, "IntegerBASICVariables", "", "IVR", "Integer BASIC variables file", "", false},
|
{Type: FiletypeIntegerBASICVariables, Name: "IntegerBASICVariables", ThreeLetter: "IVR", Desc: "Integer BASIC variables file"},
|
||||||
{FiletypeApplesoftBASIC, "ApplesoftBASIC", "A", "BAS", "Applesoft BASIC program file", "", false},
|
{Type: FiletypeApplesoftBASIC, Name: "ApplesoftBASIC", ThreeLetter: "BAS", OneLetter: "A", Desc: "Applesoft BASIC program file"},
|
||||||
{FiletypeApplesoftBASICVariables, "ApplesoftBASICVariables", "", "VAR", "Applesoft BASIC variables file", "", false},
|
{Type: FiletypeApplesoftBASICVariables, Name: "ApplesoftBASICVariables", ThreeLetter: "VAR", Desc: "Applesoft BASIC variables file"},
|
||||||
{FiletypeRelocatable, "Relocatable", "R", "REL", "EDASM relocatable object module file", "", false},
|
{Type: FiletypeRelocatable, Name: "Relocatable", ThreeLetter: "REL", OneLetter: "R", Desc: "EDASM relocatable object module file"},
|
||||||
{FiletypeSystem, "System", "", "SYS", "System file", "", false},
|
{Type: FiletypeSystem, Name: "System", ThreeLetter: "SYS", Desc: "System file"},
|
||||||
{FiletypeS, "S", "", "S", `DOS 3.3 Type "S"`, "", false},
|
{Type: FiletypeS, Name: "S", OneLetter: "S", Desc: `DOS 3.3 Type "S"`},
|
||||||
{FiletypeNewA, "NewA", "", "A", `DOS 3.3 Type "new A"`, "", false},
|
{Type: FiletypeNewA, Name: "NewA", OneLetter: "A", Desc: `DOS 3.3 Type "new A"`},
|
||||||
{FiletypeNewB, "NewB", "", "B", `DOS 3.3 Type "new B"`, "", false},
|
{Type: FiletypeNewB, Name: "NewB", OneLetter: "B", Desc: `DOS 3.3 Type "new B"`},
|
||||||
}
|
}
|
||||||
|
|
||||||
var filetypeInfosMap map[Filetype]filetypeInfo
|
var filetypeInfosMap map[Filetype]FiletypeInfo
|
||||||
var filetypeNames []string
|
|
||||||
var filetypeNamesExtras []string
|
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
sosReserved := []Filetype{0x0D, 0x0E, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18}
|
sosReserved := []Filetype{0x0D, 0x0E, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18}
|
||||||
|
@ -124,7 +124,7 @@ func init() {
|
||||||
prodosReserved = append(prodosReserved, i)
|
prodosReserved = append(prodosReserved, i)
|
||||||
}
|
}
|
||||||
for _, typ := range sosReserved {
|
for _, typ := range sosReserved {
|
||||||
info := filetypeInfo{
|
info := FiletypeInfo{
|
||||||
Type: typ,
|
Type: typ,
|
||||||
Name: fmt.Sprintf("SOSReserved%02X", int(typ)),
|
Name: fmt.Sprintf("SOSReserved%02X", int(typ)),
|
||||||
ThreeLetter: "",
|
ThreeLetter: "",
|
||||||
|
@ -135,7 +135,7 @@ func init() {
|
||||||
filetypeInfos = append(filetypeInfos, info)
|
filetypeInfos = append(filetypeInfos, info)
|
||||||
}
|
}
|
||||||
for _, typ := range prodosReserved {
|
for _, typ := range prodosReserved {
|
||||||
info := filetypeInfo{
|
info := FiletypeInfo{
|
||||||
Type: typ,
|
Type: typ,
|
||||||
Name: fmt.Sprintf("ProDOSReserved%02X", int(typ)),
|
Name: fmt.Sprintf("ProDOSReserved%02X", int(typ)),
|
||||||
ThreeLetter: "",
|
ThreeLetter: "",
|
||||||
|
@ -147,25 +147,24 @@ func init() {
|
||||||
}
|
}
|
||||||
|
|
||||||
seen := map[string]bool{}
|
seen := map[string]bool{}
|
||||||
filetypeInfosMap = make(map[Filetype]filetypeInfo, len(filetypeInfos))
|
filetypeInfosMap = make(map[Filetype]FiletypeInfo, len(filetypeInfos))
|
||||||
for i, info := range filetypeInfos {
|
for i, info := range filetypeInfos {
|
||||||
info.Stringified = info.Desc + " (" + info.Name
|
info.Stringified = info.Desc + " (" + info.Name
|
||||||
|
info.NamesString = info.Name
|
||||||
if info.ThreeLetter != "" && !seen[info.ThreeLetter] {
|
if info.ThreeLetter != "" && !seen[info.ThreeLetter] {
|
||||||
info.Stringified += "|" + info.ThreeLetter
|
info.Stringified += "|" + info.ThreeLetter
|
||||||
|
info.NamesString += "|" + info.ThreeLetter
|
||||||
seen[info.ThreeLetter] = true
|
seen[info.ThreeLetter] = true
|
||||||
}
|
}
|
||||||
if info.OneLetter != "" && info.OneLetter != info.Name && !seen[info.OneLetter] {
|
if info.OneLetter != "" && info.OneLetter != info.Name && !seen[info.OneLetter] {
|
||||||
info.Stringified += "|" + info.OneLetter
|
info.Stringified += "|" + info.OneLetter
|
||||||
|
info.NamesString += "|" + info.OneLetter
|
||||||
seen[info.OneLetter] = true
|
seen[info.OneLetter] = true
|
||||||
}
|
}
|
||||||
info.Stringified += ")"
|
info.Stringified += ")"
|
||||||
|
|
||||||
filetypeInfos[i] = info
|
filetypeInfos[i] = info
|
||||||
filetypeInfosMap[info.Type] = info
|
filetypeInfosMap[info.Type] = info
|
||||||
filetypeNamesExtras = append(filetypeNamesExtras, info.Stringified)
|
|
||||||
if !info.Extra {
|
|
||||||
filetypeNames = append(filetypeNames, info.Stringified)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -187,10 +186,16 @@ func FiletypeForName(name string) (Filetype, error) {
|
||||||
return 0, fmt.Errorf("Unknown Filetype: %q", name)
|
return 0, fmt.Errorf("Unknown Filetype: %q", name)
|
||||||
}
|
}
|
||||||
|
|
||||||
// FiletypeNames returns a list of all filetype names.
|
// FiletypeInfos returns a list information on all filetypes.
|
||||||
func FiletypeNames(all bool) []string {
|
func FiletypeInfos(all bool) []FiletypeInfo {
|
||||||
if all {
|
if all {
|
||||||
return filetypeNamesExtras
|
return filetypeInfos
|
||||||
}
|
}
|
||||||
return filetypeNames
|
var result []FiletypeInfo
|
||||||
|
for _, info := range filetypeInfos {
|
||||||
|
if !info.Extra {
|
||||||
|
result = append(result, info)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue