func main() { flag.BoolVar(&Debug, "d", false, "debug bit") var filename string flag.StringVar(&filename, "f", "", "basic source file") flag.Parse() var prog []byte var err error if filename == "" { prog, err = ioutil.ReadAll(os.Stdin) } else { prog, err = ioutil.ReadFile(filename) } if err != nil { panic(err) } terp := NewTerp(string(prog), putchar) d := draw.Register(terp) terp.Run() fmt.Printf("\n") if d.HasImage() { d.SavePng("/tmp/out.png") } }
func handler(w http.ResponseWriter, req *http.Request) { defer func() { r := recover() if r != nil { w.Header().Set("Content-Type", "text/plain") Fprintf(w, "%v", r) } }() req.ParseForm() if f4, ok4 := req.Form["list"]; ok4 { what := f4[0] if what == "" { // List all files names, err := filepath.Glob("*.bas") if err != nil { panic(err) } sort.Strings(names) w.Header().Set("Content-Type", "text/html") Fprintf(w, "<html><body>") for _, name := range names { Fprintf(w, `<a href="/?list=%s">%s</a><br>`+"\n", name, name) } } else { // List one file fd, err := os.Open(what) if err != nil { panic(err) } w.Header().Set("Content-Type", "text/plain") _, err = io.Copy(w, fd) if err != nil { panic(err) } err = fd.Close() if err != nil { panic(err) } } } else if f1, ok1 := req.Form["run"]; ok1 { var putchar func(ch byte) forward_putchar := func(ch byte) { putchar(ch) } terp := NewTerp(f1[0], forward_putchar) terp.SetExpiration("30s") d := draw.Register(terp) putchar = d.Putchar if f3, ok3 := req.Form["progname"]; ok3 { name := f3[0] if name == "" { name = "untitled" } name = strings.Trim(name, " \t\r\n") flags := os.O_CREATE | os.O_WRONLY | os.O_APPEND if strings.HasSuffix(name, "!") { flags |= os.O_EXCL } fd, err := os.OpenFile(CurlyEncode(name)+".bas", flags, 0666) if err != nil { panic(err) } w := bufio.NewWriter(fd) Fprintf(w, "###### ###### ###### ###### ###### ######\n") Fprintf(w, "%s\n", strings.Replace(f1[0], "\r", "", -1)) w.Flush() fd.Close() } terp.Run() if d.HasImage() { w.Header().Set("Content-Type", "image/png") d.WritePng(w) } else { w.Header().Set("Content-Type", "text/plain") Fprintf(w, "Use 'PRINT' or 'CALL triangle' statements to produce output.") } } else { dict := make(map[string]interface{}) if f2, ok2 := req.Form["load"]; ok2 { code, err := ioutil.ReadFile(strings.Trim(f2[0], " \t\n\r")) s := "\n" + string(code) if err != nil { panic(err) } m := THRU_CRUNCH.FindStringSubmatch(s) if m != nil { s = m[1] } dict["Code"] = s } else { dict["Code"] = template.HTML(DEMO) } { names, err := filepath.Glob("*{33}.bas") if err != nil { panic(err) } for i, e := range names { names[i] = e[:len(e)-8] // Chop "{33}.bas" } sort.Strings(names) dict["Links"] = names } Tmpl.ExecuteTemplate(w, "Main", dict) } }