From 1ff499697aade88607f22fc6d97b529054af3f85 Mon Sep 17 00:00:00 2001 From: David Renshaw Date: Sat, 10 May 2014 08:34:22 -0400 Subject: [PATCH] some methods for StructReader --- src/capnp/PointerReader.java | 18 ++++++++++++++- src/capnp/StructReader.java | 45 ++++++++++++++++++++++++++++++++---- 2 files changed, 57 insertions(+), 6 deletions(-) diff --git a/src/capnp/PointerReader.java b/src/capnp/PointerReader.java index 36f751e..dcbb110 100644 --- a/src/capnp/PointerReader.java +++ b/src/capnp/PointerReader.java @@ -2,6 +2,22 @@ package capnp; public class PointerReader { public SegmentReader segment; - public long pointer; + public int pointer; // word offset public int nestingLimit; + + public PointerReader() { + this.segment = null; + this.pointer = 0; // XXX + this.nestingLimit = 0x7fffffff; + } + + public PointerReader(SegmentReader segment, int pointer, int nestingLimit) { + this.segment = segment; + this.pointer = pointer; + this.nestingLimit = nestingLimit; + } + + public void getText() { + throw new Error(); + } } diff --git a/src/capnp/StructReader.java b/src/capnp/StructReader.java index c62be38..ea2488b 100644 --- a/src/capnp/StructReader.java +++ b/src/capnp/StructReader.java @@ -2,16 +2,51 @@ package capnp; public class StructReader { public SegmentReader segment; - public long data; //byte offset to data section + public int data; //byte offset to data section - // public WirePointer pointers; + public int pointers; // word offset of pointer section public int dataSize; // in bits public short pointerCount; - public short bit0Offset; + public byte bit0Offset; public int nestingLimit; - public T getDataField() { - throw new Error(); + public boolean getBoolField(int offset) { + // XXX should use unsigned operations + if (offset < this.dataSize) { + if (offset == 0) { + offset = this.bit0Offset; + } + byte b = this.segment.ptr.get(offset / 8); + return (b & (1 << (offset % 8))) != 0; + } else { + return false; + } + } + + public byte getByteField(int offset) { + if ((offset + 1) * 8 <= this.dataSize) { + return this.segment.ptr.get(this.data + offset); + } else { + return 0; + } + } + + public int getIntField(int offset) { + if ((offset + 1) * 32 <= this.dataSize) { + return this.segment.ptr.getInt((this.data / 4) + offset); + } else { + return 0; + } + } + + public PointerReader getPointerField(int ptrIndex) { + if (ptrIndex < this.pointerCount) { + return new PointerReader(this.segment, + this.pointers + ptrIndex, + this.nestingLimit); + } else { + return new PointerReader(); + } } }