github.com/jflude/taocp@v0.0.0-20240210234939-99f2a91af3c2/cmd/mixal/main.go (about) 1 package main 2 3 import ( 4 "bytes" 5 "errors" 6 "flag" 7 "io" 8 "log" 9 "os" 10 "strings" 11 12 "github.com/jflude/taocp/mixal" 13 ) 14 15 func main() { 16 log.SetFlags(0) 17 if err := run(); err != nil { 18 log.Fatalln("error:", err) 19 } 20 } 21 22 func run() (err error) { 23 var interrupts bool 24 if env, ok := os.LookupEnv("MIX_ENABLE_INTERRUPTS"); ok { 25 env = strings.ToLower(env) 26 interrupts = (env[0] == '1' || env[0] == 'y' || env == "true") 27 } 28 flag.BoolVar(&interrupts, "int", interrupts, "enable interrupts") 29 flag.Parse() 30 if flag.NArg() != 1 { 31 err = errors.New("mixal [-int] INPUT-FILE") 32 return 33 } 34 var in io.ReadCloser 35 if flag.Arg(0) == "-" { 36 in = os.Stdin 37 } else { 38 if in, err = os.Open(flag.Arg(0)); err != nil { 39 return 40 } 41 defer func() { 42 if err2 := in.Close(); err2 != nil { 43 if err == nil { 44 err = err2 45 } else { 46 log.Println("error:", err2) 47 } 48 } 49 }() 50 } 51 var buf bytes.Buffer 52 if err = mixal.Assemble(in, &buf, interrupts); err != nil { 53 return 54 } 55 out, err := os.Create("reader.mix") 56 if err != nil { 57 return 58 } 59 defer func() { 60 if err2 := out.Close(); err2 != nil { 61 if err == nil { 62 err = err2 63 } else { 64 log.Println("error:", err2) 65 } 66 } 67 }() 68 _, err = io.Copy(out, &buf) 69 return 70 }