mirror of
https://git.code.sf.net/p/quake/quakeforge
synced 2024-11-23 04:42:32 +00:00
resource usage cleanup
This is an imperfect revision of history.
This commit is contained in:
parent
13029212a8
commit
ff47490c48
7 changed files with 196 additions and 101 deletions
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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");
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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[] = {
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue