fspl/compiler/filetype.go

96 lines
2.8 KiB
Go

package compiler
import "fmt"
import "git.tebibyte.media/fspl/fspl/generator"
// Filetype represents an output filetype.
type Filetype int; const (
FiletypeUnknown Filetype = iota
FiletypeObject
FiletypeLibrary
FiletypeAssembly
FiletypeIR
FiletypeExecutable
)
// FiletypeFromString returns a filetype based on the given name.
func FiletypeFromString (ext string) (Filetype, bool) {
switch ext {
case "": return FiletypeUnknown, true
case "obj": return FiletypeObject, true
case "lib": return FiletypeLibrary, true
case "asm": return FiletypeAssembly, true
case "ir": return FiletypeIR, true
case "exe": return FiletypeExecutable, true
default: return FiletypeUnknown, false
}
}
// FiletypeFromExt returns a filetype based on the given filename extension.
func FiletypeFromExt (target generator.Target, ext string) (Filetype, bool) {
switch ext {
case targetObjExt(target): return FiletypeObject, true
case targetSoExt(target): return FiletypeLibrary, true
case ".s": return FiletypeAssembly, true
case ".ll": return FiletypeIR, true
case targetExeExt(target): return FiletypeExecutable, true
default: return FiletypeUnknown, false
}
}
// String returns a string representation of the filetype.
func (filetype Filetype) String () string {
switch filetype {
case FiletypeUnknown: return ""
case FiletypeObject: return "obj"
case FiletypeLibrary: return "lib"
case FiletypeAssembly: return "asm"
case FiletypeIR: return "ir"
case FiletypeExecutable: return "exe"
default: return fmt.Sprintf("Filetype(%d)", filetype)
}
}
// Ext returns the standard filename extension of the filetype.
func (filetype Filetype) Ext (target generator.Target) string {
switch filetype {
case FiletypeUnknown: return ""
case FiletypeObject: return targetObjExt(target)
case FiletypeLibrary: return targetSoExt(target)
case FiletypeAssembly: return ".s"
case FiletypeIR: return ".ll"
case FiletypeExecutable: return targetExeExt(target)
default: return ""
}
}
// Extend adds the extension of the filetype onto the specified path.
func (filetype Filetype) Extend (target generator.Target, path string) string {
return path + filetype.Ext(target)
}
func targetSoExt (target generator.Target) string {
// TODO: more research is required here
switch target.OS {
case "win32": return ".dll"
default: return ".so"
}
}
func targetObjExt (target generator.Target) string {
// TODO: more research is required here
switch target.OS {
case "win32": return ".obj"
default: return ".o"
}
}
func targetExeExt (target generator.Target) string {
// TODO: more research is required here
switch target.OS {
case "win32": return ".exe"
default: return ""
}
}