From 71a60717d9bfd9917944dd0fe6bde4d5c9c34852 Mon Sep 17 00:00:00 2001 From: Bill Currie Date: Wed, 12 Mar 2003 22:31:44 +0000 Subject: [PATCH] make pr_source_path a ; separated list of dirs and make it controllable in qfprogs --- include/QF/progs.h | 1 + libs/gamecode/engine/pr_debug.c | 53 ++++++++++++++++++++++++++------- libs/gamecode/engine/pr_load.c | 8 +++++ tools/qfprogs/source/qfprogs.c | 20 ++++++++++--- 4 files changed, 67 insertions(+), 15 deletions(-) diff --git a/include/QF/progs.h b/include/QF/progs.h index 313d5e8e8..d80cae997 100644 --- a/include/QF/progs.h +++ b/include/QF/progs.h @@ -337,6 +337,7 @@ struct progs_s { int (*prune_edict)(progs_t *pr, edict_t *ent); void (*free_edict)(progs_t *pr, edict_t *ent); + void (*file_error)(progs_t *pr, const char *path); void *(*load_file)(progs_t *pr, const char *path); void *(*allocate_progs_mem)(progs_t *pr, int size); void (*free_progs_mem)(progs_t *pr, void *mem); diff --git a/libs/gamecode/engine/pr_debug.c b/libs/gamecode/engine/pr_debug.c index d9328fd94..3c0cd8819 100644 --- a/libs/gamecode/engine/pr_debug.c +++ b/libs/gamecode/engine/pr_debug.c @@ -68,9 +68,11 @@ typedef struct { progs_t *pr; } file_t; -cvar_t *pr_debug; -cvar_t *pr_source_path; -static hashtab_t *file_hash; +cvar_t *pr_debug; +cvar_t *pr_source_path; +static hashtab_t *file_hash; +static char *source_path_string; +static char **source_paths; static const char * @@ -91,6 +93,30 @@ file_free (void *_f, void *unused) free (f); } +static void +source_path_f (cvar_t *var) +{ + int i; + char *s; + + if (source_path_string) + free (source_path_string); + source_path_string = strdup (var->string); + if (source_paths) + free (source_paths); + for (i = 2, s = source_path_string; *s; s++) + if (*s == ';') + i++; + source_paths = malloc (i * sizeof (char **)); + source_paths[0] = source_path_string; + for (i = 1, s = source_path_string; *s; s++) + if (*s == ';') { + *s++ = 0; + source_paths[i++] = s; + } + source_paths[i] = 0; +} + void PR_Debug_Init (void) { @@ -102,26 +128,31 @@ PR_Debug_Init_Cvars (void) { pr_debug = Cvar_Get ("pr_debug", "0", CVAR_NONE, NULL, "enable progs debugging"); - pr_source_path = Cvar_Get ("pr_source_path", ".", CVAR_NONE, NULL, "where " - "to look (within gamedir) for source files"); + pr_source_path = Cvar_Get ("pr_source_path", ".", CVAR_NONE, source_path_f, + "where to look (within gamedir) for source " + "files"); } static file_t * PR_Load_Source_File (progs_t *pr, const char *fname) { - char *path, *l; + char *path, *l, **dir; file_t *f = Hash_Find (file_hash, fname); if (f) return f; - f = malloc (sizeof (file_t)); + f = calloc (1, sizeof (file_t)); if (!f) return 0; - path = Hunk_TempAlloc (strlen (pr_source_path->string) + strlen (fname) + - 2); - sprintf (path, "%s/%s", pr_source_path->string, fname); - f->text = pr->load_file (pr, path); + for (dir = source_paths; *dir && !f->text; dir++) { + int len; + len = strlen (*dir) + strlen (fname) + 2; + path = Hunk_TempAlloc (len); + sprintf (path, "%s/%s", *dir, fname); + f->text = pr->load_file (pr, path); + } if (!f->text) { + pr->file_error (pr, path); free (f); return 0; } diff --git a/libs/gamecode/engine/pr_load.c b/libs/gamecode/engine/pr_load.c index 228caee8d..4fecaa16a 100644 --- a/libs/gamecode/engine/pr_load.c +++ b/libs/gamecode/engine/pr_load.c @@ -72,6 +72,12 @@ var_get_key (void *d, void *_pr) return PR_GetString (pr, def->s_name); } +static void +file_error (progs_t *pr, const char *path) +{ + Sys_Printf ("failed to load %s\n", path); +} + static void * load_file (progs_t *pr, const char *path) { @@ -155,6 +161,8 @@ PR_LoadProgsFile (progs_t * pr, QFile *file, int size, int edicts, int zone) pr->pr_edict_size &= ~(sizeof (void*) - 1); pr->pr_edictareasize = edicts * pr->pr_edict_size; + if (!pr->file_error) + pr->file_error = file_error; if (!pr->load_file) pr->load_file = load_file; if (!pr->allocate_progs_mem) diff --git a/tools/qfprogs/source/qfprogs.c b/tools/qfprogs/source/qfprogs.c index c30987884..ed7819c56 100644 --- a/tools/qfprogs/source/qfprogs.c +++ b/tools/qfprogs/source/qfprogs.c @@ -42,6 +42,7 @@ static __attribute__ ((unused)) const char rcsid[] = #ifdef HAVE_IO_H # include #endif +#include #include #include #include @@ -73,6 +74,7 @@ static const struct option long_options[] = { {"functions", no_argument, 0, 'F'}, {"lines", no_argument, 0, 'l'}, {"modules", no_argument, 0, 'M'}, + {"path", required_argument, 0, 'P'}, {"verbose", no_argument, 0, 'v'}, {NULL, 0, NULL, 0}, }; @@ -85,6 +87,7 @@ static void *membase; static int memsize = 1024*1024; static int verbosity = 0; +static const char *source_path = ""; static hashtab_t *func_tab; @@ -99,6 +102,12 @@ open_file (const char *path, int *len) return file; } +static void +file_error (progs_t *pr, const char *name) +{ + perror (name); +} + static void * load_file (progs_t *pr, const char *name) { @@ -109,10 +118,8 @@ load_file (progs_t *pr, const char *name) file = open_file (name, &size); if (!file) { file = open_file (va ("%s.gz", name), &size); - if (!file) { - perror (name); + if (!file) return 0; - } } sym = malloc (size); Qread (file, sym, size); @@ -166,12 +173,14 @@ init_qf (void) Memory_Init (membase, memsize); Cvar_Get ("pr_debug", va ("%d", verbosity), 0, 0, ""); + Cvar_Get ("pr_source_path", source_path, 0, 0, ""); PR_Init_Cvars (); PR_Init (); pr.edicts = &edicts; pr.num_edicts = &num_edicts; pr.reserved_edicts = &reserved_edicts; + pr.file_error = file_error; pr.load_file = load_file; pr.allocate_progs_mem = allocate_progs_mem; pr.free_progs_mem = free_progs_mem; @@ -215,7 +224,8 @@ main (int argc, char **argv) int c; void (*func)(progs_t *pr) = dump_globals; - while ((c = getopt_long (argc, argv, "dgsfFlMv", long_options, 0)) != EOF) { + while ((c = getopt_long (argc, argv, + "dgsfFlMP:v", long_options, 0)) != EOF) { switch (c) { case 'd': func = disassemble_progs; @@ -238,6 +248,8 @@ main (int argc, char **argv) case 'M': func = dump_modules; break; + case 'P': + source_path = strdup (optarg); case 'v': verbosity++; break;