avoid disaster regarding setting of env variables from number tokens

This commit is contained in:
Aidan 2020-06-26 21:46:00 -07:00
parent 7c04e3de95
commit 94c9b2beba
No known key found for this signature in database
GPG key ID: 327711E983899316
2 changed files with 23 additions and 3 deletions

View file

@ -19,15 +19,25 @@ package ast
import ( import (
"os" "os"
"fmt"
"math"
"strconv"
"strings" "strings"
"git.callpipe.com/aidan/shs/log" "git.callpipe.com/aidan/shs/log"
) )
// Trigger this if you are using this for a shell
var SyncTablesWithOSEnviron = false
type VarTable *map[string]*Token type VarTable *map[string]*Token
func GetVar(arg string, vt VarTable) *Token { func GetVar(arg string, vt VarTable) *Token {
val, ok := (*vt)[arg] val, ok := (*vt)[arg]
if !ok { if !ok {
if !SyncTablesWithOSEnviron {
return nil
}
e := os.Getenv(arg) e := os.Getenv(arg)
if e != "" { if e != "" {
t := &Token{Inner: e} t := &Token{Inner: e}
@ -45,11 +55,20 @@ func GetVar(arg string, vt VarTable) *Token {
return val return val
} }
// TODO: Document me :) // TODO: this could be much more optimal
func SetVar(variable string, value *Token, vt VarTable) { func SetVar(variable string, value *Token, vt VarTable) {
(*vt)[variable] = value (*vt)[variable] = value
if value.Tag == NUMBER || value.Tag == STRING { if SyncTablesWithOSEnviron &&
os.Setenv(variable, value.Inner.(string)) (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)
} }
} }

View file

@ -57,6 +57,7 @@ func main() {
funcs = stdlib.GenFuncTable() funcs = stdlib.GenFuncTable()
vars = &map[string]*ast.Token{} vars = &map[string]*ast.Token{}
ast.InitVarTable(vars) ast.InitVarTable(vars)
ast.SyncTablesWithOSEnviron = true
useHist := false useHist := false
var histFile *os.File var histFile *os.File