summaryrefslogtreecommitdiff
path: root/serialize.fmt
diff options
context:
space:
mode:
Diffstat (limited to 'serialize.fmt')
-rw-r--r--serialize.fmt163
1 files changed, 163 insertions, 0 deletions
diff --git a/serialize.fmt b/serialize.fmt
new file mode 100644
index 0000000..c157001
--- /dev/null
+++ b/serialize.fmt
@@ -0,0 +1,163 @@
+ func write8(w io.Writer, x uint8) {
+ _, err := w.Write([]byte{x})
+ chk(err)
+ }
+
+ func write16(w io.Writer, x uint16) {
+ buf := make([]byte, 2)
+ be.PutUint16(buf, x)
+ _, err := w.Write(buf)
+ chk(err)
+ }
+
+ func write32(w io.Writer, x uint32) {
+ buf := make([]byte, 4)
+ be.PutUint32(buf, x)
+ _, err := w.Write(buf)
+ chk(err)
+ }
+
+ func write64(w io.Writer, x uint64) {
+ buf := make([]byte, 8)
+ be.PutUint64(buf, x)
+ _, err := w.Write(buf)
+ chk(err)
+ }
+
+byte write8(w, uint8(x))
+uint8 write8(w, uint8(x))
+uint16 write16(w, uint16(x))
+uint32 write32(w, uint32(x))
+uint64 write64(w, uint64(x))
+
+int8 write8(w, uint8(x))
+int16 write16(w, uint16(x))
+int32 write32(w, uint32(x))
+int64 write64(w, uint64(x))
+
+bool if x { write8(w, 1) } else { write8(w, 0) }
+
+float32 write32(w, math.Float32bits(x))
+float64 write64(w, math.Float64bits(x))
+
+AOMsg writeAOMsg(w, x)
+
+image/color.NRGBA w.Write([]byte{x.A, x.R, x.G, x.B})
+
+map[uint16]*NodeMeta {
+ w := zlib.NewWriter(w)
+
+ if x == nil {
+ write8(w, 0)
+ } else {
+ write8(w, 2)
+ if len(x) > math.MaxUint16 {
+ chk(ErrTooLong)
+ }
+ write16(w, uint16(len(x)))
+ keys := make([]uint16, 0, len(x))
+ for key := range x {
+ keys = append(keys, key)
+ }
+ sort.Slice(keys, func(i, j int) bool {
+ i2pos := func(i int) [3]int16 {
+ return Blkpos2Pos([3]int16{}, keys[i])
+ }
+
+ p, q := i2pos(i), i2pos(j)
+
+ for i := range p {
+ switch {
+ case p[i] < q[i]:
+ return true
+ case p[i] > q[i]:
+ return false
+ }
+ }
+
+ return false
+ })
+ for _, key := range keys {
+ write16(w, key)
+ chk(serialize(w, x[key]))
+ }
+ }
+
+ chk(w.Close())
+ }
+
+map[[3]int16]*NodeMeta {
+ w := zlib.NewWriter(w)
+
+ if x == nil {
+ write8(w, 0)
+ } else {
+ write8(w, 2)
+ if len(x) > math.MaxUint16 {
+ chk(ErrTooLong)
+ }
+ write16(w, uint16(len(x)))
+ keys := make([][3]int16, 0, len(x))
+ for key := range x {
+ keys = append(keys, key)
+ }
+ sort.Slice(keys, func(i, j int) bool {
+ p, q := keys[i], keys[j]
+
+ for i := range p {
+ switch {
+ case p[i] < q[i]:
+ return true
+ case p[i] > q[i]:
+ return false
+ }
+ }
+
+ return false
+ })
+ for _, key := range keys {
+ for _, n := range key {
+ write16(w, uint16(n))
+ }
+ chk(serialize(w, x[key]))
+ }
+ }
+
+ chk(w.Close())
+ }
+
+PointedThing chk(writePointedThing(w, x))
+
+[]AOMsg { // For AOInitData.Msgs
+ if len(x) > math.MaxUint8 {
+ chk(ErrTooLong)
+ }
+ write8(w, uint8(len(x)))
+ for _, msg := range x {
+ var b bytes.Buffer
+ chk(writeAOMsg(&b, msg))
+ if b.Len() > math.MaxUint32 {
+ chk(ErrTooLong)
+ }
+ write32(w, uint32(b.Len()))
+ _, err := b.WriteTo(w)
+ chk(err)
+ }
+ }
+
+[]NodeDef { // For ToCltNodeDefs.Defs
+ if len(x) > math.MaxUint16 {
+ chk(ErrTooLong)
+ }
+ write16(w, uint16(len(x)))
+ var b bytes.Buffer
+ for i := range x {
+ x[i].serialize(&b)
+ }
+ if b.Len() > math.MaxUint32 {
+ chk(ErrTooLong)
+ }
+ write32(w, uint32(b.Len()))
+ _, err := b.WriteTo(w)
+ chk(err)
+ }