Пример #1
0
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")
	}
}
Пример #2
0
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)
	}
}