//
//
// gsh - Go lang based Shell
// (c) 2020 ITS more Co., Ltd.
// 2020-0807 created by SatoxITS (ITS more)
//
package main
import (
	"bufio" // https://golang.org/pkg/bufio/
	"strings"
	"fmt"
	//"strconv"
	"os"
	"syscall"
	"go/types"
	"go/token"
)
var LINESIZE = 1024
var PROMPT = "> "
func env(argv []string) {
	env := os.Environ()
	for _, v := range env {
		fmt.Printf("%v\n",v)
	}
}
func which(path string) (fullpath string, itis bool){
	pathenv, found := os.LookupEnv("PATH")
	if found {
		dirv := strings.Split(pathenv,":")
		for _, dir := range dirv {
			fi, err := os.Stat(dir+"/"+path)
			if err == nil {
				fm := fi.Mode()
				if fm.IsRegular() {
					//fmt.Printf("%s\n",dir+"/"+path)
					return dir+"/"+path, true
				}
			}
		}
	}
	return "", false
}
func eval(argv []string, nlend bool){
	var ai = 1
	pfmt := "%s"
	if argv[ai][0:1] == "%" {
		pfmt = argv[ai]
		ai = 2
	}
	if len(argv) <= ai {
		return
	}
	gocode := strings.Join(argv[ai:]," ");
	fset := token.NewFileSet()
	rval, _ := types.Eval(fset,nil,token.NoPos,gocode)
	fmt.Printf(pfmt,rval.Value)
	if nlend { fmt.Printf("\n") }
}
func main() {
	for hi := 0; ; hi++ {
		fmt.Printf("%d",hi)
		fmt.Print(PROMPT)
		reader := bufio.NewReaderSize(os.Stdin,LINESIZE);
		line, _, _ := reader.ReadLine()
		argv := strings.Split(string(line)," ");
		cmd := argv[0]
		if cmd == "exit" || cmd == "quit" {
			break
		}
		if cmd == "env" {
			env(argv)
			continue;
		}
		if cmd == "eval" {
			eval(argv,true)
			continue;
		}
		if cmd == "which" {
			which(argv[1]);
			continue;
		}
		fullpath, itis := which(cmd)
		if itis {
			syscall.Exec(fullpath,argv,os.Environ())
		}
	}
}
//---END---
//