From 75217517329416a502349a4f45a4bd677192cf03 Mon Sep 17 00:00:00 2001 From: Jordan Orelli Date: Tue, 4 Oct 2016 11:34:22 -0400 Subject: [PATCH] =?UTF-8?q?=C2=AF\=5F(=E3=83=84)=5F/=C2=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bit/decode.go | 26 +++++++++--------------- bit/misc.go | 9 +++++++++ ent/array.go | 52 ++++++++++++++++++++++++++++++++++++++++++++++++ ent/atoms.go | 24 ++++++++++++++++++++++ ent/env.go | 16 +++++++-------- ent/generic.go | 12 +++++++---- ent/huff_test.go | 2 +- 7 files changed, 111 insertions(+), 30 deletions(-) create mode 100644 bit/misc.go diff --git a/bit/decode.go b/bit/decode.go index 4478c2c..5f4c883 100644 --- a/bit/decode.go +++ b/bit/decode.go @@ -62,41 +62,33 @@ func ReadUBitVarFP(r Reader) uint64 { // continuation bit. func ReadVarInt(r Reader) uint64 { var x uint64 - var s uint - for i := 0; ; i++ { + for s := uint64(0); s < 70; s += 7 { b := r.ReadBits(8) if r.Err() != nil { return 0 } + x |= b & 0x7f << s if b < 0x80 { - if i > 9 || i == 9 && b > 1 { - panic("varint overflow") - } - return x | b< 4 || i == 4 && b > 0xf { - panic("varint32 overflow") - } - return x | uint32(b)<= len(s.valid) { + s.valid = s.buf[:slot+1] + } +} +func (s *string_v) getSlotValue(slot int) value { + v := char_v(s.buf[slot]) + return &v +} diff --git a/ent/atoms.go b/ent/atoms.go index bac38be..935a985 100644 --- a/ent/atoms.go +++ b/ent/atoms.go @@ -317,8 +317,32 @@ func (v *cutl_string_v) read(r bit.Reader) error { return r.Err() } +// ------------------------------------------------------------------------------ +// char +// +// this seems absolutely wrong, but it's how it's done in clarity. a char is a +// cstring? wtf? +// ------------------------------------------------------------------------------ + +var char_t = typeLiteral{ + name: "char", + newFn: func() value { + return new(char_v) + }, +} + +type char_v byte + +func (v char_v) tÿpe() tÿpe { return char_t } +func (v char_v) String() string { return string(v) } +func (v *char_v) read(r bit.Reader) error { + *v = char_v(r.ReadByte()) + return r.Err() +} + var atom_types = []tÿpe{ bool_t, + char_t, uint8_t, uint16_t, uint32_t, diff --git a/ent/env.go b/ent/env.go index 37ea8bd..ec8ebcc 100644 --- a/ent/env.go +++ b/ent/env.go @@ -2,7 +2,6 @@ package ent import ( "github.com/golang/protobuf/proto" - "os" "strconv" "github.com/jordanorelli/hyperstone/bit" @@ -11,12 +10,13 @@ import ( ) type Env struct { - symbols symbolTable - source bit.BufReader - classes map[string]*classHistory - netIds map[int]string - fields []field - strings *stbl.Dict + symbols symbolTable + source bit.BufReader + classes map[string]*classHistory + netIds map[int]string + fields []field + strings *stbl.Dict + entities map[int]*entity } func NewEnv() *Env { @@ -183,7 +183,7 @@ func (e *Env) syncBaselineTable(t *stbl.Table) { for _, s := range selections { if err := s.fillSlots(ent, r); err != nil { Debug.Printf("syncBaseline fill error: %v", err) - os.Exit(1) + break } } } diff --git a/ent/generic.go b/ent/generic.go index c7edfe8..c98528d 100644 --- a/ent/generic.go +++ b/ent/generic.go @@ -88,9 +88,7 @@ type cutl_vector struct { func (v *cutl_vector) tÿpe() tÿpe { return v.t } func (v *cutl_vector) read(r bit.Reader) error { - count := bit.ReadVarInt32(r) - Debug.Printf("allocating cutl_vector of size %d with element type %s", count, v.t.elem.typeName()) - v.slots = make([]value, count) + bit.ReadVarInt32(r) // ?? return r.Err() } @@ -110,4 +108,10 @@ func (v *cutl_vector) setSlotValue(slot int, val value) { v.slots[slot] = val } } -func (v *cutl_vector) getSlotValue(slot int) value { return v.slots[slot] } + +func (v *cutl_vector) getSlotValue(slot int) value { + if slot >= len(v.slots) { + return nil + } + return v.slots[slot] +} diff --git a/ent/huff_test.go b/ent/huff_test.go index e40ce5d..d85af9f 100644 --- a/ent/huff_test.go +++ b/ent/huff_test.go @@ -66,5 +66,5 @@ func TestTree(t *testing.T) { } } - testWalk(htree, "") + testWalk(huffRoot, "") }