diff options
author | Andrew Gallant (Ocelot) <Andrew.Gallant@tufts.edu> | 2012-04-30 16:18:17 -0400 |
---|---|---|
committer | Andrew Gallant (Ocelot) <Andrew.Gallant@tufts.edu> | 2012-04-30 16:18:17 -0400 |
commit | 73154769b3eba60fe48a7c08882e8e64b1545e3f (patch) | |
tree | 3fe7c2a1f9ae1d22931b4673901d8ea340192d57 /nexgb/xgbgen/go_list.go | |
parent | 2a2d8653b3a7918dfb00dcca8937b0e878279c70 (diff) | |
download | haven-73154769b3eba60fe48a7c08882e8e64b1545e3f.tar.gz haven-73154769b3eba60fe48a7c08882e8e64b1545e3f.tar.xz haven-73154769b3eba60fe48a7c08882e8e64b1545e3f.zip |
splitting up go specific code. too much for one file IMO. more progress. almost done with structs.
Diffstat (limited to 'nexgb/xgbgen/go_list.go')
-rw-r--r-- | nexgb/xgbgen/go_list.go | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/nexgb/xgbgen/go_list.go b/nexgb/xgbgen/go_list.go new file mode 100644 index 0000000..03da22e --- /dev/null +++ b/nexgb/xgbgen/go_list.go @@ -0,0 +1,75 @@ +package main + +import ( + "fmt" + "log" +) + +// List fields +func (f *ListField) Define(c *Context) { + c.Putln("%s []%s // size: %s", + f.SrcName(), f.Type.SrcName(), f.Size()) +} + +func (f *ListField) Read(c *Context) { + c.Putln("") + + switch t := f.Type.(type) { + case *Resource: + length := f.LengthExpr.Reduce("v.", "") + c.Putln("v.%s = make([]Id, %s)", f.SrcName(), length) + c.Putln("for i := 0; i < %s; i++ {", length) + ReadSimpleSingleField(c, fmt.Sprintf("v.%s[i]", f.SrcName()), t) + c.Putln("}") + c.Putln("b = pad(b)") + case *Base: + length := f.LengthExpr.Reduce("v.", "") + c.Putln("v.%s = make([]%s, %s)", f.SrcName(), t.SrcName(), length) + if t.SrcName() == "byte" { + c.Putln("copy(v.%s[:%s], buf[b:])", f.SrcName(), length) + c.Putln("b += pad(%s)", length) + } else { + c.Putln("for i := 0; i < %s; i++ {", length) + ReadSimpleSingleField(c, fmt.Sprintf("v.%s[i]", f.SrcName()), t) + c.Putln("}") + c.Putln("b = pad(b)") + } + case *Struct: + c.Putln("v.%s = make([]%s, %s)", + f.SrcName(), t.SrcName(), f.LengthExpr.Reduce("v.", "")) + c.Putln("b += Read%sList(buf[b:], v.%s)", t.SrcName(), f.SrcName()) + default: + log.Fatalf("Cannot read list field '%s' with %T type.", + f.XmlName(), f.Type) + } +} + +func (f *ListField) Write(c *Context) { + c.Putln("") + + switch t := f.Type.(type) { + case *Resource: + length := f.LengthExpr.Reduce("v.", "") + c.Putln("for i := 0; i < %s; i++", length) + WriteSimpleSingleField(c, fmt.Sprintf("v.%s[i]", f.SrcName()), t) + c.Putln("}") + c.Putln("b = pad(b)") + case *Base: + length := f.LengthExpr.Reduce("v.", "") + if t.SrcName() == "byte" { + c.Putln("copy(buf[b:], v.%s[:%s])", f.SrcName(), length) + c.Putln("b += pad(%s)", length) + } else { + c.Putln("for i := 0; i < %s; i++ {", length) + WriteSimpleSingleField(c, fmt.Sprintf("v.%s[i]", f.SrcName()), t) + c.Putln("}") + c.Putln("b = pad(b)") + } + case *Struct: + c.Putln("b += %sListBytes(buf[b:], v.%s)", t.SrcName(), f.SrcName()) + default: + log.Fatalf("Cannot read list field '%s' with %T type.", + f.XmlName(), f.Type) + } +} + |