resource usage cleanup

This is an imperfect revision of history.
This commit is contained in:
Bill Currie 2004-11-11 07:57:00 +00:00 committed by Jeff Teunissen
parent 13029212a8
commit ff47490c48
7 changed files with 196 additions and 101 deletions

View file

@ -54,7 +54,7 @@ void RUA_Script_Init (progs_t *pr, int secure);
void RUA_String_Init (struct progs_s *pr, int secure); void RUA_String_Init (struct progs_s *pr, int secure);
void RUA_QFile_Init (struct progs_s *pr, int secure); void RUA_QFile_Init (struct progs_s *pr, int secure);
QFile **QFile_AllocHandle (struct progs_s *pr, qfile_resources_t *res); int QFile_AllocHandle (struct progs_s *pr, QFile *file);
void RUA_QFS_Init (struct progs_s *pr, int secure); void RUA_QFS_Init (struct progs_s *pr, int secure);

View file

@ -47,20 +47,13 @@ typedef struct {
static cbuf_t * static cbuf_t *
get_cbuf (progs_t *pr, int arg, const char *func) get_cbuf (progs_t *pr, int arg, const char *func)
{ {
pr_type_t *handle; cbuf_t *cbuf = 0;
cbuf_t *cbuf;
if (arg == 0) { if (arg == 0) {
cbuf_resources_t *res = PR_Resources_Find (pr, "Cbuf"); cbuf_resources_t *res = PR_Resources_Find (pr, "Cbuf");
cbuf = res->cbuf; cbuf = res->cbuf;
} else { } else {
if (arg <= ((pr_type_t *) pr->zone - pr->pr_globals) PR_RunError (pr, "%s: Invalid cbuf_t", func);
|| (size_t) arg >= (pr->zone_size / sizeof (pr_type_t)))
PR_RunError (pr, "%s: Invalid cbuf_t", func);
handle = pr->pr_globals + arg;
cbuf = *(cbuf_t **)handle;
} }
if (!cbuf) if (!cbuf)
PR_RunError (pr, "Invalid cbuf_t"); PR_RunError (pr, "Invalid cbuf_t");

View file

@ -159,7 +159,7 @@ static builtin_t builtins[] = {
void void
RUA_Cmd_Init (progs_t *pr, int secure) RUA_Cmd_Init (progs_t *pr, int secure)
{ {
cmd_resources_t *res = malloc (sizeof (cmd_resources_t)); cmd_resources_t *res = calloc (1, sizeof (cmd_resources_t));
res->cmds = 0; res->cmds = 0;
PR_Resources_Register (pr, "Cmd", res, bi_cmd_clear); PR_Resources_Register (pr, "Cmd", res, bi_cmd_clear);

View file

@ -118,8 +118,7 @@ file_writeable (char *path)
static void static void
bi_File_Open (progs_t *pr) bi_File_Open (progs_t *pr)
{ {
qfile_resources_t *res = PR_Resources_Find (pr, "QFile"); QFile *file;
QFile **file = QFile_AllocHandle (pr, res);
const char *pth = P_GSTRING (pr, 0); const char *pth = P_GSTRING (pr, 0);
const char *mode = P_GSTRING (pr, 1); const char *mode = P_GSTRING (pr, 1);
char *path; char *path;
@ -163,12 +162,13 @@ bi_File_Open (progs_t *pr)
if (do_write && !file_writeable (path)) if (do_write && !file_writeable (path))
goto error; goto error;
*file = QFS_Open (va ("%s/%s", qfs_gamedir->dir.def, path), mode); file = QFS_Open (va ("%s/%s", qfs_gamedir->dir.def, path), mode);
if (!*file) if (!file)
goto error; goto error;
R_INT (pr) = (file - res->handles) + 1;
free (path); free (path);
return; if ((R_INT (pr) = QFile_AllocHandle (pr, file)))
return;
Qclose (file);
error: error:
free (path); free (path);
R_INT (pr) = 0; R_INT (pr) = 0;

View file

@ -60,9 +60,40 @@ typedef struct bi_hashtab_s {
} bi_hashtab_t; } bi_hashtab_t;
typedef struct { typedef struct {
PR_RESMAP (bi_hashtab_t) table_map;
bi_hashtab_t *tabs; bi_hashtab_t *tabs;
} hash_resources_t; } hash_resources_t;
static bi_hashtab_t *
table_new (hash_resources_t *res)
{
PR_RESNEW (bi_hashtab_t, res->table_map);
}
static void
table_free (hash_resources_t *res, bi_hashtab_t *table)
{
PR_RESFREE (bi_hashtab_t, res->table_map, table);
}
static void
table_reset (hash_resources_t *res)
{
PR_RESRESET (bi_hashtab_t, res->table_map);
}
static inline bi_hashtab_t *
table_get (hash_resources_t *res, int index)
{
PR_RESGET(res->table_map, index);
}
static inline int
table_index (hash_resources_t *res, bi_hashtab_t *table)
{
PR_RESINDEX(res->table_map, table);
}
static const char * static const char *
bi_get_key (void *key, void *_ht) bi_get_key (void *key, void *_ht)
{ {
@ -112,7 +143,7 @@ bi_Hash_NewTable (progs_t *pr)
void (*f)(void*,void*); void (*f)(void*,void*);
bi_hashtab_t *ht; bi_hashtab_t *ht;
ht = PR_Zone_Malloc (pr, sizeof (bi_hashtab_t)); ht = table_new (res);
ht->pr = pr; ht->pr = pr;
ht->gk = P_FUNCTION (pr, 1); ht->gk = P_FUNCTION (pr, 1);
ht->f = P_FUNCTION (pr, 2); ht->f = P_FUNCTION (pr, 2);
@ -120,19 +151,31 @@ bi_Hash_NewTable (progs_t *pr)
ht->next = res->tabs; ht->next = res->tabs;
ht->prev = &res->tabs; ht->prev = &res->tabs;
if (ht->next) if (res->tabs)
ht->next->prev = &ht->next; res->tabs->prev = &ht->next;
res->tabs = ht;
gk = ht->gk ? bi_get_key : 0; gk = ht->gk ? bi_get_key : 0;
f = ht->f ? bi_free : 0; f = ht->f ? bi_free : 0;
ht->tab = Hash_NewTable (tsize, gk, f, ht); ht->tab = Hash_NewTable (tsize, gk, f, ht);
RETURN_POINTER (pr, ht); R_INT (pr) = table_index (res, ht);
}
static bi_hashtab_t *
get_table (progs_t *pr, const char *name, int index)
{
hash_resources_t *res = PR_Resources_Find (pr, "Hash");
bi_hashtab_t *ht = table_get (res, index);
if (!ht)
PR_RunError (pr, "invalid hash table index passed to %s", name + 3);
return ht;
} }
static void static void
bi_Hash_SetHashCompare (progs_t *pr) bi_Hash_SetHashCompare (progs_t *pr)
{ {
bi_hashtab_t *ht = &P_STRUCT (pr, bi_hashtab_t, 0); bi_hashtab_t *ht = get_table (pr, __FUNCTION__, P_INT (pr, 0));
unsigned long (*gh)(void*,void*); unsigned long (*gh)(void*,void*);
int (*cmp)(void*,void*,void*); int (*cmp)(void*,void*,void*);
@ -146,17 +189,18 @@ bi_Hash_SetHashCompare (progs_t *pr)
static void static void
bi_Hash_DelTable (progs_t *pr) bi_Hash_DelTable (progs_t *pr)
{ {
bi_hashtab_t *ht = &P_STRUCT (pr, bi_hashtab_t, 0); hash_resources_t *res = PR_Resources_Find (pr, "Hash");
bi_hashtab_t *ht = get_table (pr, __FUNCTION__, P_INT (pr, 0));
Hash_DelTable (ht->tab); Hash_DelTable (ht->tab);
*ht->prev = ht->next; *ht->prev = ht->next;
PR_Zone_Free (pr, ht); table_free (res, ht);
} }
static void static void
bi_Hash_FlushTable (progs_t *pr) bi_Hash_FlushTable (progs_t *pr)
{ {
bi_hashtab_t *ht = &P_STRUCT (pr, bi_hashtab_t, 0); bi_hashtab_t *ht = get_table (pr, __FUNCTION__, P_INT (pr, 0));
Hash_FlushTable (ht->tab); Hash_FlushTable (ht->tab);
} }
@ -164,7 +208,7 @@ bi_Hash_FlushTable (progs_t *pr)
static void static void
bi_Hash_Add (progs_t *pr) bi_Hash_Add (progs_t *pr)
{ {
bi_hashtab_t *ht = &P_STRUCT (pr, bi_hashtab_t, 0); bi_hashtab_t *ht = get_table (pr, __FUNCTION__, P_INT (pr, 0));
R_INT (pr) = Hash_Add (ht->tab, (void *) (long) P_INT (pr, 1)); R_INT (pr) = Hash_Add (ht->tab, (void *) (long) P_INT (pr, 1));
} }
@ -172,7 +216,7 @@ bi_Hash_Add (progs_t *pr)
static void static void
bi_Hash_AddElement (progs_t *pr) bi_Hash_AddElement (progs_t *pr)
{ {
bi_hashtab_t *ht = &P_STRUCT (pr, bi_hashtab_t, 0); bi_hashtab_t *ht = get_table (pr, __FUNCTION__, P_INT (pr, 0));
R_INT (pr) = Hash_AddElement (ht->tab, (void *) (long) P_INT (pr, 1)); R_INT (pr) = Hash_AddElement (ht->tab, (void *) (long) P_INT (pr, 1));
} }
@ -180,7 +224,7 @@ bi_Hash_AddElement (progs_t *pr)
static void static void
bi_Hash_Find (progs_t *pr) bi_Hash_Find (progs_t *pr)
{ {
bi_hashtab_t *ht = &P_STRUCT (pr, bi_hashtab_t, 0); bi_hashtab_t *ht = get_table (pr, __FUNCTION__, P_INT (pr, 0));
R_INT (pr) = (long) Hash_Find (ht->tab, P_GSTRING (pr, 1)); R_INT (pr) = (long) Hash_Find (ht->tab, P_GSTRING (pr, 1));
} }
@ -188,7 +232,7 @@ bi_Hash_Find (progs_t *pr)
static void static void
bi_Hash_FindElement (progs_t *pr) bi_Hash_FindElement (progs_t *pr)
{ {
bi_hashtab_t *ht = &P_STRUCT (pr, bi_hashtab_t, 0); bi_hashtab_t *ht = get_table (pr, __FUNCTION__, P_INT (pr, 0));
R_INT (pr) = (long) Hash_FindElement (ht->tab, R_INT (pr) = (long) Hash_FindElement (ht->tab,
(void *) (long) P_INT (pr, 1)); (void *) (long) P_INT (pr, 1));
@ -197,7 +241,7 @@ bi_Hash_FindElement (progs_t *pr)
static void static void
bi_Hash_FindList (progs_t *pr) bi_Hash_FindList (progs_t *pr)
{ {
bi_hashtab_t *ht = &P_STRUCT (pr, bi_hashtab_t, 0); bi_hashtab_t *ht = get_table (pr, __FUNCTION__, P_INT (pr, 0));
void **list, **l; void **list, **l;
pr_type_t *pr_list; pr_type_t *pr_list;
int count; int count;
@ -206,6 +250,7 @@ bi_Hash_FindList (progs_t *pr)
for (count = 1, l = list; *l; l++) for (count = 1, l = list; *l; l++)
count++; count++;
pr_list = PR_Zone_Malloc (pr, count * sizeof (pr_type_t)); pr_list = PR_Zone_Malloc (pr, count * sizeof (pr_type_t));
// the hash tables stores progs pointers...
for (count = 0, l = list; *l; l++) for (count = 0, l = list; *l; l++)
pr_list[count++].integer_var = (long) *l; pr_list[count++].integer_var = (long) *l;
free (list); free (list);
@ -215,7 +260,7 @@ bi_Hash_FindList (progs_t *pr)
static void static void
bi_Hash_FindElementList (progs_t *pr) bi_Hash_FindElementList (progs_t *pr)
{ {
bi_hashtab_t *ht = &P_STRUCT (pr, bi_hashtab_t, 0); bi_hashtab_t *ht = get_table (pr, __FUNCTION__, P_INT (pr, 0));
void **list, **l; void **list, **l;
pr_type_t *pr_list; pr_type_t *pr_list;
int count; int count;
@ -224,6 +269,7 @@ bi_Hash_FindElementList (progs_t *pr)
for (count = 1, l = list; *l; l++) for (count = 1, l = list; *l; l++)
count++; count++;
pr_list = PR_Zone_Malloc (pr, count * sizeof (pr_type_t)); pr_list = PR_Zone_Malloc (pr, count * sizeof (pr_type_t));
// the hash tables stores progs pointers...
for (count = 0, l = list; *l; l++) for (count = 0, l = list; *l; l++)
pr_list[count++].integer_var = (long) *l; pr_list[count++].integer_var = (long) *l;
free (list); free (list);
@ -233,7 +279,7 @@ bi_Hash_FindElementList (progs_t *pr)
static void static void
bi_Hash_Del (progs_t *pr) bi_Hash_Del (progs_t *pr)
{ {
bi_hashtab_t *ht = &P_STRUCT (pr, bi_hashtab_t, 0); bi_hashtab_t *ht = get_table (pr, __FUNCTION__, P_INT (pr, 0));
R_INT (pr) = (long) Hash_Del (ht->tab, P_GSTRING (pr, 1)); R_INT (pr) = (long) Hash_Del (ht->tab, P_GSTRING (pr, 1));
} }
@ -241,7 +287,7 @@ bi_Hash_Del (progs_t *pr)
static void static void
bi_Hash_DelElement (progs_t *pr) bi_Hash_DelElement (progs_t *pr)
{ {
bi_hashtab_t *ht = &P_STRUCT (pr, bi_hashtab_t, 0); bi_hashtab_t *ht = get_table (pr, __FUNCTION__, P_INT (pr, 0));
R_INT (pr) = (long) Hash_DelElement (ht->tab, R_INT (pr) = (long) Hash_DelElement (ht->tab,
(void *) (long) P_INT (pr, 1)); (void *) (long) P_INT (pr, 1));
@ -250,7 +296,7 @@ bi_Hash_DelElement (progs_t *pr)
static void static void
bi_Hash_Free (progs_t *pr) bi_Hash_Free (progs_t *pr)
{ {
bi_hashtab_t *ht = &P_STRUCT (pr, bi_hashtab_t, 0); bi_hashtab_t *ht = get_table (pr, __FUNCTION__, P_INT (pr, 0));
Hash_Free (ht->tab, (void *) (long) P_INT (pr, 1)); Hash_Free (ht->tab, (void *) (long) P_INT (pr, 1));
} }
@ -270,7 +316,7 @@ bi_Hash_Buffer (progs_t *pr)
static void static void
bi_Hash_GetList (progs_t *pr) bi_Hash_GetList (progs_t *pr)
{ {
bi_hashtab_t *ht = &P_STRUCT (pr, bi_hashtab_t, 0); bi_hashtab_t *ht = get_table (pr, __FUNCTION__, P_INT (pr, 0));
void **list, **l; void **list, **l;
pr_type_t *pr_list; pr_type_t *pr_list;
int count; int count;
@ -279,6 +325,7 @@ bi_Hash_GetList (progs_t *pr)
for (count = 1, l = list; *l; l++) for (count = 1, l = list; *l; l++)
count++; count++;
pr_list = PR_Zone_Malloc (pr, count * sizeof (pr_type_t)); pr_list = PR_Zone_Malloc (pr, count * sizeof (pr_type_t));
// the hash tables stores progs pointers...
for (count = 0, l = list; *l; l++) for (count = 0, l = list; *l; l++)
pr_list[count++].integer_var = (long) *l; pr_list[count++].integer_var = (long) *l;
free (list); free (list);
@ -288,7 +335,7 @@ bi_Hash_GetList (progs_t *pr)
static void static void
bi_Hash_Stats (progs_t *pr) bi_Hash_Stats (progs_t *pr)
{ {
bi_hashtab_t *ht = &P_STRUCT (pr, bi_hashtab_t, 0); bi_hashtab_t *ht = get_table (pr, __FUNCTION__, P_INT (pr, 0));
Hash_Stats (ht->tab); Hash_Stats (ht->tab);
} }
@ -302,6 +349,7 @@ bi_hash_clear (progs_t *pr, void *data)
for (ht = res->tabs; ht; ht = ht->next) for (ht = res->tabs; ht; ht = ht->next)
Hash_DelTable (ht->tab); Hash_DelTable (ht->tab);
res->tabs = 0; res->tabs = 0;
table_reset (res);
} }
static builtin_t builtins[] = { static builtin_t builtins[] = {
@ -328,7 +376,7 @@ static builtin_t builtins[] = {
void void
RUA_Hash_Init (progs_t *pr, int secure) RUA_Hash_Init (progs_t *pr, int secure)
{ {
hash_resources_t *res = malloc (sizeof (hash_resources_t)); hash_resources_t *res = calloc (1, sizeof (hash_resources_t));
res->tabs = 0; res->tabs = 0;
PR_Resources_Register (pr, "Hash", res, bi_hash_clear); PR_Resources_Register (pr, "Hash", res, bi_hash_clear);

View file

@ -46,32 +46,82 @@ static __attribute__ ((unused)) const char rcsid[] =
#include "rua_internal.h" #include "rua_internal.h"
typedef struct qfile_s {
struct qfile_s *next;
struct qfile_s **prev;
QFile *file;
} qfile_t;
typedef struct {
PR_RESMAP (qfile_t) handle_map;
qfile_t *handles;
} qfile_resources_t;
static qfile_t *
handle_new (qfile_resources_t *res)
{
PR_RESNEW (qfile_t, res->handle_map);
}
static void
handle_free (qfile_resources_t *res, qfile_t *handle)
{
PR_RESFREE (qfile_t, res->handle_map, handle);
}
static void
handle_reset (qfile_resources_t *res)
{
PR_RESRESET (qfile_t, res->handle_map);
}
static inline qfile_t *
handle_get (qfile_resources_t *res, int index)
{
PR_RESGET(res->handle_map, index);
}
static inline int
handle_index (qfile_resources_t *res, qfile_t *handle)
{
PR_RESINDEX(res->handle_map, handle);
}
static void static void
bi_qfile_clear (progs_t *pr, void *data) bi_qfile_clear (progs_t *pr, void *data)
{ {
qfile_resources_t *res = (qfile_resources_t *) data; qfile_resources_t *res = (qfile_resources_t *) data;
int i; qfile_t *handle;
for (i = 0; i < QFILE_MAX_HANDLES; i++) for (handle = res->handles; handle; handle = handle->next)
if (res->handles[i]) { Qclose (handle->file);
Qclose (res->handles[i]); res->handles = 0;
res->handles[i] = 0; handle_reset (res);
}
} }
QFile ** static int
QFile_AllocHandle (struct progs_s *pr, qfile_resources_t *res) alloc_handle (qfile_resources_t *res, QFile *file)
{ {
int h; qfile_t *handle = handle_new (res);
for (h = 0; h < QFILE_MAX_HANDLES && res->handles[h]; h++) if (!handle)
; return 0;
if (h == QFILE_MAX_HANDLES)
goto error; handle->next = res->handles;
res->handles[h] = (QFile *) 1; handle->prev = &res->handles;
return res->handles + h; if (res->handles)
error: res->handles->prev = &handle->next;
return 0; res->handles = handle;
handle->file = file;
return handle_index (res, handle);
}
int
QFile_AllocHandle (progs_t *pr, QFile *file)
{
qfile_resources_t *res = PR_Resources_Find (pr, "QFile");
return alloc_handle (res, file);
} }
static void static void
@ -103,44 +153,48 @@ bi_Qopen (progs_t *pr)
qfile_resources_t *res = PR_Resources_Find (pr, "QFile"); qfile_resources_t *res = PR_Resources_Find (pr, "QFile");
const char *path = P_GSTRING (pr, 0); const char *path = P_GSTRING (pr, 0);
const char *mode = P_GSTRING (pr, 1); const char *mode = P_GSTRING (pr, 1);
QFile **h = QFile_AllocHandle (pr, res); QFile *file;
if (!h) { R_INT (pr) = 0;
R_INT (pr) = 0; if (!(file = Qopen (path, mode)))
return; return;
} if (!(R_INT (pr) = alloc_handle (res, file)))
*h = Qopen (path, mode); Qclose (file);
R_INT (pr) = (h - res->handles) + 1;
} }
static QFile ** static qfile_t *
get_qfile (progs_t *pr, int handle, const char *func) get_handle (progs_t *pr, const char *name, int handle)
{ {
qfile_resources_t *res = PR_Resources_Find (pr, "QFile"); qfile_resources_t *res = PR_Resources_Find (pr, "QFile");
qfile_t *h = handle_get (res, handle);
if (handle < 1 || handle > QFILE_MAX_HANDLES || !res->handles[handle - 1]) if (!h)
PR_RunError (pr, "%s: Invalid QFile", func); PR_RunError (pr, "invalid file handle passed to %s", name + 3);
return res->handles + handle - 1; return h;
} }
static void static void
bi_Qclose (progs_t *pr) bi_Qclose (progs_t *pr)
{ {
qfile_resources_t *res = PR_Resources_Find (pr, "QFile");
int handle = P_INT (pr, 0); int handle = P_INT (pr, 0);
QFile **h = get_qfile (pr, handle, "Qclose"); qfile_t *h = handle_get (res, handle);
Qclose (*h); if (!h)
*h = 0; PR_RunError (pr, "invalid file handle pass to Qclose");
Qclose (h->file);
*h->prev = h->next;
handle_free (res, h);
} }
static void static void
bi_Qgetline (progs_t *pr) bi_Qgetline (progs_t *pr)
{ {
int handle = P_INT (pr, 0); int handle = P_INT (pr, 0);
QFile **h = get_qfile (pr, handle, "Qgetline"); qfile_t *h = get_handle (pr, __FUNCTION__, handle);
const char *s; const char *s;
s = Qgetline (*h); s = Qgetline (h->file);
if (s) if (s)
RETURN_STRING (pr, s); RETURN_STRING (pr, s);
else else
@ -161,112 +215,112 @@ static void
bi_Qread (progs_t *pr) bi_Qread (progs_t *pr)
{ {
int handle = P_INT (pr, 0); int handle = P_INT (pr, 0);
QFile **h = get_qfile (pr, handle, "Qread"); qfile_t *h = get_handle (pr, __FUNCTION__, handle);
pr_type_t *buf = P_GPOINTER (pr, 1); pr_type_t *buf = P_GPOINTER (pr, 1);
int count = P_INT (pr, 2); int count = P_INT (pr, 2);
check_buffer (pr, buf, count, "Qread"); check_buffer (pr, buf, count, "Qread");
R_INT (pr) = Qread (*h, buf, count); R_INT (pr) = Qread (h->file, buf, count);
} }
static void static void
bi_Qwrite (progs_t *pr) bi_Qwrite (progs_t *pr)
{ {
int handle = P_INT (pr, 0); int handle = P_INT (pr, 0);
QFile **h = get_qfile (pr, handle, "Qwrite"); qfile_t *h = get_handle (pr, __FUNCTION__, handle);
pr_type_t *buf = P_GPOINTER (pr, 1); pr_type_t *buf = P_GPOINTER (pr, 1);
int count = P_INT (pr, 2); int count = P_INT (pr, 2);
check_buffer (pr, buf, count, "Qwrite"); check_buffer (pr, buf, count, "Qwrite");
R_INT (pr) = Qwrite (*h, buf, count); R_INT (pr) = Qwrite (h->file, buf, count);
} }
static void static void
bi_Qputs (progs_t *pr) bi_Qputs (progs_t *pr)
{ {
int handle = P_INT (pr, 0); int handle = P_INT (pr, 0);
QFile **h = get_qfile (pr, handle, "Qputs"); qfile_t *h = get_handle (pr, __FUNCTION__, handle);
const char *str = P_GSTRING (pr, 1); const char *str = P_GSTRING (pr, 1);
R_INT (pr) = Qputs (*h, str); R_INT (pr) = Qputs (h->file, str);
} }
#if 0 #if 0
static void static void
bi_Qgets (progs_t *pr) bi_Qgets (progs_t *pr)
{ {
int handle = P_INT (pr, 0); int handle = P_INT (pr, 0);
QFile **h = get_qfile (pr, handle, "Qgets"); qfile_t *h = get_handle (pr, __FUNCTION__, handle);
pr_type_t *buf = P_GPOINTER (pr, 1); pr_type_t *buf = P_GPOINTER (pr, 1);
int count = P_INT (pr, 2); int count = P_INT (pr, 2);
check_buffer (pr, buf, count, "Qgets"); check_buffer (pr, buf, count, "Qgets");
R_INT (pr) = POINTER_TO_PROG (pr, Qgets (*h, (char *) buf, count)); RETURN_POINTER (pr, Qgets (h->file, (char *) buf, count));
} }
#endif #endif
static void static void
bi_Qgetc (progs_t *pr) bi_Qgetc (progs_t *pr)
{ {
int handle = P_INT (pr, 0); int handle = P_INT (pr, 0);
QFile **h = get_qfile (pr, handle, "Qgetc"); qfile_t *h = get_handle (pr, __FUNCTION__, handle);
R_INT (pr) = Qgetc (*h); R_INT (pr) = Qgetc (h->file);
} }
static void static void
bi_Qputc (progs_t *pr) bi_Qputc (progs_t *pr)
{ {
int handle = P_INT (pr, 0); int handle = P_INT (pr, 0);
QFile **h = get_qfile (pr, handle, "Qputc"); qfile_t *h = get_handle (pr, __FUNCTION__, handle);
int c = P_INT (pr, 1); int c = P_INT (pr, 1);
R_INT (pr) = Qputc (*h, c); R_INT (pr) = Qputc (h->file, c);
} }
static void static void
bi_Qseek (progs_t *pr) bi_Qseek (progs_t *pr)
{ {
int handle = P_INT (pr, 0); int handle = P_INT (pr, 0);
QFile **h = get_qfile (pr, handle, "Qseek"); qfile_t *h = get_handle (pr, __FUNCTION__, handle);
int offset = P_INT (pr, 1); int offset = P_INT (pr, 1);
int whence = P_INT (pr, 2); int whence = P_INT (pr, 2);
R_INT (pr) = Qseek (*h, offset, whence); R_INT (pr) = Qseek (h->file, offset, whence);
} }
static void static void
bi_Qtell (progs_t *pr) bi_Qtell (progs_t *pr)
{ {
int handle = P_INT (pr, 0); int handle = P_INT (pr, 0);
QFile **h = get_qfile (pr, handle, "Qtell"); qfile_t *h = get_handle (pr, __FUNCTION__, handle);
R_INT (pr) = Qtell (*h); R_INT (pr) = Qtell (h->file);
} }
static void static void
bi_Qflush (progs_t *pr) bi_Qflush (progs_t *pr)
{ {
int handle = P_INT (pr, 0); int handle = P_INT (pr, 0);
QFile **h = get_qfile (pr, handle, "Qflush"); qfile_t *h = get_handle (pr, __FUNCTION__, handle);
R_INT (pr) = Qflush (*h); R_INT (pr) = Qflush (h->file);
} }
static void static void
bi_Qeof (progs_t *pr) bi_Qeof (progs_t *pr)
{ {
int handle = P_INT (pr, 0); int handle = P_INT (pr, 0);
QFile **h = get_qfile (pr, handle, "Qeof"); qfile_t *h = get_handle (pr, __FUNCTION__, handle);
R_INT (pr) = Qeof (*h); R_INT (pr) = Qeof (h->file);
} }
static void static void
bi_Qfilesize (progs_t *pr) bi_Qfilesize (progs_t *pr)
{ {
int handle = P_INT (pr, 0); int handle = P_INT (pr, 0);
QFile **h = get_qfile (pr, handle, "Qfilesize"); qfile_t *h = get_handle (pr, __FUNCTION__, handle);
R_INT (pr) = Qfilesize (*h); R_INT (pr) = Qfilesize (h->file);
} }
static builtin_t secure_builtins[] = { static builtin_t secure_builtins[] = {

View file

@ -99,16 +99,16 @@ bi_QFS_LoadFile (progs_t *pr)
static void static void
bi_QFS_OpenFile (progs_t *pr) bi_QFS_OpenFile (progs_t *pr)
{ {
qfile_resources_t *res = PR_Resources_Find (pr, "QFile"); QFile *file;
QFile **file = QFile_AllocHandle (pr, res);
const char *filename = P_GSTRING (pr, 0); const char *filename = P_GSTRING (pr, 0);
QFS_FOpenFile (filename, file); QFS_FOpenFile (filename, &file);
if (!*file) { if (!file) {
RETURN_POINTER (pr, 0); R_INT (pr) = 0;
return; return;
} }
R_INT (pr) = (file - res->handles) + 1; if (!(R_INT (pr) = QFile_AllocHandle (pr, file)))
Qclose (file);
} }
static void static void
@ -136,9 +136,9 @@ bi_QFS_Filelist (progs_t *pr)
list = PR_Zone_Malloc (pr, sizeof (list) + filelist->count * 4); list = PR_Zone_Malloc (pr, sizeof (list) + filelist->count * 4);
list->count = filelist->count; list->count = filelist->count;
strings = (string_t *) list + 1; strings = (string_t *) list + 1;
list->list = POINTER_TO_PROG (pr, strings); list->list = PR_SetPointer (pr, strings);
for (i = 0; i < filelist->count; i++) for (i = 0; i < filelist->count; i++)
strings[i] = PR_SetString (pr, filelist->list[i]); strings[i] = PR_SetTempString (pr, filelist->list[i]);
RETURN_POINTER (pr, list); RETURN_POINTER (pr, list);
} }