function calls no longer return number tokens (cleaner output), added ? command to get return code

This commit is contained in:
Aidan 2020-06-28 14:20:17 -07:00
parent ffef8a96e7
commit f1cc9b7f8c
No known key found for this signature in database
GPG key ID: 327711E983899316
2 changed files with 22 additions and 8 deletions

View file

@ -29,6 +29,7 @@ import (
) )
var bgProcs = make([]*exec.Cmd, 0) var bgProcs = make([]*exec.Cmd, 0)
var LastExitCode int
func call(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token { func call(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
if in == nil { if in == nil {
@ -60,7 +61,6 @@ func call(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
cmd.Stdout = os.Stdout cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr cmd.Stderr = os.Stderr
cmd.Stdin = os.Stdin cmd.Stdin = os.Stdin
exit := 0
signalChan := make(chan os.Signal, 2) signalChan := make(chan os.Signal, 2)
signal.Notify(signalChan, os.Interrupt, syscall.SIGTERM) signal.Notify(signalChan, os.Interrupt, syscall.SIGTERM)
@ -74,13 +74,13 @@ func call(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
signal.Reset(os.Interrupt, syscall.SIGTERM) signal.Reset(os.Interrupt, syscall.SIGTERM)
if err != nil { if err != nil {
if exitError, ok := err.(*exec.ExitError); ok { if exitError, ok := err.(*exec.ExitError); ok {
exit = exitError.ExitCode() LastExitCode = exitError.ExitCode()
} else { } else {
log.Log(log.ERR, "Execution step returned unparsable error: " + err.Error(), "call") log.Log(log.ERR, "Execution step returned unparsable error: " + err.Error(), "call")
} }
} }
return &ast.Token{Tag: ast.NUMBER, Inner: fmt.Sprintf("%d", exit)} return nil
} }
func bgcall(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token { func bgcall(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
@ -127,7 +127,6 @@ func fg(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
cmd.Stdout = os.Stdout cmd.Stdout = os.Stdout
cmd.Stdin = os.Stdin cmd.Stdin = os.Stdin
exit := 0
signalChan := make(chan os.Signal, 2) signalChan := make(chan os.Signal, 2)
signal.Notify(signalChan, os.Interrupt, syscall.SIGTERM) signal.Notify(signalChan, os.Interrupt, syscall.SIGTERM)
@ -141,13 +140,13 @@ func fg(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
signal.Reset(os.Interrupt, syscall.SIGTERM) signal.Reset(os.Interrupt, syscall.SIGTERM)
if err != nil { if err != nil {
if exitError, ok := err.(*exec.ExitError); ok { if exitError, ok := err.(*exec.ExitError); ok {
exit = exitError.ExitCode() LastExitCode = exitError.ExitCode()
} else { } else {
log.Log(log.ERR, "Execution step returned unparsable error: " + err.Error(), "call") log.Log(log.ERR, "Execution step returned error: " + err.Error(), "call")
} }
} }
return &ast.Token{Tag: ast.NUMBER, Inner: fmt.Sprintf("%d", exit)} return nil
} }
func read_cmd(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token { func read_cmd(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
@ -193,9 +192,17 @@ func read_cmd(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
close(signalChan) close(signalChan)
signal.Reset(os.Interrupt, syscall.SIGTERM) signal.Reset(os.Interrupt, syscall.SIGTERM)
if err != nil { if err != nil {
log.Log(log.ERR, err.Error(), "$") if exitError, ok := err.(*exec.ExitError); ok {
LastExitCode = exitError.ExitCode()
} else {
log.Log(log.ERR, "Execution step returned error: " + err.Error(), "$")
}
} }
return &ast.Token{Tag: ast.STRING, Inner: out.String()} return &ast.Token{Tag: ast.STRING, Inner: out.String()}
} }
func get_exit(in *ast.Token, vt ast.VarTable, ft ast.FuncTable) *ast.Token {
return &ast.Token{Tag: ast.NUMBER, Inner: fmt.Sprintf("%d", LastExitCode)}
}

View file

@ -122,6 +122,13 @@ func GenFuncTable() ast.FuncTable {
TimesCalled: 0, TimesCalled: 0,
Args: 0, Args: 0,
}, },
"?": &ast.Function{
Function: get_exit,
Name:"get exit code",
TimesCalled: 0,
Args: 0,
},
} }
return stdlib return stdlib