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 | |
| parent | dc8f1a06f086bda90e90a5386d4619d54efb1d0d (diff) | |
[EXEC] Struct mapping
+ added tStruct TType for use in modules
+ implemented a way to define structs in modules
| -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])  		} |