summaryrefslogtreecommitdiff
path: root/xgbgen/field.go
diff options
context:
space:
mode:
authorAndrew Gallant (Ocelot) <[email protected]>2012-04-30 16:18:17 -0400
committerAndrew Gallant (Ocelot) <[email protected]>2012-04-30 16:18:17 -0400
commit5d79dc324de0a23fd0543951f0fd1f0352018654 (patch)
treef924ee2fba3def91bec831e4a6577204470d412d /xgbgen/field.go
parentf7be3db65e559e77355537a11a88c8657ec4c059 (diff)
splitting up go specific code. too much for one file IMO. more progress. almost done with structs.
Diffstat (limited to 'xgbgen/field.go')
-rw-r--r--xgbgen/field.go31
1 files changed, 30 insertions, 1 deletions
diff --git a/xgbgen/field.go b/xgbgen/field.go
index ed113e0..0f2323e 100644
--- a/xgbgen/field.go
+++ b/xgbgen/field.go
@@ -1,5 +1,10 @@
package main
+import (
+ "fmt"
+ "log"
+)
+
type Field interface {
Initialize(p *Protocol)
SrcName() string
@@ -8,6 +13,7 @@ type Field interface {
Define(c *Context)
Read(c *Context)
+ Write(c *Context)
}
func (pad *PadField) Initialize(p *Protocol) {}
@@ -66,8 +72,31 @@ func (f *ListField) XmlName() string {
return f.xmlName
}
+// func (f *ListField) Size() Size {
+ // return newExpressionSize(f.LengthExpr).Multiply(f.Type.Size())
+// }
+
func (f *ListField) Size() Size {
- return newExpressionSize(f.LengthExpr).Multiply(f.Type.Size())
+ simpleLen := &Function{
+ Name: "pad",
+ Expr: newBinaryOp("*", f.LengthExpr, f.Type.Size().Expression),
+ }
+
+ switch f.Type.(type) {
+ case *Struct:
+ sizeFun := &Function{
+ Name: fmt.Sprintf("%sListSize", f.Type.SrcName()),
+ Expr: &FieldRef{Name: f.SrcName()},
+ }
+ return newExpressionSize(sizeFun)
+ case *Base:
+ return newExpressionSize(simpleLen)
+ case *Resource:
+ return newExpressionSize(simpleLen)
+ default:
+ log.Fatalf("Cannot compute list size with type '%T'.", f.Type)
+ }
+ panic("unreachable")
}
func (f *ListField) Initialize(p *Protocol) {