package main import ( "os" ) func readFile(path string) (data []byte, err error) { f, err := os.Open(path) if err != nil { return } info, err := f.Stat() if err != nil { f.Close() return } sz := int32(info.Size()) if sz == 0 { sz = 4096 } buf := []byte{:0:sz + 1} for { if len(buf) >= cap(buf) { nb := []byte{:len(buf):len(buf) * 2} copy(nb, buf) buf = nb } n, rerr := f.Read(buf[len(buf):cap(buf)]) buf = buf[:len(buf)+n] if rerr != nil { break } } f.Close() data = buf return } func writeFile(path string, data []byte) (err error) { f, err := os.Create(path) if err != nil { return } _, err = f.Write(data) cerr := f.Close() if err == nil { err = cerr } return } func main() { args := os.Args if len(args) == 0 { args = argsFromCmdline() } if len(args) < 2 { os.Stderr().Write([]byte("usage: moxiefmt [-w] file.mx ...\n")) os.Exit(1) } write := false files := []string{:0:len(args)} for i := int32(1); i < int32(len(args)); i++ { a := args[i] if a == "-w" { write = true } else { files = append(files, a) } } if len(files) == 0 { os.Stderr().Write([]byte("no files specified\n")) os.Exit(1) } exitCode := int32(0) for i := int32(0); i < int32(len(files)); i++ { ok, err := processFile(files[i], write) if err != nil { os.Stderr().Write([]byte("moxiefmt: " | files[i] | ": " | err.Error() | "\n")) exitCode = 1 } if !ok { exitCode = 1 } } os.Exit(exitCode) } func argsFromCmdline() []string { data, err := readFile("/proc/self/cmdline") if err != nil { return nil } args := []string{:0:8} start := int32(0) for i := int32(0); i < int32(len(data)); i++ { if data[i] == 0 { if i > start { args = append(args, string(data[start:i])) } start = i + 1 } } if start < int32(len(data)) { args = append(args, string(data[start:])) } return args } func processFile(path string, write bool) (ok bool, err error) { src, err := readFile(path) if err != nil { return } out, errs := formatSource(string(src)) reportErrors(path, errs) ok = len(errs) == 0 if write { err = writeFile(path, []byte(out)) } else { _, err = os.Stdout().Write([]byte(out)) } return }