diff --git a/src/bdf/types/BdfArray.java b/src/bdf/types/BdfArray.java index eb857d9..aa9b645 100644 --- a/src/bdf/types/BdfArray.java +++ b/src/bdf/types/BdfArray.java @@ -28,16 +28,16 @@ public class BdfArray implements IBdfType, Iterable while(i < data.size()) { // Get the size of the object - int size = DataHelpers.getByteBuffer(data.getPointer(i, Integer.BYTES)).getInt(); + int size = BdfObject.getSize(data.getPointer(i)); // Get the object - BdfObject object = new BdfObject(lookupTable, data.getPointer((i+Integer.BYTES), size)); + BdfObject object = new BdfObject(lookupTable, data.getPointer(i, size)); // Add the object to the elements list elements.add(object); // Increase the iterator by the amount of bytes - i += Integer.BYTES+size; + i += size; } } @@ -48,7 +48,6 @@ public class BdfArray implements IBdfType, Iterable for(BdfObject o : elements) { size += o.serializeSeeker(locations); - size += 4; } return size; @@ -59,13 +58,8 @@ public class BdfArray implements IBdfType, Iterable { int pos = 0; - for(BdfObject o : elements) - { - int size = o.serialize(database.getPointer(pos + 4), locations); - database.setBytes(pos, DataHelpers.serializeInt(size)); - - pos += size; - pos += 4; + for(BdfObject o : elements) { + pos += o.serialize(database.getPointer(pos), locations); } return pos; diff --git a/src/bdf/types/BdfNamedList.java b/src/bdf/types/BdfNamedList.java index 3189023..ab9274e 100644 --- a/src/bdf/types/BdfNamedList.java +++ b/src/bdf/types/BdfNamedList.java @@ -38,8 +38,7 @@ public class BdfNamedList implements IBdfType i += 4; // Get the object - int object_size = DataHelpers.getByteBuffer(data.getPointer(i, 4)).getInt(); - i += 4; + int object_size = BdfObject.getSize(data.getPointer(i)); BdfObject object = new BdfObject(lookupTable, data.getPointer(i, object_size)); // Create a new element and save some data to it @@ -64,14 +63,9 @@ public class BdfNamedList implements IBdfType { database.setBytes(pos, DataHelpers.serializeInt(locations[o.key])); - pos += 4; - int size = o.object.serialize(database.getPointer(pos + 4), locations); - database.setBytes(pos, DataHelpers.serializeInt(size)); - - pos += 4; - pos += size; + pos += size + 4; } return pos; @@ -84,7 +78,7 @@ public class BdfNamedList implements IBdfType for(Element o : elements) { - size += 8; + size += 4; size += o.object.serializeSeeker(locations); } @@ -128,19 +122,16 @@ public class BdfNamedList implements IBdfType stream.write('}'); } - public BdfObject get(String key) + public BdfObject get(int key) { // Get the object to send back BdfObject object = null; - // Convert the key to bytes - byte[] key_bytes = key.getBytes(); - // Loop over the elements for(Element e : elements) { // Is this the element key - if(DataHelpers.bytesAreEqual(lookupTable.getName(e.key), key_bytes)) + if(e.key == key) { // Set the object object = e.object; @@ -160,11 +151,8 @@ public class BdfNamedList implements IBdfType return o; } - public BdfObject remove(String key) + public BdfObject remove(int key) { - // Convert the key to bytes - byte[] key_bytes = key.getBytes(); - // Loop over the elements for(int i=0;i> 4); + } // Set the object variable if there is an object specified if(type == BdfTypes.STRING) object = database.getString(); @@ -39,6 +46,49 @@ public class BdfObject implements IBdfType } } + private boolean shouldStoreSize(byte b) { + return b > 7; + } + + static int getSize(IBdfDatabase db) + { + byte type = db.getByte(0); + int size = getSize(type); + + if(size != -1) { + return size; + } + + return DataHelpers.getByteBuffer(db.getPointer(1, 4)).getInt() + 5; + } + + static int getSize(byte type) + { + type &= 0x0f; + + switch(type) + { + case BdfTypes.BOOLEAN: + return 2; + case BdfTypes.BYTE: + return 2; + case BdfTypes.DOUBLE: + return 9; + case BdfTypes.FLOAT: + return 5; + case BdfTypes.INTEGER: + return 5; + case BdfTypes.LONG: + return 9; + case BdfTypes.SHORT: + return 3; + case BdfTypes.UNDEFINED: + return 1; + default: + return -1; + } + } + @Override public void getLocationUses(int[] locations) { @@ -52,33 +102,38 @@ public class BdfObject implements IBdfType { int size; - IBdfDatabase db = database.getPointer(1); + boolean storeSize = shouldStoreSize(type); // Objects switch(type) { case BdfTypes.ARRAY: - size = ((BdfArray)object).serialize(db, locations) + 1; + size = ((BdfArray)object).serialize(database.getPointer(5), locations) + 5; break; case BdfTypes.NAMED_LIST: - size = ((BdfNamedList)object).serialize(db, locations) + 1; + size = ((BdfNamedList)object).serialize(database.getPointer(5), locations) + 5; break; case BdfTypes.STRING: byte[] str = ((String)object).getBytes(); - size = str.length + 1; - db.setBytes(0, str); + size = str.length + 5; + database.setBytes(5, str); break; default: - size = this.database.size() + 1; - db.setBytes(0, this.database.getBytes()); + int o = storeSize ? 5 : 1; + size = this.database.size() + o; + database.setBytes(o, this.database.getBytes()); break; } database.setByte(0, type); + if(storeSize) { + database.setBytes(1, DataHelpers.serializeInt(size - 5)); + } + return size; } @@ -88,13 +143,18 @@ public class BdfObject implements IBdfType // Objects switch(type) { - case BdfTypes.ARRAY: return ((BdfArray)object).serializeSeeker(locations) + 1; - case BdfTypes.NAMED_LIST: return ((BdfNamedList)object).serializeSeeker(locations) + 1; - case BdfTypes.STRING: return ((String)object).getBytes().length + 1; + case BdfTypes.ARRAY: return ((BdfArray)object).serializeSeeker(locations) + 5; + case BdfTypes.NAMED_LIST: return ((BdfNamedList)object).serializeSeeker(locations) + 5; + case BdfTypes.STRING: return ((String)object).getBytes().length + 5; } - // Anything else - return database.size() + 1; + int size = getSize(type); + + if(size != -1) { + return size; + } + + return database.size() + 5; } private String calcIndent(BdfIndent indent, int it) { diff --git a/src/bdf/types/BdfReader.java b/src/bdf/types/BdfReader.java index 7c12bfd..606f8ee 100644 --- a/src/bdf/types/BdfReader.java +++ b/src/bdf/types/BdfReader.java @@ -39,8 +39,8 @@ public class BdfReader // Get the rest of the data int upto = lookupTable_size + 4; - int bdf_size = DataHelpers.getByteBuffer(database.getPointer(upto, 4)).getInt(); - bdf = new BdfObject(lookupTable, database.getPointer(upto + 4, bdf_size)); + int bdf_size = BdfObject.getSize(database.getPointer(upto)); + bdf = new BdfObject(lookupTable, database.getPointer(upto, bdf_size)); } public BdfDatabase serialize() @@ -49,14 +49,13 @@ public class BdfReader int bdf_size = bdf.serializeSeeker(locations); int lookupTable_size = lookupTable.serializeSeeker(locations); - int database_size = bdf_size + lookupTable_size + 8; + int database_size = bdf_size + lookupTable_size + 4; BdfDatabase database = new BdfDatabase(database_size); database.setBytes(0, DataHelpers.serializeInt(lookupTable_size)); - database.setBytes(4 + lookupTable_size, DataHelpers.serializeInt(bdf_size)); lookupTable.serialize(database.getPointer(4, lookupTable_size), locations); - bdf.serialize(database.getPointer(8 + lookupTable_size, database_size), locations); + bdf.serialize(database.getPointer(4 + lookupTable_size, database_size), locations); return database; }