Add methods to read/write byte arrays to tagfile format.

git-svn-id: svn+ssh://svn.gna.org/svn/warzone/trunk@3036 4a71c877-e1ca-e34f-864e-861f7616d084
master
Per Inge Mathisen 2007-12-10 21:48:27 +00:00
parent 7485b20097
commit 6118371c0e
4 changed files with 67 additions and 0 deletions

View File

@ -10,6 +10,7 @@
02 US 03 - # Droid position in (x,y,z) coordinates
03 FP 01 - # RETIRED (had unknown usage)
04 FP 03 - # RETIRED (had unknown usage)
05 US 500 - # Long unsigned byte array
09 GR 00 - # Droid weapon group
01 US 01 - # Weapon type
02 US 01 10 # Ammo left

View File

@ -212,3 +212,9 @@
04 SI 01 -1 # Object being rearmed, if any, -1 if none
FF EN 00 -
FF EN 00 -
10 GR 00 - # GATEWAY ZONE LINES
01 US 01 - # Ugly binary blob of data. Someone please decode me!
FF EN 00 -
11 GR 00 - # GATEWAY ZONES
01 US 01 - # Ugly binary blob of data. Someone please decode me!
FF EN 00 -

View File

@ -753,6 +753,37 @@ bool tagReadfv(element_t tag, uint16_t size, float *vals)
return true;
}
bool tagRead8v(element_t tag, uint16_t size, uint8_t *vals)
{
uint8_t tagtype;
uint16_t count;
int i;
if (!scanforward(tag))
{
return false;
}
if (!PHYSFS_readUBE8(handle, &tagtype) || tagtype != TF_INT_U8_ARRAY)
{
TF_ERROR("tagread8v: Tag type not found: %x", (unsigned int)tag);
return false;
}
if (!PHYSFS_readUBE16(handle, &count) || count != size)
{
TF_ERROR("tagread8v: Bad size: %x", (unsigned int)tag);
return false;
}
for (i = 0; i < size; i++)
{
if (!PHYSFS_readUBE8(handle, &vals[i]))
{
TF_ERROR("tagread8v: Error reading idx %d, tag %x", i, (unsigned int)tag);
return false;
}
}
return true;
}
bool tagRead16v(element_t tag, uint16_t size, uint16_t *vals)
{
uint8_t tagtype;
@ -1105,6 +1136,25 @@ bool tagWritefv(element_t tag, uint16_t count, float *vals)
return true;
}
bool tagWrite8v(element_t tag, uint16_t count, uint8_t *vals)
{
int i;
assert(tag != TAG_SEPARATOR && tag != TAG_GROUP_END);
if (!scan_to(tag) || !write_tag(tag))
{
return false;
}
ASSERT(current->vr[0] == 'U' && current->vr[1] == 'S', "Wrong type in writing %x", (unsigned int)tag);
(void) PHYSFS_writeUBE8(handle, TF_INT_U8_ARRAY);
(void) PHYSFS_writeUBE16(handle, count);
for (i = 0; i < count; i++)
{
(void) PHYSFS_writeUBE8(handle, vals[i]);
}
return true;
}
bool tagWrite16v(element_t tag, uint16_t count, uint16_t *vals)
{
int i;
@ -1171,6 +1221,7 @@ bool tagWriteString(element_t tag, const char *buffer)
/********* TAGFILE UNIT TEST *********/
#define BLOB_SIZE 11
// unit test function
void tagTest()
{
@ -1178,8 +1229,11 @@ void tagTest()
const char *cformat = "WZTAGFILE1";
char format[300], *formatdup;
uint16_t droidpos[3];
uint8_t blob[BLOB_SIZE];
float fv[3];
memset(blob, 1, BLOB_SIZE); // 1111111...
tagOpenWrite("testdata/tagfile_virtual.def", writename);
tagWrites(0x05, 11);
tagWriteString(0x06, cformat);
@ -1212,6 +1266,7 @@ void tagTest()
fv[1] = 1.1f;
fv[2] = -1.3f;
tagWritefv(0x03, 3, fv);
tagWrite8v(0x05, BLOB_SIZE, blob);
tagWriteEnter(0x09, 1);
{
int32_t v[3] = { -1, 0, 1 };
@ -1225,6 +1280,7 @@ void tagTest()
memset(droidpos, 0, 6);
memset(fv, 0, 6);
memset(blob, 0, BLOB_SIZE);
tagOpenRead("testdata/tagfile_basic.def", writename);
tagReadString(0x01, 200, format);
assert(strncmp(format, cformat, 9) == 0);
@ -1241,6 +1297,8 @@ void tagTest()
assert(fv[0] - 0.1f < 0.001);
assert(fv[1] - 1.1f < 0.001);
assert(fv[2] + 1.3f < 0.001);
tagRead8v(0x05, BLOB_SIZE, blob);
assert(blob[BLOB_SIZE / 2] == 1);
tagReadEnter(0x09);
tagReads32v(0x05, 3, v);
assert(v[0] == -1);

View File

@ -67,6 +67,7 @@ bool tagWrite(element_t tag, uint32_t val);
bool tagWrites(element_t tag, int32_t val);
bool tagWritef(element_t tag, float val);
bool tagWritefv(element_t tag, uint16_t count, float *vals);
bool tagWrite8v(element_t tag, uint16_t count, uint8_t *vals);
bool tagWrite16v(element_t tag, uint16_t count, uint16_t *vals);
bool tagWrites32v(element_t tag, uint16_t count, int32_t *vals);
bool tagWriteString(element_t tag, const char *string);
@ -85,6 +86,7 @@ int32_t tagReads(element_t tag);
bool tagReadBool(element_t tag);
float tagReadf(element_t tag);
bool tagReadfv(element_t tag, uint16_t size, float *vals);
bool tagRead8v(element_t tag, uint16_t size, uint8_t *vals);
bool tagRead16v(element_t tag, uint16_t size, uint16_t *vals);
bool tagReads16v(element_t tag, uint16_t size, int16_t *vals);
bool tagReadString(element_t tag, uint16_t size, char *buffer);