|
|
|
@ -70,7 +70,7 @@ func (e flatenc) EncodeRLP(out io.Writer) error { |
|
|
|
|
newhead := eb.lheads[prevnheads] |
|
|
|
|
copy(eb.lheads[prevnheads:], eb.lheads[prevnheads+1:]) |
|
|
|
|
eb.lheads = eb.lheads[:len(eb.lheads)-1] |
|
|
|
|
eb.lhsize -= newhead.tagsize() |
|
|
|
|
eb.lhsize -= headsize(uint64(newhead.size)) |
|
|
|
|
return nil |
|
|
|
|
} |
|
|
|
|
|
|
|
|
@ -155,21 +155,29 @@ type listhead struct { |
|
|
|
|
// encode writes head to the given buffer, which must be at least
|
|
|
|
|
// 9 bytes long. It returns the encoded bytes.
|
|
|
|
|
func (head *listhead) encode(buf []byte) []byte { |
|
|
|
|
if head.size < 56 { |
|
|
|
|
buf[0] = 0xC0 + byte(head.size) |
|
|
|
|
return buf[:1] |
|
|
|
|
} else { |
|
|
|
|
sizesize := putint(buf[1:], uint64(head.size)) |
|
|
|
|
buf[0] = 0xF7 + byte(sizesize) |
|
|
|
|
return buf[:sizesize+1] |
|
|
|
|
return buf[:puthead(buf, 0xC0, 0xF7, uint64(head.size))] |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// headsize returns the size of a list or string header
|
|
|
|
|
// for a value of the given size.
|
|
|
|
|
func headsize(size uint64) int { |
|
|
|
|
if size < 56 { |
|
|
|
|
return 1 |
|
|
|
|
} |
|
|
|
|
return 1 + intsize(size) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func (head *listhead) tagsize() int { |
|
|
|
|
if head.size < 56 { |
|
|
|
|
// puthead writes a list or string header to buf.
|
|
|
|
|
// buf must be at least 9 bytes long.
|
|
|
|
|
func puthead(buf []byte, smalltag, largetag byte, size uint64) int { |
|
|
|
|
if size < 56 { |
|
|
|
|
buf[0] = smalltag + byte(size) |
|
|
|
|
return 1 |
|
|
|
|
} else { |
|
|
|
|
sizesize := putint(buf[1:], size) |
|
|
|
|
buf[0] = largetag + byte(sizesize) |
|
|
|
|
return sizesize + 1 |
|
|
|
|
} |
|
|
|
|
return 1 + intsize(uint64(head.size)) |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
func newencbuf() *encbuf { |
|
|
|
|