// Copyright 2009 The Go Authors.  All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

// Ogle is the beginning of a debugger for Go.
package ogle

import (
	"bufio";
	"debug/elf";
	"debug/proc";
	"exp/eval";
	"fmt";
	"go/scanner";
	"go/token";
	"os";
	"strconv";
	"strings";
)

var world *eval.World;
var curProc *Process

func Main() {
	world = eval.NewWorld();
	defineFuncs();
	r := bufio.NewReader(os.Stdin);
	for {
		print("; ");
		line, err := r.ReadSlice('\n');
		if err != nil {
			break;
		}

		// Try line as a command
		cmd, rest := getCmd(line);
		if cmd != nil {
			err := cmd.handler(rest);
			if err != nil {
				scanner.PrintError(os.Stderr, err);
			}
			continue;
		}

		// Try line as code
		code, err := world.Compile(string(line));
		if err != nil {
			scanner.PrintError(os.Stderr, err);
			continue;
		}
		v, err := code.Run();
		if err != nil {
			fmt.Fprintf(os.Stderr, err.String());
			continue;
		}
		if v != nil {
			println(v.String());
		}
	}
}

// newScanner creates a new scanner that scans that given input bytes.
func newScanner(input []byte) (*scanner.Scanner, *scanner.ErrorVector) {
	sc := new(scanner.Scanner);
	ev := new(scanner.ErrorVector);
	ev.Init();
	sc.Init("input", input, ev, 0);

	return sc, ev;
}

/*
 * Commands
 */

// A UsageError occurs when a command is called with illegal arguments.
type UsageError string;

func (e UsageError) String() string {
	return string(e);
}

// A cmd represents a single command with a handler.
type cmd struct {
	cmd string;
	handler func([]byte) os.Error;
}

var cmds = []cmd {
	cmd{"load", cmdLoad},
	cmd{"bt", cmdBt},
}

// getCmd attempts to parse an input line as a registered command.  If
// successful, it returns the command and the bytes remaining after
// the command, which should be passed to the command.
func getCmd(line []byte) (*cmd, []byte) {
	sc, _ := newScanner(line);
	pos, tok, lit := sc.Scan();
	if sc.ErrorCount != 0 || tok != token.IDENT {
		return nil, nil;
	}

	slit := string(lit);
	for i := range cmds {
		if cmds[i].cmd == slit {
			return &cmds[i], line[pos.Offset + len(lit):len(line)];
		}
	}
	return nil, nil;
}

// cmdLoad starts or attaches to a process.  Its form is similar to
// import:
//
//  load [sym] "path" [;]
//
// sym specifies the name to give to the process.  If not given, the
// name is derived from the path of the process.  If ".", then the
// packages from the remote process are defined into the current
// namespace.  If given, this symbol is defined as a package
// containing the process' packages.
//
// path gives the path of the process to start or attach to.  If it is
// "pid:<num>", then attach to the given PID.  Otherwise, treat it as
// a file path and space-separated arguments and start a new process.
//
// load always sets the current process to the loaded process.
func cmdLoad(args []byte) os.Error {
	ident, path, err := parseLoad(args);
	if err != nil {
		return err;
	}
	if curProc != nil {
		return UsageError("multiple processes not implemented");
	}
	if ident != "." {
		return UsageError("process identifiers not implemented");
	}

	// Parse argument and start or attach to process
	var fname string;
	var tproc proc.Process;
	if len(path) >= 4 && path[0:4] == "pid:" {
		pid, err := strconv.Atoi(path[4:len(path)]);
		if err != nil {
			return err;
		}
		fname, err = os.Readlink(fmt.Sprintf("/proc/%d/exe", pid));
		if err != nil {
			return err;
		}
		tproc, err = proc.Attach(pid);
		if err != nil {
			return err;
		}
		println("Attached to", pid);
	} else {
		parts := strings.Split(path, " ", 0);
		if len(parts) == 0 {
			fname = "";
		} else {
			fname = parts[0];
		}
		tproc, err = proc.ForkExec(fname, parts, os.Environ(), "", []*os.File{os.Stdin, os.Stdout, os.Stderr});
		if err != nil {
			return err;
		}
		println("Started", path);
		// TODO(austin) If we fail after this point, kill tproc
		// before detaching.
	}

	// Get symbols
	f, err := os.Open(fname, os.O_RDONLY, 0);
	if err != nil {
		tproc.Detach();
		return err;
	}
	defer f.Close();
	elf, err := elf.NewFile(f);
	if err != nil {
		tproc.Detach();
		return err;
	}
	curProc, err = NewProcessElf(tproc, elf);
	if err != nil {
		tproc.Detach();
		return err;
	}

	// Prepare new process
	curProc.OnGoroutineCreate().AddHandler(EventPrint);
	curProc.OnGoroutineExit().AddHandler(EventPrint);

	err = curProc.populateWorld(world);
	if err != nil {
		tproc.Detach();
		return err;
	}

	return nil;
}

func parseLoad(args []byte) (ident string, path string, err os.Error) {
	err = UsageError("Usage: load [sym] \"path\"");
	sc, ev := newScanner(args);

	var toks [4]token.Token;
	var lits [4][]byte;
	for i := range toks {
		_, toks[i], lits[i] = sc.Scan();
	}
	if sc.ErrorCount != 0 {
		err = ev.GetError(scanner.NoMultiples);
		return;
	}

	i := 0;
	switch toks[i] {
	case token.PERIOD, token.IDENT:
		ident = string(lits[i]);
		i++;
	}

	if toks[i] != token.STRING {
		return;
	}
	path, uerr := strconv.Unquote(string(lits[i]));
	if uerr != nil {
		err = uerr;
		return;
	}
	i++;

	if toks[i] == token.SEMICOLON {
		i++;
	}
	if toks[i] != token.EOF {
		return;
	}

	return ident, path, nil;
}

// cmdBt prints a backtrace for the current goroutine.  It takes no
// arguments.
func cmdBt(args []byte) os.Error {
	err := parseNoArgs(args, "Usage: bt");
	if err != nil {
		return err;
	}

	if curProc == nil || curProc.curGoroutine == nil {
		return NoCurrentGoroutine{};
	}

	f := curProc.curGoroutine.frame;
	if f == nil {
		fmt.Println("No frames on stack");
		return nil;
	}

	for f.Inner() != nil {
		f = f.Inner();
	}

	for i := 0; i < 100; i++ {
		if f == curProc.curGoroutine.frame {
			fmt.Printf("=> ");
		} else {
			fmt.Printf("   ");
		}
		fmt.Printf("%8x %v\n", f.pc, f);
		f, err = f.Outer();
		if err != nil {
			return err;
		}
		if f == nil {
			return nil;
		}
	}

	fmt.Println("...");
	return nil;
}

func parseNoArgs(args []byte, usage string) os.Error {
	sc, ev := newScanner(args);
	_, tok, _ := sc.Scan();
	if sc.ErrorCount != 0 {
		return ev.GetError(scanner.NoMultiples);
	}
	if tok != token.EOF {
		return UsageError(usage);
	}
	return nil;
}

/*
 * Functions
 */

// defineFuncs populates world with the built-in functions.
func defineFuncs() {
	t, v := eval.FuncFromNativeTyped(fnOut, fnOutSig);
	world.DefineConst("Out", t, v);
	t, v = eval.FuncFromNativeTyped(fnContWait, fnContWaitSig);
	world.DefineConst("ContWait", t, v);
	t, v = eval.FuncFromNativeTyped(fnBpSet, fnBpSetSig);
	world.DefineConst("BpSet", t, v);
}

// printCurFrame prints the current stack frame, as it would appear in
// a backtrace.
func printCurFrame() {
	if curProc == nil || curProc.curGoroutine == nil {
		return;
	}
	f := curProc.curGoroutine.frame;
	if f == nil {
		return;
	}
	fmt.Printf("=> %8x %v\n", f.pc, f);
}

// fnOut moves the current frame to the caller of the current frame.
func fnOutSig() {}
func fnOut(t *eval.Thread, args []eval.Value, res []eval.Value) {
	if curProc == nil {
		t.Abort(NoCurrentGoroutine{});
	}
	err := curProc.Out();
	if err != nil {
		t.Abort(err);
	}
	// TODO(austin) Only in the command form
	printCurFrame();
}

// fnContWait continues the current process and waits for a stopping event.
func fnContWaitSig() {}
func fnContWait(t *eval.Thread, args []eval.Value, res []eval.Value) {
	if curProc == nil {
		t.Abort(NoCurrentGoroutine{});
	}
	err := curProc.ContWait();
	if err != nil {
		t.Abort(err);
	}
	// TODO(austin) Only in the command form
	ev := curProc.Event();
	if ev != nil {
		fmt.Printf("%v\n", ev);
	}
	printCurFrame();
}

// fnBpSet sets a breakpoint at the entry to the named function.
func fnBpSetSig(string) {}
func fnBpSet(t *eval.Thread, args []eval.Value, res []eval.Value) {
	// TODO(austin) This probably shouldn't take a symbol name.
	// Perhaps it should take an interface that provides PC's.
	// Functions and instructions can implement that interface and
	// we can have something to translate file:line pairs.
	if curProc == nil {
		t.Abort(NoCurrentGoroutine{});
	}
	name := args[0].(eval.StringValue).Get(t);
	fn := curProc.syms.LookupFunc(name);
	if fn == nil {
		t.Abort(UsageError("no such function " + name));
	}
	curProc.OnBreakpoint(proc.Word(fn.Entry)).AddHandler(EventStop);
}
