diff --git a/src/asm/Finalize.go b/src/asm/Finalize.go index d231a22..bff469b 100644 --- a/src/asm/Finalize.go +++ b/src/asm/Finalize.go @@ -31,11 +31,11 @@ func (a Assembler) Finalize(dlls dll.List) ([]byte, []byte) { ) switch config.TargetOS { - case "linux": + case config.Linux: headerEnd = elf.HeaderEnd - case "macos": + case config.Mac: headerEnd = macho.HeaderEnd - case "windows": + case config.Windows: headerEnd = pe.HeaderEnd } @@ -443,7 +443,7 @@ restart: binary.LittleEndian.PutUint32(slice, uint32(address)) } - if config.TargetOS == "windows" { + if config.TargetOS == config.Windows { if len(data) == 0 { data = []byte{0} } diff --git a/src/build/Build.go b/src/build/Build.go index cb221a4..52c9f5f 100644 --- a/src/build/Build.go +++ b/src/build/Build.go @@ -37,7 +37,7 @@ func (build *Build) Executable() string { path = fromDirectoryName(path) } - if config.TargetOS == "windows" { + if config.TargetOS == config.Windows { path += ".exe" } diff --git a/src/cli/Build.go b/src/cli/Build.go index 00fc49a..206ef7c 100644 --- a/src/cli/Build.go +++ b/src/cli/Build.go @@ -3,6 +3,7 @@ package cli import ( "fmt" "os" + "runtime" "strings" "git.akyoto.dev/cli/q/src/build" @@ -60,7 +61,16 @@ func buildWithArgs(args []string) (*build.Build, error) { return b, &errors.ExpectedCLIParameter{Parameter: "os"} } - config.TargetOS = args[i] + switch args[i] { + case "linux": + config.TargetOS = config.Linux + case "mac": + config.TargetOS = config.Mac + case "windows": + config.TargetOS = config.Windows + default: + return b, &errors.InvalidParameterValue{Value: args[i], Parameter: "os"} + } default: if strings.HasPrefix(args[i], "-") { @@ -71,6 +81,10 @@ func buildWithArgs(args []string) (*build.Build, error) { } } + if config.TargetOS == config.Unknown { + return b, &errors.InvalidParameterValue{Value: runtime.GOOS, Parameter: "os"} + } + if len(b.Files) == 0 { b.Files = append(b.Files, ".") } diff --git a/src/compiler/Result.go b/src/compiler/Result.go index 5186858..722ab99 100644 --- a/src/compiler/Result.go +++ b/src/compiler/Result.go @@ -2,7 +2,6 @@ package compiler import ( "bufio" - "fmt" "io" "os" @@ -38,15 +37,15 @@ func (r *Result) finalize() ([]byte, []byte, dll.List) { final.Call("main.main") switch config.TargetOS { - case "linux": + case config.Linux: final.RegisterNumber(asm.MOVE, x64.SyscallInputRegisters[0], LinuxExit) final.RegisterNumber(asm.MOVE, x64.SyscallInputRegisters[1], 0) final.Syscall() - case "mac": + case config.Mac: final.RegisterNumber(asm.MOVE, x64.SyscallInputRegisters[0], MacExit) final.RegisterNumber(asm.MOVE, x64.SyscallInputRegisters[1], 0) final.Syscall() - case "windows": + case config.Windows: final.RegisterNumber(asm.MOVE, x64.WindowsInputRegisters[0], 0) final.DLLCall("kernel32.ExitProcess") } @@ -70,15 +69,15 @@ func (r *Result) finalize() ([]byte, []byte, dll.List) { final.Label(asm.LABEL, "_crash") switch config.TargetOS { - case "linux": + case config.Linux: final.RegisterNumber(asm.MOVE, x64.SyscallInputRegisters[0], LinuxExit) final.RegisterNumber(asm.MOVE, x64.SyscallInputRegisters[1], 1) final.Syscall() - case "mac": + case config.Mac: final.RegisterNumber(asm.MOVE, x64.SyscallInputRegisters[0], MacExit) final.RegisterNumber(asm.MOVE, x64.SyscallInputRegisters[1], 1) final.Syscall() - case "windows": + case config.Windows: final.RegisterNumber(asm.MOVE, x64.WindowsInputRegisters[0], 1) final.DLLCall("kernel32.ExitProcess") } @@ -155,14 +154,12 @@ func write(writer io.Writer, code []byte, data []byte, dlls dll.List) error { buffer := bufio.NewWriter(writer) switch config.TargetOS { - case "linux": + case config.Linux: elf.Write(buffer, code, data) - case "mac": + case config.Mac: macho.Write(buffer, code, data) - case "windows": + case config.Windows: pe.Write(buffer, code, data, dlls) - default: - return fmt.Errorf("unsupported platform '%s'", config.TargetOS) } return buffer.Flush() diff --git a/src/config/config.go b/src/config/config.go index 6689c3e..b012e55 100644 --- a/src/config/config.go +++ b/src/config/config.go @@ -27,7 +27,7 @@ var ( TargetArch string // Target platform. - TargetOS string + TargetOS OS ) // Reset resets the configuration to its default values. @@ -36,9 +36,14 @@ func Reset() { ConstantFold = true Dry = false TargetArch = runtime.GOARCH - TargetOS = runtime.GOOS + TargetOS = Unknown - if TargetOS == "darwin" { - TargetOS = "mac" + switch runtime.GOOS { + case "linux": + TargetOS = Linux + case "darwin": + TargetOS = Mac + case "windows": + TargetOS = Windows } } diff --git a/src/config/os.go b/src/config/os.go new file mode 100644 index 0000000..d6893e2 --- /dev/null +++ b/src/config/os.go @@ -0,0 +1,10 @@ +package config + +type OS uint8 + +const ( + Unknown OS = iota + Linux + Mac + Windows +) diff --git a/src/errors/InvalidParameterValue.go b/src/errors/InvalidParameterValue.go new file mode 100644 index 0000000..cd2989e --- /dev/null +++ b/src/errors/InvalidParameterValue.go @@ -0,0 +1,14 @@ +package errors + +import "fmt" + +// InvalidParameterValue error is created when a parameter has an invalid value. +type InvalidParameterValue struct { + Value string + Parameter string +} + +// Error generates the string representation. +func (err *InvalidParameterValue) Error() string { + return fmt.Sprintf("Invalid value '%s' for parameter '%s'", err.Value, err.Parameter) +} diff --git a/src/scanner/queueDirectory.go b/src/scanner/queueDirectory.go index cc49a20..eebd2d3 100644 --- a/src/scanner/queueDirectory.go +++ b/src/scanner/queueDirectory.go @@ -21,15 +21,15 @@ func (s *Scanner) queueDirectory(directory string, pkg string) { return } - if strings.HasSuffix(name, "_linux.q") && config.TargetOS != "linux" { + if strings.HasSuffix(name, "_linux.q") && config.TargetOS != config.Linux { return } - if strings.HasSuffix(name, "_mac.q") && config.TargetOS != "mac" { + if strings.HasSuffix(name, "_mac.q") && config.TargetOS != config.Mac { return } - if strings.HasSuffix(name, "_windows.q") && config.TargetOS != "windows" { + if strings.HasSuffix(name, "_windows.q") && config.TargetOS != config.Windows { return }