From 94c9b2beba5dc6790fcbd0ac149700c5a3add3ca Mon Sep 17 00:00:00 2001 From: Aidan Date: Fri, 26 Jun 2020 21:46:00 -0700 Subject: [PATCH] avoid disaster regarding setting of env variables from number tokens --- ast/var_table.go | 25 ++++++++++++++++++++++--- cmd/repl.go | 1 + 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/ast/var_table.go b/ast/var_table.go index f5ea9a3..d2c5d10 100644 --- a/ast/var_table.go +++ b/ast/var_table.go @@ -19,15 +19,25 @@ package ast import ( "os" + "fmt" + "math" + "strconv" "strings" "git.callpipe.com/aidan/shs/log" ) +// Trigger this if you are using this for a shell +var SyncTablesWithOSEnviron = false + type VarTable *map[string]*Token func GetVar(arg string, vt VarTable) *Token { val, ok := (*vt)[arg] if !ok { + if !SyncTablesWithOSEnviron { + return nil + } + e := os.Getenv(arg) if e != "" { t := &Token{Inner: e} @@ -45,11 +55,20 @@ func GetVar(arg string, vt VarTable) *Token { return val } -// TODO: Document me :) +// TODO: this could be much more optimal func SetVar(variable string, value *Token, vt VarTable) { (*vt)[variable] = value - if value.Tag == NUMBER || value.Tag == STRING { - os.Setenv(variable, value.Inner.(string)) + if SyncTablesWithOSEnviron && + (value.Tag == NUMBER || value.Tag == STRING) { + token := value.Inner.(string) + if value.Tag == NUMBER { + // make sure its an int + a, err := strconv.ParseFloat(token, 64) + if err == nil && math.Mod(a, 1.0) == 0 { + token = fmt.Sprintf("%d", int(a)) + } + } + os.Setenv(variable, token) } } diff --git a/cmd/repl.go b/cmd/repl.go index 2840267..eb6f142 100644 --- a/cmd/repl.go +++ b/cmd/repl.go @@ -57,6 +57,7 @@ func main() { funcs = stdlib.GenFuncTable() vars = &map[string]*ast.Token{} ast.InitVarTable(vars) + ast.SyncTablesWithOSEnviron = true useHist := false var histFile *os.File