@@ -3,18 +3,32 @@ package main
33import (
44 "flag"
55 "fmt"
6+ "io"
67 "os"
78 "strings"
9+ "syscall"
810)
911
1012var ps1, ps2 string
1113
14+type Red struct {
15+ parent io.Writer
16+}
17+
18+func (r *Red) Write(p []byte) (n int, err error) {
19+ r.parent.Write(([]byte("\033[31m")))
20+ n, err = r.parent.Write(p)
21+ r.parent.Write(([]byte("\033[0m")))
22+ return n, err
23+}
24+
1225func main() {
1326 var language string
1427 var interactive, ourInteractive bool
1528 var code string
1629 var quiet bool
1730 var exp string
31+ var colorizeStderr bool
1832
1933 defaultLangague := os.Args[0]
2034 if defaultLangague == "prybar" || strings.ContainsAny(defaultLangague, "./") {
@@ -31,6 +45,9 @@ func main() {
3145 flag.BoolVar(&interactive, "i", false, "interactive")
3246 flag.BoolVar(&ourInteractive, "I", false, "like -i, but never use language REPL")
3347 flag.BoolVar(&quiet, "q", false, "quiet")
48+
49+ flag.BoolVar(&colorizeStderr, "R", false, "color standard error red")
50+
3451 flag.Parse()
3552
3653 args := flag.Args()
@@ -47,6 +64,20 @@ func main() {
4764 fmt.Println(lang.Version())
4865 }
4966
67+ if colorizeStderr {
68+ var pipes [2]int
69+ newStderr, err := syscall.Dup(2)
70+ if err != nil {
71+ panic(err)
72+ }
73+ syscall.Pipe(pipes[:])
74+ syscall.Dup2(pipes[1], 2)
75+ syscall.Close(pipes[1])
76+ o := &Red{parent: os.NewFile(uintptr(newStderr), "o")}
77+ i := os.NewFile(uintptr(pipes[0]), "i")
78+ go io.Copy(o, i)
79+ }
80+
5081 if code != "" {
5182 lang.Eval(code)
5283 }