2023-07-21 09:32:51 +00:00
|
|
|
package interp
|
|
|
|
|
|
|
|
import "fmt"
|
|
|
|
|
2023-08-08 15:57:19 +00:00
|
|
|
func proc_proc(p *process_t) error {
|
|
|
|
/*
|
|
|
|
p.push_call_frame()
|
|
|
|
p.set_var("aaa", 10)
|
|
|
|
p.set_var("bbb", 20)
|
|
|
|
p.eval_stmt_nodes()
|
|
|
|
p.pop_call_frame()
|
|
|
|
*/
|
|
|
|
var err error
|
|
|
|
|
|
|
|
if p.GetNumArgs() != 3 {
|
|
|
|
err = err_num_args
|
|
|
|
goto done
|
|
|
|
}
|
|
|
|
|
|
|
|
/*
|
|
|
|
// procedure name
|
|
|
|
v1, err = p.interp.eval_arg(p, 0)
|
|
|
|
if err != nil {
|
|
|
|
goto done
|
|
|
|
}
|
|
|
|
|
|
|
|
p.set_var(p, v1, v2)*/
|
|
|
|
done:
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
func proc_set(p *process_t) error {
|
|
|
|
var (
|
|
|
|
v1, v2 Value_t
|
|
|
|
err error
|
|
|
|
)
|
|
|
|
|
|
|
|
if p.GetNumArgs() != 2 {
|
|
|
|
err = err_num_args
|
|
|
|
goto done
|
|
|
|
}
|
|
|
|
|
|
|
|
v1, err = p.interp.eval_arg(p, 0)
|
|
|
|
if err != nil {
|
|
|
|
goto done
|
|
|
|
}
|
|
|
|
|
|
|
|
v2, err = p.interp.eval_arg(p, 1)
|
|
|
|
if err != nil {
|
|
|
|
goto done
|
|
|
|
}
|
|
|
|
|
|
|
|
err = p.interp.set_var(p, v1, v2)
|
|
|
|
if err != nil {
|
|
|
|
goto done
|
|
|
|
}
|
|
|
|
|
|
|
|
p.Return(v2)
|
|
|
|
|
|
|
|
done:
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
2023-07-21 09:32:51 +00:00
|
|
|
func proc_expr(p *process_t) error {
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func proc_if(p *process_t) error {
|
|
|
|
var (
|
2023-08-04 09:41:30 +00:00
|
|
|
v Value_t
|
2023-07-21 09:32:51 +00:00
|
|
|
err error
|
|
|
|
)
|
|
|
|
|
|
|
|
if p.GetNumArgs() < 2 {
|
|
|
|
err = err_num_args
|
|
|
|
goto done
|
|
|
|
}
|
|
|
|
|
|
|
|
//v, err = p.interp.EvalText([]rune(*p.GetArg(0)))
|
|
|
|
v, err = p.interp.eval_arg(p, 0)
|
|
|
|
if err != nil {
|
|
|
|
goto done
|
|
|
|
}
|
|
|
|
|
2023-08-13 16:08:37 +00:00
|
|
|
if v.Kind != VALUE_STR {
|
2023-08-04 09:41:30 +00:00
|
|
|
panic("internal error - screwed conditional value")
|
|
|
|
}
|
2023-08-13 16:08:37 +00:00
|
|
|
if *(*string)(v.V) != "" {
|
2023-07-21 09:32:51 +00:00
|
|
|
//v, err = p.interp.eval_atom_node((*Cnode_t)(p.GetArg(1)))
|
|
|
|
v, err = p.interp.eval_arg(p, 1)
|
|
|
|
if err != nil {
|
|
|
|
goto done
|
|
|
|
}
|
|
|
|
|
2023-08-04 09:41:30 +00:00
|
|
|
p.Return(v)
|
2023-07-21 09:32:51 +00:00
|
|
|
} else {
|
|
|
|
// TODO: if elseif else
|
|
|
|
}
|
|
|
|
|
|
|
|
done:
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
func proc_puts(p *process_t) error {
|
|
|
|
var (
|
|
|
|
i int
|
|
|
|
nargs int
|
2023-08-04 09:41:30 +00:00
|
|
|
v Value_t
|
2023-07-21 09:32:51 +00:00
|
|
|
err error
|
|
|
|
)
|
|
|
|
|
|
|
|
//fmt.Printf("callee=%s\n", *(p.GetCalleeName()))
|
|
|
|
//fmt.Printf("callee=%s\n", *(p.GetArg(-1)))
|
|
|
|
//fmt.Printf("arg count = %d\n", p.GetNumArgs())
|
|
|
|
|
|
|
|
nargs = p.GetNumArgs()
|
|
|
|
for i = 0; i < nargs; i++ {
|
|
|
|
//fmt.Printf("%s", *p.GetArg(i))
|
|
|
|
v, err = p.interp.eval_arg_literally(p, i)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2023-08-04 09:41:30 +00:00
|
|
|
|
2023-08-13 16:08:37 +00:00
|
|
|
// TODO: check if v.kind is VALUE_STR
|
|
|
|
if v.Kind != VALUE_STR {
|
|
|
|
panic("internal error... invalid evaluation resutl")
|
|
|
|
}
|
|
|
|
fmt.Printf("%s", *(*string)(v.V))
|
2023-07-21 09:32:51 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if nargs >= 1 {
|
2023-08-04 09:41:30 +00:00
|
|
|
p.Return(v)
|
2023-07-21 09:32:51 +00:00
|
|
|
} else {
|
2023-08-07 13:32:42 +00:00
|
|
|
p.ReturnString("hello")
|
2023-07-21 09:32:51 +00:00
|
|
|
}
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2023-08-03 13:34:42 +00:00
|
|
|
func proc_false(p *process_t) error {
|
2023-08-07 13:32:42 +00:00
|
|
|
p.ReturnString("false")
|
2023-08-03 13:34:42 +00:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
func proc_true(p *process_t) error {
|
2023-08-07 13:32:42 +00:00
|
|
|
p.ReturnString("true")
|
2023-08-03 13:34:42 +00:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
|
|
|
func proc_null(p *process_t) error {
|
2023-08-07 13:32:42 +00:00
|
|
|
p.ReturnString("")
|
2023-08-03 13:34:42 +00:00
|
|
|
return nil
|
|
|
|
}
|
|
|
|
|
2023-07-21 09:32:51 +00:00
|
|
|
func proc_unknown(p *process_t) error {
|
|
|
|
fmt.Printf("Unknown command - %s\n", *(p.GetCalleeName()))
|
|
|
|
return nil
|
|
|
|
}
|