Got something working

This commit is contained in:
josua 2020-08-18 22:52:08 +10:00
parent 89426bff98
commit 01348a5adf
7 changed files with 113 additions and 88 deletions

View File

@ -59,7 +59,7 @@ public class BdfArray implements IBdfType, Iterable<BdfObject>
this.elements = new ArrayList<BdfObject>(size); this.elements = new ArrayList<BdfObject>(size);
for(int i=0;i<size;i++) { for(int i=0;i<size;i++) {
this.elements.set(i, new BdfObject(lookupTable)); this.elements.add(new BdfObject(lookupTable));
} }
} }
@ -101,12 +101,12 @@ public class BdfArray implements IBdfType, Iterable<BdfObject>
} }
@Override @Override
public int serialize(IBdfDatabase database, int[] locations, int[] map, byte flags) public int serialize(IBdfDatabase database, int[] locations, byte flags)
{ {
int pos = 0; int pos = 0;
for(BdfObject o : elements) { for(BdfObject o : elements) {
pos += o.serialize(database.getPointer(pos), locations, map, (byte)0); pos += o.serialize(database.getPointer(pos), locations, (byte)0);
} }
return pos; return pos;

View File

@ -55,13 +55,19 @@ class BdfLookupTable implements IBdfType
} }
@Override @Override
public int serialize(IBdfDatabase database, int[] locations, int[] map, byte flags) public int serialize(IBdfDatabase database, int[] locations, byte flags)
{ {
int upto = 0; int upto = 0;
for(int i=0;i<map.length;i++) for(int i=0;i<locations.length;i++)
{ {
byte[] key = keys.get(map[i]); int loc = locations[i];
if(loc == -1) {
continue;
}
byte[] key = keys.get(i);
database.setBytes(key, upto + 1); database.setBytes(key, upto + 1);
database.setByte(upto, (byte)key.length); database.setByte(upto, (byte)key.length);
@ -78,10 +84,12 @@ class BdfLookupTable implements IBdfType
{ {
int size = 0; int size = 0;
for(int i=0;i<keys.size();i++) for(int i=0;i<locations.length;i++)
{ {
// Skip this key if the location is unset (the key has been culled) // Skip this key if the location is unset (the key has been culled)
if(locations[i] == -1) { int loc = locations[i];
if(loc == -1) {
continue; continue;
} }
@ -92,53 +100,9 @@ class BdfLookupTable implements IBdfType
return size; return size;
} }
// Bubble sort public int[] serializeGetLocations()
private int[] sortLocations(int[] locations, int[] uses, int[] map)
{
int[] map_copy = new int[map.length];
for(int i=0;i<map.length;i++) {
map_copy[i] = map[i];
}
for(int i=0; i < map.length; i++)
{
boolean changed = false;
for(int j=0; j < map.length - i - 1; j++)
{
int loc_0 = map[j];
int loc_1 = map[j + 1];
// Swap the index at j+1 and j in locations and uses
if(uses[loc_1] > uses[loc_0])
{
int v_l = locations[loc_0];
locations[loc_0] = locations[loc_1];
locations[loc_1] = v_l;
int v_u = uses[loc_0];
uses[loc_0] = uses[loc_1];
uses[loc_1] = v_u;
int v_m = map_copy[j];
map_copy[j] = map_copy[j+1];
map_copy[j+1] = v_m;
changed = true;
}
}
if(!changed) {
return map_copy;
}
}
return map_copy;
}
public int[] serializeGetLocations(int[] locations)
{ {
int[] locations = new int[keys.size()];
int[] uses = new int[keys.size()]; int[] uses = new int[keys.size()];
int next = 0; int next = 0;
@ -153,19 +117,8 @@ class BdfLookupTable implements IBdfType
locations[i] = -1; locations[i] = -1;
} }
} }
int[] map = new int[next]; return locations;
next = 0;
for(int i=0;i<locations.length;i++)
{
if(locations[i] != -1) {
map[next] = i;
next += 1;
}
}
return sortLocations(locations, uses, map);
} }
@Override @Override

View File

@ -140,13 +140,14 @@ public class BdfNamedList implements IBdfType
} }
@Override @Override
public int serialize(IBdfDatabase database, int[] locations, int[] map, byte flags) public int serialize(IBdfDatabase database, int[] locations, byte flags)
{ {
int pos = 0; int pos = 0;
for(Element o : elements) for(Element o : elements)
{ {
int location = locations[o.key]; int location = locations[o.key];
byte size_bytes_tag; byte size_bytes_tag;
byte size_bytes; byte size_bytes;
@ -161,7 +162,7 @@ public class BdfNamedList implements IBdfType
size_bytes = 1; size_bytes = 1;
} }
int size = o.object.serialize(database.getPointer(pos), locations, map, size_bytes_tag); int size = o.object.serialize(database.getPointer(pos), locations, size_bytes_tag);
int offset = pos + size; int offset = pos + size;
byte[] bytes = DataHelpers.serializeInt(location); byte[] bytes = DataHelpers.serializeInt(location);

View File

@ -419,6 +419,10 @@ public class BdfObject implements IBdfType
} }
} }
public byte getType() {
return type;
}
private boolean shouldStoreSize(byte b) { private boolean shouldStoreSize(byte b) {
return b > 7; return b > 7;
} }
@ -509,7 +513,7 @@ public class BdfObject implements IBdfType
} }
@Override @Override
public int serialize(IBdfDatabase database, int[] locations, int[] map, byte parent_flags) public int serialize(IBdfDatabase database, int[] locations, byte parent_flags)
{ {
int size = last_seek; int size = last_seek;
boolean storeSize = shouldStoreSize(type); boolean storeSize = shouldStoreSize(type);
@ -538,11 +542,11 @@ public class BdfObject implements IBdfType
switch(type) switch(type)
{ {
case BdfTypes.ARRAY: case BdfTypes.ARRAY:
size = ((BdfArray)object).serialize(database.getPointer(offset), locations, map, (byte)0) + offset; size = ((BdfArray)object).serialize(database.getPointer(offset), locations, (byte)0) + offset;
break; break;
case BdfTypes.NAMED_LIST: case BdfTypes.NAMED_LIST:
size = ((BdfNamedList)object).serialize(database.getPointer(offset), locations, map, (byte)0) + offset; size = ((BdfNamedList)object).serialize(database.getPointer(offset), locations, (byte)0) + offset;
break; break;
case BdfTypes.STRING: case BdfTypes.STRING:

View File

@ -91,8 +91,7 @@ public class BdfReader
public BdfDatabase serialize() public BdfDatabase serialize()
{ {
int[] locations = new int[lookupTable.size()]; int[] locations = lookupTable.serializeGetLocations();
int[] map = lookupTable.serializeGetLocations(locations);
int bdf_size = bdf.serializeSeeker(locations); int bdf_size = bdf.serializeSeeker(locations);
int lookupTable_size = lookupTable.serializeSeeker(locations); int lookupTable_size = lookupTable.serializeSeeker(locations);
@ -115,7 +114,7 @@ public class BdfReader
int database_size = bdf_size + lookupTable_size + lookupTable_size_bytes; int database_size = bdf_size + lookupTable_size + lookupTable_size_bytes;
BdfDatabase database = new BdfDatabase(database_size); BdfDatabase database = new BdfDatabase(database_size);
bdf.serialize(database.getPointer(upto, bdf_size), locations, map, lookupTable_size_tag); bdf.serialize(database.getPointer(upto, bdf_size), locations, lookupTable_size_tag);
upto += bdf_size; upto += bdf_size;
byte[] bytes = DataHelpers.serializeInt(lookupTable_size); byte[] bytes = DataHelpers.serializeInt(lookupTable_size);
@ -124,7 +123,7 @@ public class BdfReader
database.setByte(i + upto, bytes[i - lookupTable_size_bytes + 4]); database.setByte(i + upto, bytes[i - lookupTable_size_bytes + 4]);
} }
lookupTable.serialize(database.getPointer(upto + lookupTable_size_bytes, lookupTable_size), locations, map, (byte)0); lookupTable.serialize(database.getPointer(upto + lookupTable_size_bytes, lookupTable_size), locations, (byte)0);
return database; return database;
} }
@ -167,14 +166,4 @@ public class BdfReader
public void serializeHumanReadable(OutputStream stream) throws IOException { public void serializeHumanReadable(OutputStream stream) throws IOException {
serializeHumanReadable(stream, new BdfIndent("", "")); serializeHumanReadable(stream, new BdfIndent("", ""));
} }
public static BdfReader fromHumanReadable(IBdfDatabase data)
{
BdfReader reader = new BdfReader();
BdfObject bdf = reader.getObject();
return reader;
}
} }

View File

@ -8,7 +8,7 @@ import bdf.data.IBdfDatabase;
interface IBdfType interface IBdfType
{ {
void getLocationUses(int[] locations); void getLocationUses(int[] locations);
int serialize(IBdfDatabase database, int[] locations, int[] map, byte flags); int serialize(IBdfDatabase database, int[] locations, byte flags);
int serializeSeeker(int[] locations); int serializeSeeker(int[] locations);
void serializeHumanReadable(OutputStream stream, BdfIndent indent, int it) throws IOException; void serializeHumanReadable(OutputStream stream, BdfIndent indent, int it) throws IOException;

View File

@ -1,9 +1,57 @@
package tests; package tests;
import java.io.FileOutputStream;
import java.io.IOException;
import bdf.classes.IBdfClassManager;
import bdf.data.IBdfDatabase; import bdf.data.IBdfDatabase;
import bdf.file.BdfFileManager;
import bdf.types.BdfArray;
import bdf.types.BdfIndent;
import bdf.types.BdfNamedList;
import bdf.types.BdfObject;
import bdf.types.BdfReader;
import bdf.types.BdfTypes;
import bdf.util.FileHelpers;
public class Tests public class Tests
{ {
private static class Storage implements IBdfClassManager
{
String name;
int type;
int age;
public Storage(String name, int age, int type) {
this.name = name;
this.age = age;
this.type = type;
}
@Override
public void BdfClassLoad(BdfObject bdf)
{
}
@Override
public void BdfClassSave(BdfObject bdf)
{
BdfNamedList nl = bdf.getNamedList();
nl.set("name", bdf.newObject().setString(name));
if(age != -1) {
nl.set("age", bdf.newObject().setAutoInt(age));
}
if(type != -1) {
nl.set("type", bdf.newObject().setAutoInt(type));
}
}
}
public static void displayHex(IBdfDatabase db) public static void displayHex(IBdfDatabase db)
{ {
char[] hex_chars = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; char[] hex_chars = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
@ -23,9 +71,39 @@ public class Tests
System.out.println(); System.out.println();
} }
public static void main(String[] args) public static void main(String[] args) throws IOException
{ {
BdfReader reader = new BdfReader();
BdfObject bdf = reader.getObject();
bdf.getKeyLocation("type");
bdf.getKeyLocation("qwerty");
bdf.getKeyLocation("age");
bdf.getKeyLocation("name");
Storage[] items = {
new Storage("test1", -1, 1),
new Storage("test2", 69, 2),
new Storage("test3", 420, -1),
new Storage("test4", 23, 3),
new Storage("test5", -1, -1),
};
BdfArray array = bdf.newArray(5);
bdf.setArray(array);
for(int i=0;i<items.length;i++) {
items[i].BdfClassSave(array.get(i));
}
reader.serializeHumanReadable(System.out);
IBdfDatabase db = reader.serialize();
displayHex(db);
reader = new BdfReader(db);
reader.serializeHumanReadable(System.out);
} }
} }