diff --git a/src/common/wadres.c b/src/common/wadres.c
index 5861fe5f41c093247088eb343fc9ef7f408cb024..356f591f2267be52967cfed126d433fefa21623b 100644 (file)
--- a/src/common/wadres.c
+++ b/src/common/wadres.c
#include <stdint.h>
#include <string.h>
#include <stdint.h>
#include <string.h>
+#include <stdlib.h>
#include <assert.h>
#include "wadres.h"
#include <assert.h>
#include "wadres.h"
int f;
} Entry;
int f;
} Entry;
+typedef struct Block {
+ int id;
+ int ref;
+ char data[];
+} Block;
+
static int n_wads;
static int n_resources;
static Stream *wads[MAX_WADS];
static Entry resources[MAX_RESOURCES];
static int n_wads;
static int n_resources;
static Stream *wads[MAX_WADS];
static Entry resources[MAX_RESOURCES];
+static Block *blocks[MAX_RESOURCES];
static int check_header (Stream *r) {
assert(r != NULL);
static int check_header (Stream *r) {
assert(r != NULL);
return -1;
}
return -1;
}
-static int WADRES_read (Stream *r) {
+static int WADRES_read (int f) {
+ Stream *r = wads[f];
stream_setpos(r, 4); // skip magic
int32_t n = stream_read32(r);
int32_t dir = stream_read32(r);
stream_setpos(r, 4); // skip magic
int32_t n = stream_read32(r);
int32_t dir = stream_read32(r);
Entry e;
e.offset = stream_read32(r);
e.size = stream_read32(r);
Entry e;
e.offset = stream_read32(r);
e.size = stream_read32(r);
+ e.f = f;
stream_read(e.name, 8, 1, r);
ok = WADRES_addresource(&e) != -1;
}
stream_read(e.name, 8, 1, r);
ok = WADRES_addresource(&e) != -1;
}
int WADRES_rehash (void) {
int ok = 1;
for (int i = 0; i < n_wads; ++i) {
int WADRES_rehash (void) {
int ok = 1;
for (int i = 0; i < n_wads; ++i) {
- if (!WADRES_read(wads[i])) {
+ if (!WADRES_read(i)) {
ok = 0;
}
}
ok = 0;
}
}
stream_read(data, resources[id].size, 1, r);
stream_setpos(r, pos);
}
stream_read(data, resources[id].size, 1, r);
stream_setpos(r, pos);
}
+
+void *WADRES_lock (int id) {
+ assert(id >= -1 && id < MAX_RESOURCES);
+ if (id >= 0) {
+ Block *x = blocks[id];
+ if (x) {
+ x->ref += 1;
+ return x->data;
+ } else {
+ x = malloc(sizeof(Block) + WADRES_getsize(id));
+ if (x) {
+ x->id = id;
+ x->ref = 1;
+ WADRES_getdata(id, x->data);
+ blocks[id] = x;
+ return x->data;
+ }
+ }
+ }
+ return NULL;
+}
+
+void WADRES_unlock (void *data) {
+ if (data) {
+ Block *x = data - sizeof(Block);
+ int id = x->id;
+ assert(id >= 0 && id < MAX_RESOURCES);
+ x->ref -= 1;
+ assert(x->ref >= 0);
+#if 0
+ if (x->ref == 0) {
+ blocks[id] = NULL;
+ free(x);
+ }
+#endif
+ }
+}
+
+int WADRES_locked (int id) {
+ assert(id >= -1 && id < MAX_RESOURCES);
+ return (id >= 0) && (blocks[id] != NULL) && (blocks[id]->ref >= 1);
+}
+
+int WADRES_was_locked (int id) {
+ assert(id >= -1 && id < MAX_RESOURCES);
+ return (id >= 0) && (blocks[id] != NULL) && (blocks[id]->ref >= 0);
+}