diff --git a/cmd/irdump/main.go b/cmd/irdump/main.go new file mode 100644 index 0000000..432590f --- /dev/null +++ b/cmd/irdump/main.go @@ -0,0 +1,68 @@ +package main + +import ( + "bytes" + "errors" + "io" + "log" + "os" + + "hakurei.app/command" +) + +func main() { + log.SetFlags(0) + log.SetPrefix("irdump: ") + + var ( + flagOutput string + flagReal bool + ) + c := command.New(os.Stderr, log.Printf, "irdump", func(args []string) (err error) { + var input *os.File + if len(args) < 1 { + return errors.New("irdump requires 1 argument") + } + if input, err = os.Open(args[0]); err != nil { + return + } + defer input.Close() + + var output *os.File + if flagOutput == "" { + output = os.Stdout + } else { + defer output.Close() + if output, err = os.Create(flagOutput); err != nil { + return + } + } + + inputData := bytes.NewBuffer(nil) + if _, err = io.Copy(inputData, input); err != nil { + return + } + var out string + if out, err = Disassemble(inputData.Bytes(), flagReal); err != nil { + return + } + if _, err = output.WriteString(out); err != nil { + return + } + return + }).Flag( + &flagOutput, + "o", command.StringFlag(""), + "Output file for asm (leave empty for stdout)", + ).Flag( + &flagReal, + "r", command.BoolFlag(false), + "skip label generation; idents print real value") + + c.MustParse(os.Args[1:], func(err error) { + log.Fatal(err) + }) +} +func Disassemble(ir []byte, real bool) (string, error) { + return "hello world", nil +}