From 73154769b3eba60fe48a7c08882e8e64b1545e3f Mon Sep 17 00:00:00 2001 From: "Andrew Gallant (Ocelot)" Date: Mon, 30 Apr 2012 16:18:17 -0400 Subject: splitting up go specific code. too much for one file IMO. more progress. almost done with structs. --- nexgb/xgbgen/field.go | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) (limited to 'nexgb/xgbgen/field.go') diff --git a/nexgb/xgbgen/field.go b/nexgb/xgbgen/field.go index ed113e0..0f2323e 100644 --- a/nexgb/xgbgen/field.go +++ b/nexgb/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) { -- cgit v1.2.3