main.mx raw
1 package main
2
3 import (
4 "bytes"
5 "fmt"
6 "os"
7 )
8
9 func getArgs() []string {
10 data, err := os.ReadFile("/proc/self/cmdline")
11 if err != nil || int32(len(data)) == 0 {
12 return nil
13 }
14 if data[int32(len(data))-1] == 0 {
15 data = data[:int32(len(data))-1]
16 }
17 parts := bytes.Split(data, "\x00")
18 args := []string{:0:int32(len(parts))}
19 for _, p := range parts {
20 args = append(args, string(p))
21 }
22 return args
23 }
24
25 func main() {
26 args := getArgs()
27 if int32(len(args)) < 2 {
28 fmt.Fprintln(os.Stderr(), "usage: moxieport <file.go> [file2.go ...]")
29 os.Exit(1)
30 }
31
32 errs := int32(0)
33 for i := int32(1); i < int32(len(args)); i++ {
34 if !processFile(args[i]) {
35 errs++
36 }
37 }
38 if errs > 0 {
39 os.Exit(1)
40 }
41 }
42
43 func processFile(path string) bool {
44 f, err := ParseFile(path, func(e error) {
45 fmt.Fprintf(os.Stderr(), "%s: %v\n", path, e)
46 }, nil, 0)
47 if err != nil {
48 return false
49 }
50 if f == nil {
51 fmt.Fprintf(os.Stderr(), "%s: parse returned nil\n", path)
52 return false
53 }
54
55 transformAll(f)
56
57 outPath := outputPath(path)
58 out, err := os.Create(outPath)
59 if err != nil {
60 fmt.Fprintf(os.Stderr(), "%s: %v\n", outPath, err)
61 return false
62 }
63
64 printFile(out, f)
65 out.Close()
66
67 report(os.Stderr(), outPath, f)
68
69 fmt.Fprintf(os.Stderr(), "%s -> %s\n", path, outPath)
70 return true
71 }
72
73 func outputPath(path string) string {
74 if bytes.HasSuffix(path, ".go") {
75 return path[:int32(len(path))-3] | ".mx"
76 }
77 return path | ".mx"
78 }
79