diff --git a/tools/qfcc/include/qfcc.h b/tools/qfcc/include/qfcc.h index 064369d79..e3e76a949 100644 --- a/tools/qfcc/include/qfcc.h +++ b/tools/qfcc/include/qfcc.h @@ -201,18 +201,6 @@ extern int numfunctions; extern float pr_globals[MAX_REGS]; extern int numpr_globals; -extern char precache_sounds[MAX_SOUNDS][MAX_DATA_PATH]; -extern int precache_sounds_block[MAX_SOUNDS]; -extern int numsounds; - -extern char precache_models[MAX_MODELS][MAX_DATA_PATH]; -extern int precache_models_block[MAX_SOUNDS]; -extern int nummodels; - -extern char precache_files[MAX_FILES][MAX_DATA_PATH]; -extern int precache_files_block[MAX_SOUNDS]; -extern int numfiles; - extern int num_auxfunctions; extern pr_auxfunction_t *auxfunctions; @@ -263,5 +251,7 @@ extern options_t options; void PrecacheSound (def_t *e, int ch); void PrecacheModel (def_t *e, int ch); void PrecacheFile (def_t *e, int ch); +void WriteFiles (const char *sourcedir); +int WriteProgdefs (char *filename); #endif//__qfcc_h diff --git a/tools/qfcc/source/precache.c b/tools/qfcc/source/precache.c index fd2f7077d..6b060d50b 100644 --- a/tools/qfcc/source/precache.c +++ b/tools/qfcc/source/precache.c @@ -29,11 +29,25 @@ static const char rcsid[] = # include #endif -#include +#include +#include +#include "cmdlib.h" #include "qfcc.h" #include "expr.h" +static char precache_sounds[MAX_SOUNDS][MAX_DATA_PATH]; +static int precache_sounds_block[MAX_SOUNDS]; +static int numsounds; + +static char precache_models[MAX_MODELS][MAX_DATA_PATH]; +static int precache_models_block[MAX_SOUNDS]; +static int nummodels; + +static char precache_files[MAX_FILES][MAX_DATA_PATH]; +static int precache_files_block[MAX_SOUNDS]; +static int numfiles; + void PrecacheSound (def_t *e, int ch) { @@ -126,3 +140,136 @@ PrecacheFile (def_t *e, int ch) numfiles++; } + +/* + WriteFiles + + Generates files.dat, which contains all of the data files actually used by + the game, to be processed by qfiles +*/ +void +WriteFiles (const char *sourcedir) +{ + FILE *f; + int i; + dstring_t *filename = dstring_newstr (); + + dsprintf (filename, "%s%cfiles.dat", sourcedir, PATH_SEPARATOR); + f = fopen (filename->str, "w"); + if (!f) + Error ("Couldn't open %s", filename->str); + + fprintf (f, "%i\n", numsounds); + for (i = 0; i < numsounds; i++) + fprintf (f, "%i %s\n", precache_sounds_block[i], precache_sounds[i]); + + fprintf (f, "%i\n", nummodels); + for (i = 0; i < nummodels; i++) + fprintf (f, "%i %s\n", precache_models_block[i], precache_models[i]); + + fprintf (f, "%i\n", numfiles); + for (i = 0; i < numfiles; i++) + fprintf (f, "%i %s\n", precache_files_block[i], precache_files[i]); + + fclose (f); + dstring_delete (filename); +} + +/* + PR_WriteProgdefs + + Writes the global and entity structures out. + Returns a crc of the header, to be stored in the progs file for comparison + at load time. +*/ +int +WriteProgdefs (char *filename) +{ + def_t *d; + FILE *f; + unsigned short crc; + int c; + + if (options.verbosity >= 1) + printf ("writing %s\n", filename); + f = fopen (filename, "w"); + + // print global vars until the first field is defined + fprintf (f, + "\n/* file generated by qcc, do not modify */\n\ntypedef struct\n{\tint\tpad[%i];\n", + RESERVED_OFS); + + for (d = pr.def_head.def_next; d; d = d->def_next) { + if (!strcmp (d->name, "end_sys_globals")) + break; + + switch (d->type->type) { + case ev_float: + fprintf (f, "\tfloat\t%s;\n", d->name); + break; + case ev_vector: + fprintf (f, "\tvec3_t\t%s;\n", d->name); + d = d->def_next->def_next->def_next; // skip the elements + break; + case ev_string: + fprintf (f, "\tstring_t\t%s;\n", d->name); + break; + case ev_func: + fprintf (f, "\tfunc_t\t%s;\n", d->name); + break; + case ev_entity: + fprintf (f, "\tint\t%s;\n", d->name); + break; + default: + fprintf (f, "\tint\t%s;\n", d->name); + break; + } + } + fprintf (f, "} globalvars_t;\n\n"); + + // print all fields + fprintf (f, "typedef struct\n{\n"); + for (d = pr.def_head.def_next; d; d = d->def_next) { + if (!strcmp (d->name, "end_sys_fields")) + break; + + if (d->type->type != ev_field) + continue; + + switch (d->type->aux_type->type) { + case ev_float: + fprintf (f, "\tfloat\t%s;\n", d->name); + break; + case ev_vector: + fprintf (f, "\tvec3_t\t%s;\n", d->name); + d = d->def_next->def_next->def_next; // skip the elements + break; + case ev_string: + fprintf (f, "\tstring_t\t%s;\n", d->name); + break; + case ev_func: + fprintf (f, "\tfunc_t\t%s;\n", d->name); + break; + case ev_entity: + fprintf (f, "\tint\t%s;\n", d->name); + break; + default: + fprintf (f, "\tint\t%s;\n", d->name); + break; + } + } + fprintf (f, "} entvars_t;\n\n"); + + fclose (f); + + // do a crc of the file + CRC_Init (&crc); + f = fopen (filename, "r+"); + while ((c = fgetc (f)) != EOF) + CRC_ProcessByte (&crc, (byte) c); + + fprintf (f, "#define PROGHEADER_CRC %i\n", crc); + fclose (f); + + return crc; +} diff --git a/tools/qfcc/source/qfcc.c b/tools/qfcc/source/qfcc.c index 8bdaeebba..d421322e0 100644 --- a/tools/qfcc/source/qfcc.c +++ b/tools/qfcc/source/qfcc.c @@ -149,51 +149,6 @@ const char *big_function = 0; ddef_t fields[MAX_FIELDS]; int numfielddefs; -char precache_sounds[MAX_SOUNDS][MAX_DATA_PATH]; -int precache_sounds_block[MAX_SOUNDS]; -int numsounds; - -char precache_models[MAX_MODELS][MAX_DATA_PATH]; -int precache_models_block[MAX_SOUNDS]; -int nummodels; - -char precache_files[MAX_FILES][MAX_DATA_PATH]; -int precache_files_block[MAX_SOUNDS]; -int numfiles; - -/* - WriteFiles - - Generates files.dat, which contains all of the data files actually used by - the game, to be processed by qfiles -*/ -void -WriteFiles (void) -{ - FILE *f; - int i; - dstring_t *filename = dstring_newstr (); - - dsprintf (filename, "%s%cfiles.dat", sourcedir, PATH_SEPARATOR); - f = fopen (filename->str, "w"); - if (!f) - Error ("Couldn't open %s", filename->str); - - fprintf (f, "%i\n", numsounds); - for (i = 0; i < numsounds; i++) - fprintf (f, "%i %s\n", precache_sounds_block[i], precache_sounds[i]); - - fprintf (f, "%i\n", nummodels); - for (i = 0; i < nummodels; i++) - fprintf (f, "%i %s\n", precache_models_block[i], precache_models[i]); - - fprintf (f, "%i\n", numfiles); - for (i = 0; i < numfiles; i++) - fprintf (f, "%i %s\n", precache_files_block[i], precache_files[i]); - - fclose (f); - dstring_delete (filename); -} /* CopyString @@ -596,105 +551,6 @@ qboolean PR_FinishCompilation (void) //============================================================================= -/* - PR_WriteProgdefs - - Writes the global and entity structures out. - Returns a crc of the header, to be stored in the progs file for comparison - at load time. -*/ -int -PR_WriteProgdefs (char *filename) -{ - def_t *d; - FILE *f; - unsigned short crc; - int c; - - if (options.verbosity >= 1) - printf ("writing %s\n", filename); - f = fopen (filename, "w"); - - // print global vars until the first field is defined - fprintf (f, - "\n/* file generated by qcc, do not modify */\n\ntypedef struct\n{\tint\tpad[%i];\n", - RESERVED_OFS); - - for (d = pr.def_head.def_next; d; d = d->def_next) { - if (!strcmp (d->name, "end_sys_globals")) - break; - - switch (d->type->type) { - case ev_float: - fprintf (f, "\tfloat\t%s;\n", d->name); - break; - case ev_vector: - fprintf (f, "\tvec3_t\t%s;\n", d->name); - d = d->def_next->def_next->def_next; // skip the elements - break; - case ev_string: - fprintf (f, "\tstring_t\t%s;\n", d->name); - break; - case ev_func: - fprintf (f, "\tfunc_t\t%s;\n", d->name); - break; - case ev_entity: - fprintf (f, "\tint\t%s;\n", d->name); - break; - default: - fprintf (f, "\tint\t%s;\n", d->name); - break; - } - } - fprintf (f, "} globalvars_t;\n\n"); - - // print all fields - fprintf (f, "typedef struct\n{\n"); - for (d = pr.def_head.def_next; d; d = d->def_next) { - if (!strcmp (d->name, "end_sys_fields")) - break; - - if (d->type->type != ev_field) - continue; - - switch (d->type->aux_type->type) { - case ev_float: - fprintf (f, "\tfloat\t%s;\n", d->name); - break; - case ev_vector: - fprintf (f, "\tvec3_t\t%s;\n", d->name); - d = d->def_next->def_next->def_next; // skip the elements - break; - case ev_string: - fprintf (f, "\tstring_t\t%s;\n", d->name); - break; - case ev_func: - fprintf (f, "\tfunc_t\t%s;\n", d->name); - break; - case ev_entity: - fprintf (f, "\tint\t%s;\n", d->name); - break; - default: - fprintf (f, "\tint\t%s;\n", d->name); - break; - } - } - fprintf (f, "} entvars_t;\n\n"); - - fclose (f); - - // do a crc of the file - CRC_Init (&crc); - f = fopen (filename, "r+"); - while ((c = fgetc (f)) != EOF) - CRC_ProcessByte (&crc, (byte) c); - - fprintf (f, "#define PROGHEADER_CRC %i\n", crc); - fclose (f); - - return crc; -} - void PR_PrintFunction (def_t *def) @@ -1098,7 +954,7 @@ preprocess_file (const char *filename) int status; pid_t rc; -// printf ("pid = %d\n", pid); +// printf ("pid = %d\n", pid); if ((rc = waitpid (0, &status, 0 | WUNTRACED)) != pid) { if (rc == -1) { perror ("wait"); @@ -1260,14 +1116,14 @@ main (int argc, char **argv) // write progdefs.h if (options.code.progsversion == PROG_ID_VERSION) - crc = PR_WriteProgdefs ("progdefs.h"); + crc = WriteProgdefs ("progdefs.h"); // write data file WriteData (crc); // write files.dat if (options.files_dat) - WriteFiles (); + WriteFiles (sourcedir); stop = Sys_DoubleTime (); if (options.verbosity >= 0)