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/go_list.go | 75 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 nexgb/xgbgen/go_list.go (limited to 'nexgb/xgbgen/go_list.go') 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) + } +} + -- cgit v1.2.3