aboutsummaryrefslogtreecommitdiff
path: root/nexgb/xgbgen/go.go
diff options
context:
space:
mode:
authoraarzilli <alessandro.arzilli@gmail.com>2014-05-02 15:09:23 +0200
committerPřemysl Janouch <p@janouch.name>2018-09-08 16:49:22 +0200
commita548d9d0f7b889627c43b18811357fad88760b2d (patch)
tree0d4a0ad302d753638dfdb16159e03d1fb87b0872 /nexgb/xgbgen/go.go
parent1f8bd79abee5d96a41a934d1eb8c74e90ccbcc8f (diff)
downloadhaven-a548d9d0f7b889627c43b18811357fad88760b2d.tar.gz
haven-a548d9d0f7b889627c43b18811357fad88760b2d.tar.xz
haven-a548d9d0f7b889627c43b18811357fad88760b2d.zip
Fix Issue #21: automatic calculation of alignment padding after lists
Diffstat (limited to 'nexgb/xgbgen/go.go')
-rw-r--r--nexgb/xgbgen/go.go18
1 files changed, 15 insertions, 3 deletions
diff --git a/nexgb/xgbgen/go.go b/nexgb/xgbgen/go.go
index 6c680e8..ace4e00 100644
--- a/nexgb/xgbgen/go.go
+++ b/nexgb/xgbgen/go.go
@@ -103,15 +103,27 @@ func (td *TypeDef) Define(c *Context) {
// Pad fields
func (f *PadField) Define(c *Context) {
- c.Putln("// padding: %d bytes", f.Bytes)
+ if f.Align > 0 {
+ c.Putln("// alignment gap to multiple of %d", f.Align)
+ } else {
+ c.Putln("// padding: %d bytes", f.Bytes)
+ }
}
func (f *PadField) Read(c *Context, prefix string) {
- c.Putln("b += %s // padding", f.Size())
+ if f.Align > 0 {
+ c.Putln("b = (b + %d) & ^%d // alignment gap", f.Align-1, f.Align-1)
+ } else {
+ c.Putln("b += %s // padding", f.Size())
+ }
}
func (f *PadField) Write(c *Context, prefix string) {
- c.Putln("b += %s // padding", f.Size())
+ if f.Align > 0 {
+ c.Putln("b = (b + %d) & ^%d // alignment gap", f.Align-1, f.Align-1)
+ } else {
+ c.Putln("b += %s // padding", f.Size())
+ }
}
// Local fields