Fix Issue #21: automatic calculation of alignment padding after lists
This commit is contained in:
		@@ -133,7 +133,7 @@ func (v ClientInfo) Bytes() []byte {
 | 
			
		||||
 | 
			
		||||
	b += RangeListBytes(buf[b:], v.Ranges)
 | 
			
		||||
 | 
			
		||||
	return buf
 | 
			
		||||
	return buf[:b]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ClientInfoListBytes writes a list of ClientInfo values to a byte slice.
 | 
			
		||||
@@ -222,7 +222,7 @@ func (v ExtRange) Bytes() []byte {
 | 
			
		||||
		b += len(structBytes)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return buf
 | 
			
		||||
	return buf[:b]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// ExtRangeListBytes writes a list of ExtRange values to a byte slice.
 | 
			
		||||
@@ -368,7 +368,7 @@ func (v Range) Bytes() []byte {
 | 
			
		||||
	}
 | 
			
		||||
	b += 1
 | 
			
		||||
 | 
			
		||||
	return buf
 | 
			
		||||
	return buf[:b]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RangeListBytes writes a list of Range values to a byte slice.
 | 
			
		||||
@@ -422,7 +422,7 @@ func (v Range16) Bytes() []byte {
 | 
			
		||||
	xgb.Put16(buf[b:], v.Last)
 | 
			
		||||
	b += 2
 | 
			
		||||
 | 
			
		||||
	return buf
 | 
			
		||||
	return buf[:b]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Range16ListBytes writes a list of Range16 values to a byte slice.
 | 
			
		||||
@@ -476,7 +476,7 @@ func (v Range8) Bytes() []byte {
 | 
			
		||||
	buf[b] = v.Last
 | 
			
		||||
	b += 1
 | 
			
		||||
 | 
			
		||||
	return buf
 | 
			
		||||
	return buf[:b]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Range8ListBytes writes a list of Range8 values to a byte slice.
 | 
			
		||||
@@ -551,7 +551,7 @@ func (cook CreateContextCookie) Check() error {
 | 
			
		||||
// Write request to wire for CreateContext
 | 
			
		||||
// createContextRequest writes a CreateContext request to a byte slice.
 | 
			
		||||
func createContextRequest(c *xgb.Conn, Context Context, ElementHeader ElementHeader, NumClientSpecs uint32, NumRanges uint32, ClientSpecs []ClientSpec, Ranges []Range) []byte {
 | 
			
		||||
	size := xgb.Pad(((20 + xgb.Pad((int(NumClientSpecs) * 4))) + xgb.Pad((int(NumRanges) * 24))))
 | 
			
		||||
	size := xgb.Pad((((20 + xgb.Pad((int(NumClientSpecs) * 4))) + 4) + xgb.Pad((int(NumRanges) * 24))))
 | 
			
		||||
	b := 0
 | 
			
		||||
	buf := make([]byte, size)
 | 
			
		||||
 | 
			
		||||
@@ -561,7 +561,7 @@ func createContextRequest(c *xgb.Conn, Context Context, ElementHeader ElementHea
 | 
			
		||||
	buf[b] = 1 // request opcode
 | 
			
		||||
	b += 1
 | 
			
		||||
 | 
			
		||||
	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
 | 
			
		||||
	blen := b
 | 
			
		||||
	b += 2
 | 
			
		||||
 | 
			
		||||
	xgb.Put32(buf[b:], uint32(Context))
 | 
			
		||||
@@ -582,11 +582,14 @@ func createContextRequest(c *xgb.Conn, Context Context, ElementHeader ElementHea
 | 
			
		||||
		xgb.Put32(buf[b:], uint32(ClientSpecs[i]))
 | 
			
		||||
		b += 4
 | 
			
		||||
	}
 | 
			
		||||
	b = xgb.Pad(b)
 | 
			
		||||
 | 
			
		||||
	b = (b + 3) & ^3 // alignment gap
 | 
			
		||||
 | 
			
		||||
	b += RangeListBytes(buf[b:], Ranges)
 | 
			
		||||
 | 
			
		||||
	return buf
 | 
			
		||||
	b = xgb.Pad(b)
 | 
			
		||||
	xgb.Put16(buf[blen:], uint16(b/4)) // write request size in 4-byte units
 | 
			
		||||
	return buf[:b]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// DisableContextCookie is a cookie used only for DisableContext requests.
 | 
			
		||||
@@ -737,7 +740,7 @@ func enableContextReply(buf []byte) *EnableContextReply {
 | 
			
		||||
 | 
			
		||||
	v.Data = make([]byte, (int(v.Length) * 4))
 | 
			
		||||
	copy(v.Data[:(int(v.Length)*4)], buf[b:])
 | 
			
		||||
	b += xgb.Pad(int((int(v.Length) * 4)))
 | 
			
		||||
	b += int((int(v.Length) * 4))
 | 
			
		||||
 | 
			
		||||
	return v
 | 
			
		||||
}
 | 
			
		||||
@@ -1057,7 +1060,7 @@ func (cook RegisterClientsCookie) Check() error {
 | 
			
		||||
// Write request to wire for RegisterClients
 | 
			
		||||
// registerClientsRequest writes a RegisterClients request to a byte slice.
 | 
			
		||||
func registerClientsRequest(c *xgb.Conn, Context Context, ElementHeader ElementHeader, NumClientSpecs uint32, NumRanges uint32, ClientSpecs []ClientSpec, Ranges []Range) []byte {
 | 
			
		||||
	size := xgb.Pad(((20 + xgb.Pad((int(NumClientSpecs) * 4))) + xgb.Pad((int(NumRanges) * 24))))
 | 
			
		||||
	size := xgb.Pad((((20 + xgb.Pad((int(NumClientSpecs) * 4))) + 4) + xgb.Pad((int(NumRanges) * 24))))
 | 
			
		||||
	b := 0
 | 
			
		||||
	buf := make([]byte, size)
 | 
			
		||||
 | 
			
		||||
@@ -1067,7 +1070,7 @@ func registerClientsRequest(c *xgb.Conn, Context Context, ElementHeader ElementH
 | 
			
		||||
	buf[b] = 2 // request opcode
 | 
			
		||||
	b += 1
 | 
			
		||||
 | 
			
		||||
	xgb.Put16(buf[b:], uint16(size/4)) // write request size in 4-byte units
 | 
			
		||||
	blen := b
 | 
			
		||||
	b += 2
 | 
			
		||||
 | 
			
		||||
	xgb.Put32(buf[b:], uint32(Context))
 | 
			
		||||
@@ -1088,11 +1091,14 @@ func registerClientsRequest(c *xgb.Conn, Context Context, ElementHeader ElementH
 | 
			
		||||
		xgb.Put32(buf[b:], uint32(ClientSpecs[i]))
 | 
			
		||||
		b += 4
 | 
			
		||||
	}
 | 
			
		||||
	b = xgb.Pad(b)
 | 
			
		||||
 | 
			
		||||
	b = (b + 3) & ^3 // alignment gap
 | 
			
		||||
 | 
			
		||||
	b += RangeListBytes(buf[b:], Ranges)
 | 
			
		||||
 | 
			
		||||
	return buf
 | 
			
		||||
	b = xgb.Pad(b)
 | 
			
		||||
	xgb.Put16(buf[blen:], uint16(b/4)) // write request size in 4-byte units
 | 
			
		||||
	return buf[:b]
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UnregisterClientsCookie is a cookie used only for UnregisterClients requests.
 | 
			
		||||
@@ -1154,7 +1160,6 @@ func unregisterClientsRequest(c *xgb.Conn, Context Context, NumClientSpecs uint3
 | 
			
		||||
		xgb.Put32(buf[b:], uint32(ClientSpecs[i]))
 | 
			
		||||
		b += 4
 | 
			
		||||
	}
 | 
			
		||||
	b = xgb.Pad(b)
 | 
			
		||||
 | 
			
		||||
	return buf
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user