diff options
author | Kyle Gunger <kgunger12@gmail.com> | 2021-12-14 23:11:29 -0500 |
---|---|---|
committer | Kyle Gunger <kgunger12@gmail.com> | 2021-12-14 23:11:29 -0500 |
commit | 7a8a8b975bd4ca636b825a42852c5af95d9b5825 (patch) | |
tree | 00465a3f940c38f8a8a59b60f4b19252f3f7677c /src | |
parent | dc8f1a06f086bda90e90a5386d4619d54efb1d0d (diff) |
[EXEC] Struct mapping
+ added tStruct TType for use in modules
+ implemented a way to define structs in modules
Diffstat (limited to 'src')
-rw-r--r-- | src/texec/libtnsl.go | 1 | ||||
-rw-r--r-- | src/texec/world.go | 1 | ||||
-rw-r--r-- | src/texec/worldbuilder.go | 23 |
3 files changed, 25 insertions, 0 deletions
diff --git a/src/texec/libtnsl.go b/src/texec/libtnsl.go index a5d4589..c0580c7 100644 --- a/src/texec/libtnsl.go +++ b/src/texec/libtnsl.go @@ -54,6 +54,7 @@ var ( // used only in module definintion tEnum = TType{Pre: []string{}, T: TArtifact{Path: []string{}, Name: "enum"}, Post: ""} + tStruct = TType{Pre: []string{}, T: TArtifact{Path: []string{}, Name: "struct"}, Post: ""} ) // tells if the stub supports a function diff --git a/src/texec/world.go b/src/texec/world.go index d0435a0..d88eae2 100644 --- a/src/texec/world.go +++ b/src/texec/world.go @@ -38,6 +38,7 @@ type TVariable struct { } type VarMap map[string]TVariable +type TypeMap map[string]TType // TContext represents a single call context. type TContext struct { diff --git a/src/texec/worldbuilder.go b/src/texec/worldbuilder.go index 5fc5683..141d1aa 100644 --- a/src/texec/worldbuilder.go +++ b/src/texec/worldbuilder.go @@ -74,6 +74,28 @@ func modDefVars(n tparse.Node, t TType) ([]string, []TVariable) { return s, v } +func modDefStruct(n tparse.Node, m *TModule) { + var name string + tmap := make(TypeMap) + + for i := 0; i < len(n.Sub); i++ { + if n.Sub[i].Data.Type == tparse.DEFWORD { + name = n.Sub[i].Data.Data + } else if n.Sub[i].Data.Data == "plist" && n.Sub[i].Data.Type == 10 { + var t TType + for j := 0; j < len(n.Sub[i].Sub); j++ { + if n.Sub[i].Sub[j].Data.Type == 10 && n.Sub[i].Sub[j].Data.Data == "type" { + t = getType(n.Sub[i].Sub[j]) + } else if n.Sub[i].Sub[j].Data.Type == tparse.DEFWORD { + tmap[n.Sub[i].Sub[j].Data.Data] = t + } + } + } + } + + m.Defs[name] = TVariable{tStruct, tmap} +} + func modDefEnum(n tparse.Node, m *TModule) { name := n.Sub[0].Data.Data t := getType(n.Sub[1].Sub[0]) @@ -108,6 +130,7 @@ func importFile(f string, m *TModule) { } else if froot.Sub[n].Data.Data == "enum"{ modDefEnum(froot.Sub[n], m) }else if froot.Sub[n].Data.Data == "struct" || froot.Sub[n].Data.Data == "raw"{ + modDefStruct(froot.Sub[n], m) } else { m.Artifacts = append(m.Artifacts, froot.Sub[n]) } |