Changeset 6daaf222a907a885ffd45c90aad48f9c5a72cbc8
Commiter: Charles Childers
Author: Charles Childers
Parent: 41b7e22d56
(2010/04/12 19:56) About 2 years ago
sync against hg repo for gonga
Commiter: Charles Childers
Author: Charles Childers
Parent: 41b7e22d56
(2010/04/12 19:56) About 2 years ago
sync against hg repo for gonga
type Input struct {type Input struct {io.ReadCloserfunc IncludeFile(filename string) (io.Reader, os.Error) {r, err := os.Open(filename, os.O_RDONLY, 0)if err != nil {return nil, err}br := bufio.NewReader(r)return io.Reader(br), err}func LoadDump(filename string, size int) (img []int, err os.Error) {func LoadDump(filename string, size int) (img []int, err os.Error) {if err != nil {if err != nil {switch _, err = vm.Input.Read(c[0:]); err {if _, err = vm.Input.Read(c[0:]); err == os.EOF {case os.EOF:vm.Input.Close()if vm.Input != nil {if vm.Input != nil {case nil:} else if err == nil {if f, err := IncludeFile(readA(vm.img, tos)); err == nil {name := readA(vm.img, tos)if f, err := os.Open(name, os.O_RDONLY, 0); err == nil {vm.Input = &Input{f, vm.Input}vm.Input = &Input{f, vm.Input}vm.EndOk <- truevm.Err <- nila := fmt.Sprint(":", sockets[tos].port)a := fmt.Sprint(":", sockets[tos].port)if l, err := net.Listen("tcp", a); err == nil {if l, err := net.Listen("tcp", a); err == nil {*(*sockets[tos]).listener = l(*sockets[tos]).listener = &lif c, err := l.Accept(); err == nil {if c, err := l.Accept(); err == nil {*(*sockets[tos]).conn = c(*sockets[tos]).conn = &cif err != nil {if err != nil {vm.EndOk <- falsepanic(err)var Usage = func() {var Usage = func() {Gonga is the Go version of the Ngaro virtual machine.Gonga usage:gonga [options] [image file]Usage:Gonga is the Go version of the Ngaro virtual machine.gonga [options] [image file] [-w input file(s)]It will run the image file specified in the command line.If no image file is specified in the command lineBy default, gongaImage will be loaded, retroImage if thatgongaImage will be loaded, retroImage if that fails.fails. Input files can be added preceeding the file namewith -w. They will be read in inverse order (LIFO).var shrink = flag.Bool("shrink", false, "shrink image dump file")var shrink = flag.Bool("shrink", false, "shrink image dump file")var size = flag.Int("s", 50000, "image size")var size = flag.Int("s", 50000, "image size")var dump = flag.String("d", "retro.img", "image dump file")var dump = flag.String("d", "retro.img", "image dump file")var retroImage = [...]int{}type withFiles []*os.Filefunc (wf *withFiles) String() string {return fmt.Sprint(*wf)}func (wf *withFiles) Set(value string) bool {var nwf withFilesif wf == nil {nwf = make(withFiles, 1)} else {nwf = make(withFiles, len(*wf)+1)copy(nwf, *wf)}if f, err := os.Open(value, os.O_RDONLY, 0666); err != nil {return false} else {nwf[len(nwf)-1] = f(*wf) = nwf}return true}func main() {func main() {ngaro.ClearScreen = func() { fmt.Printf("\033[2J\033[1;1H") }ngaro.ClearScreen = func() { fmt.Printf("\033[2J\033[1;1H") }if flag.NArg() == 0 {img = &retroImageswitch flag.NArg() {}case 0:with := falseinput := &ngaro.Input{os.Stdin, nil}for i := 0; i < flag.NArg(); i++ {if with {if flag.Arg(i) == "-" {input = &ngaro.Input{os.Stdin, input}} else if f, err := os.Open(flag.Arg(i), os.O_RDONLY, 0666); err != nil {panic("Wrong input file: ", flag.Arg(i))} else {input = &ngaro.Input{f, input}}with = false} else if flag.Arg(i) == "-w" || flag.Arg(i) == "--with" {with = true} else if len(img) != 0 {panic("Too many arguments")} else if img, err = ngaro.LoadDump(flag.Arg(i), *size); err != nil {panic("Wrong image file: ", flag.Arg(i))}}if len(img) == 0 {img, err = ngaro.LoadDump("gongaImage", *size)img, err = ngaro.LoadDump("gongaImage", *size)if err != nil {if err != nil {img, err = ngaro.LoadDump("retroImage", *size)img, err = ngaro.LoadDump("retroImage", *size)if err != nil {case 1:panic("Image file not found")img, err = ngaro.LoadDump(flag.Arg(0), *size)}default:fmt.Fprint(os.Stderr, "too many arguments\n")flag.Usage()os.Exit(2)}if err != nil {fmt.Fprint(os.Stderr, "error starting gonga: ", err.String())os.Exit(1)}// push os.Stdin to the bottom of the input stackinput := &ngaro.Input{os.Stdin, nil}// and add "with" (-w) filesfor i, _ := range wf {input = &ngaro.Input{wf[len(wf)-1-i], input}if ok := <-vm.EndOk; !ok {// <-vm.Err blocks until the vm diesif err = <-vm.Err; err != nil && err != os.EOF {fmt.Fprint(os.Stderr, "GONGA IS DEAD! "+err.String())echo 'save bye' | ./gonga -shrink -d gongaImage retroImage -w gonga.retroecho save bye | ./gonga -shrink -d gongaImage -w gonga.retro retroImage > /dev/nullEndOk chan boolErr chan os.Errorfunc ftoi(f float) int { return *(*int)(unsafe.Pointer(&f)) }func ftoi(f float) int { return *(*int)(unsafe.Pointer(&f)) }defer func() {if v := recover(); v != nil {if err, ok := v.(os.Error); ok {} else {vm.Err <- os.NewError("unknown error:"+fmt.Sprint(v))for ; ip < len(vm.img); ip++ {for ; ip < len(vm.img); ip++ {switch vm.img[ip] {switch vm.img[ip] {if err == os.EOF {if err == os.EOF && vm.Input != nil {vm.Input.Close()if vm.Input != nil {goto readInputgoto readInput}} else {if err != nil {vm.EndOk <- truepanic(err)}for i := tos; i < len(vm.img); i++ {i := tosif vm.img[i] == 0 {for ; i < len(vm.img) && vm.img[i] != 0; i++ {break}fmt.Fprintf(vm.Output, "%c", byte(vm.img[i]))func NewVM(img []int, dump string, in *Input, out Output) *NgaroVM {func NewVM(img []int, dump string, in *Input, out Output) *NgaroVM {vm := NgaroVM{vm := NgaroVM{EndOk: make(chan bool),Err: make(chan os.Error),