From 4c9337fd35c1557abc6763826c667c5cc822735d Mon Sep 17 00:00:00 2001 From: Spoike Date: Sat, 2 Apr 2005 18:00:45 +0000 Subject: [PATCH] some bug fixes. git-svn-id: https://svn.code.sf.net/p/fteqw/code/trunk@936 fc73d0e0-1445-4013-8a0c-d673dee63da5 --- engine/qclib/initlib.c | 21 +++++++++-- engine/qclib/pr_edict.c | 30 ++++++++++++---- engine/qclib/progsint.h | 2 +- engine/qclib/progslib.h | 1 + engine/qclib/qcc.h | 2 +- engine/qclib/qcc_pr_comp.c | 30 ++++++++++------ engine/qclib/qcc_pr_lex.c | 73 ++++++++++++++++---------------------- engine/qclib/qccmain.c | 2 +- 8 files changed, 95 insertions(+), 66 deletions(-) diff --git a/engine/qclib/initlib.c b/engine/qclib/initlib.c index afe097df..628b77eb 100644 --- a/engine/qclib/initlib.c +++ b/engine/qclib/initlib.c @@ -146,7 +146,11 @@ void PR_Configure (progfuncs_t *progfuncs, int addressable_size, int max_progs) struct globalvars_s *PR_globals (progfuncs_t *progfuncs, progsnum_t pnum) { if (pnum < 0) + { + if (!current_progstate) + return NULL; //err.. you've not loaded one yet. return (struct globalvars_s *)current_progstate->globals; + } return (struct globalvars_s *)pr_progstate[pnum].globals; } @@ -162,9 +166,20 @@ func_t PR_FindFunc(progfuncs_t *progfuncs, char *funcname, progsnum_t pnum) { dfunction_t *f=NULL; - if (pnum == -2) + if (pnum == PR_ANY) { - for (pnum = 0; pnum < maxprogs; pnum ++) + for (pnum = 0; pnum < maxprogs; pnum++) + { + if (!pr_progstate[pnum].progs) + continue; + f = ED_FindFunction(progfuncs, funcname, &pnum, pnum); + if (f) + break; + } + } + else if (pnum == PR_ANYBACK) //run backwards + { + for (pnum = maxprogs-1; pnum >= 0; pnum--) { if (!pr_progstate[pnum].progs) continue; @@ -192,7 +207,7 @@ func_t PR_FindFunc(progfuncs_t *progfuncs, char *funcname, progsnum_t pnum) case 32: var32 = ED_FindTypeGlobalFromProgs32(progfuncs, funcname, pnum, ev_function); //we must make sure we actually have a function def - 'light' is defined as a field before it is defined as a function. if (!var32) - return (f - pr_progstate[pnum].functions) | (pnum << 24);; + return (f - pr_progstate[pnum].functions) | (pnum << 24); return *(int *)&pr_progstate[pnum].globals[var32->ofs]; } Sys_Error("Error with def size (PR_FindFunc)"); diff --git a/engine/qclib/pr_edict.c b/engine/qclib/pr_edict.c index ce9237db..64d4c1e3 100644 --- a/engine/qclib/pr_edict.c +++ b/engine/qclib/pr_edict.c @@ -25,8 +25,19 @@ vec3_t vec3_origin; //int pr_max_edict_size; //unsigned short pr_crc; - -int type_size[9] = {1,sizeof(string_t)/4,1,3,1,1,sizeof(func_t)/4,sizeof(void *)/4, 1}; +const int type_size[12] = {1, //void + sizeof(string_t)/4, //string + 1, //float + 3, //vector + 1, //entity + 1, //field + sizeof(func_t)/4,//function + sizeof(void *)/4,//pointer + 1, //integer + 1, //fixme: how big should a variant be? + 0, //ev_struct. variable sized. + 0 //ev_union. variable sized. + }; fdef_t *ED_FieldAtOfs (progfuncs_t *progfuncs, unsigned int ofs); pbool ED_ParseEpair (progfuncs_t *progfuncs, void *base, ddefXX_t *key, char *s, int bits); @@ -2011,7 +2022,7 @@ int LoadEnts(progfuncs_t *progfuncs, char *file, float killonspawnflags) selfvar = (eval_t *)((int *)pr_globals + ED_FindGlobalOfs(progfuncs, "self")); selfvar->edict = EDICT_TO_PROG(progfuncs, ed); - f = PR_FindFunc(progfuncs, var->string+progfuncs->stringtable, -2); + f = PR_FindFunc(progfuncs, var->string+progfuncs->stringtable, PR_ANYBACK); if (f) { if (CheckSpawn) @@ -2781,13 +2792,18 @@ retry: for (i = 0; i < pr_progs->numbodylessfuncs; i++) { d16 = ED_FindGlobal16(progfuncs, s); + if (!d16) + Sys_Error("Progs requires \"%s\" the external function \"%s\", but the definition was stripped", filename, s); + + ((int *)glob)[d16->ofs] = PR_FindFunc(progfuncs, s, PR_ANY); + if (!((int *)glob)[d16->ofs]) + Sys_Error("Runtime-linked function %s was not found in primary progs (loading %s)", s, filename); + /* d2 = ED_FindGlobalOfsFromProgs(progfuncs, s, 0, ev_function); if (!d2) - Sys_Error("Runtime-linked function %s was not found in existing progs", s); - if (!d16) - Sys_Error("Couldn't find def for \"%s\"", s); + Sys_Error("Runtime-linked function %s was not found in primary progs (loading %s)", s, filename); ((int *)glob)[d16->ofs] = (*(func_t *)&pr_progstate[0].globals[*d2]); - + */ s+=strlen(s)+1; } } diff --git a/engine/qclib/progsint.h b/engine/qclib/progsint.h index 1080d444..2dcb5179 100644 --- a/engine/qclib/progsint.h +++ b/engine/qclib/progsint.h @@ -273,7 +273,7 @@ int NUM_FOR_EDICT(progfuncs_t *progfuncs, struct edict_s *e); #define E_VECTOR(e,o) (&((float*)&e->v)[o]) #define E_STRING(e,o) (*(string_t *)&((float*)(e+1))[o]) -extern int type_size[9]; +const extern int type_size[]; extern unsigned short pr_crc; diff --git a/engine/qclib/progslib.h b/engine/qclib/progslib.h index c7af0a64..e07b21cb 100644 --- a/engine/qclib/progslib.h +++ b/engine/qclib/progslib.h @@ -191,6 +191,7 @@ typedef union eval_s #define PR_CURRENT -1 #define PR_ANY -2 //not always valid. Use for finding funcs +#define PR_ANYBACK -3 #define PROGSTRUCT_VERSION 2 diff --git a/engine/qclib/qcc.h b/engine/qclib/qcc.h index 4bdf6182..6925d3c6 100644 --- a/engine/qclib/qcc.h +++ b/engine/qclib/qcc.h @@ -371,7 +371,7 @@ typedef union QCC_eval_s union QCC_eval_s *ptr; } QCC_eval_t; -const extern int type_size[12]; +const extern int type_size[]; //extern QCC_def_t *def_for_type[9]; extern QCC_type_t *type_void, *type_string, *type_float, *type_vector, *type_entity, *type_field, *type_function, *type_pointer, *type_integer, *type_variant, *type_floatfield; diff --git a/engine/qclib/qcc_pr_comp.c b/engine/qclib/qcc_pr_comp.c index 696b19fa..0d242622 100644 --- a/engine/qclib/qcc_pr_comp.c +++ b/engine/qclib/qcc_pr_comp.c @@ -3251,7 +3251,7 @@ QCC_def_t *QCC_PR_ParseValue (QCC_type_t *assumeclass) QCC_PR_ParseError (ERR_UNKNOWNVALUE, "Unknown value \"%s\"", name); else { - QCC_PR_ParseWarning (ERR_UNKNOWNVALUE, "Unknown value \"%s\", assuming float.", name); + QCC_PR_ParseWarning (ERR_UNKNOWNVALUE, "Unknown value \"%s\".", name); } } } @@ -6653,7 +6653,7 @@ QCC_def_t *QCC_PR_DummyDef(QCC_type_t *type, char *name, QCC_def_t *scope, int a { char array[64]; char newname[256]; - int a, i; + int a; QCC_def_t *def, *first=NULL; #define KEYWORD(x) if (!STRCMP(name, #x) && keyword_##x) {if (keyword_##x)QCC_PR_ParseWarning(WARN_KEYWORDDISABLED, "\""#x"\" keyword used as variable name%s", keywords_coexist?" - coexisting":" - disabling");keyword_##x=keywords_coexist;} @@ -6761,8 +6761,6 @@ QCC_def_t *QCC_PR_DummyDef(QCC_type_t *type, char *name, QCC_def_t *scope, int a case ev_function: sprintf(newname, "%s%s.%s", name, array, parttype->name); QCC_PR_DummyDef(parttype, newname, scope, 1, ofs + type->size*a +parttype->ofs, false)->initialized = true; - for (i = parttype->num_parms; i>0; i--) - parttype=parttype->next; break; case ev_void: break; @@ -7675,13 +7673,11 @@ void QCC_PR_ParseDefs (char *classname) def->initialized = 2; // check for an initialization - if (type->type == ev_function && (pr_scope || !constant)) + if (type->type == ev_function && (pr_scope)) { if ( QCC_PR_CheckToken ("=") ) { - if (def->arraysize>1) - goto lazyfunctiondeclaration; - QCC_PR_ParseError (ERR_INITIALISEDLOCALFUNCTION, "local functions may only be used as pointers"); + QCC_PR_ParseError (ERR_INITIALISEDLOCALFUNCTION, "local functions may not be initialised"); } arraysize = def->arraysize; @@ -7774,7 +7770,6 @@ void QCC_PR_ParseDefs (char *classname) else if (type->type == ev_function) { -lazyfunctiondeclaration: def->constant = constant; if (QCC_PR_CheckToken("0")) { @@ -7784,9 +7779,22 @@ lazyfunctiondeclaration: continue; } + if (!def->constant && arraysize==1) + { + def->constant = 0; + def->initialized = 1; //fake function + + name = QCC_PR_ParseName (); + d = QCC_PR_GetDef (NULL, name, pr_scope, false, 0); + if (!d) + QCC_PR_ParseError(ERR_NOTDEFINED, "%s was not previously defined", name); + G_FUNCTION(def->ofs+i) = G_FUNCTION(d->ofs); + continue; + } + if (arraysize>1) { - int i; + int i; def->initialized = 1; //fake function QCC_PR_Expect ("{"); i = 0; @@ -7825,6 +7833,8 @@ lazyfunctiondeclaration: QCC_PR_ParseError(ERR_TOOMANYINITIALISERS, "Too many initializers"); continue; } + if (!def->constant) + QCC_PR_ParseError(0, "Functions must be constant"); def->references++; pr_scope = def; diff --git a/engine/qclib/qcc_pr_lex.c b/engine/qclib/qcc_pr_lex.c index 1dd37416..be09f589 100644 --- a/engine/qclib/qcc_pr_lex.c +++ b/engine/qclib/qcc_pr_lex.c @@ -4,6 +4,7 @@ #ifdef QCC #define print printf #endif +#include "time.h" #define MEMBERFIELDNAME "__m%s" @@ -65,7 +66,19 @@ QCC_type_t *type_variant;// = {ev_integer/*, &def_integer*/}; QCC_type_t *type_floatfield;// = {ev_field/*, &def_field*/, NULL, &type_float}; #ifdef QCCONLY -const int type_size[12] = {1,1,1,3,1,1,1,1,1, 1, 0,0}; +const int type_size[12] = {1, //void + sizeof(string_t)/4, //string + 1, //float + 3, //vector + 1, //entity + 1, //field + sizeof(func_t)/4,//function + sizeof(void *)/4,//pointer + 1, //integer + 1, //fixme: how big should a variant be? + 0, //ev_struct. variable sized. + 0 //ev_union. variable sized. + }; #endif /*QCC_def_t def_void = {type_void, "temp"}; @@ -1809,31 +1822,6 @@ void QCC_PR_ConditionCompilation(void) QCC_PR_ParseError(ERR_CONSTANTTOOLONG, "Macro %s too long (%i not %i)", cnst->name, strlen(cnst->value), sizeof(cnst->value)); } -char *daynames[] = -{ - "Mon", - "Tue", - "Wed", - "Thu", - "Fri", - "Sat", - "Sun" -}; -char *monthnames[] = -{ - "Jan", - "Feb", - "Mar", - "Apr", - "May", - "Jun", - "Jul", - "Aug", - "Sep", - "Oct", - "Nov", - "Dec" -}; int QCC_PR_CheakCompConst(void) { char *oldpr_file_p = pr_file_p; @@ -2013,14 +2001,13 @@ int QCC_PR_CheakCompConst(void) if (!strncmp(pr_file_p, "__TIME__", 8)) { - static char retbuf[256]; -#ifdef WIN32 - SYSTEMTIME Systime; - GetSystemTime(&Systime); - sprintf(retbuf, "\"%i:%i\"", Systime.wHour, Systime.wMinute); -#else //linux - sprintf(retbuf, "\"unknown time\""); -#endif + static char retbuf[128]; + + time_t long_time; + time( &long_time ); + strftime( retbuf, sizeof(retbuf), + "%R", localtime( &long_time )); + pr_file_p = retbuf; QCC_PR_Lex(); //translate the macro's value pr_file_p = oldpr_file_p+8; @@ -2029,15 +2016,15 @@ int QCC_PR_CheakCompConst(void) } if (!strncmp(pr_file_p, "__DATE__", 8)) { - static char retbuf[256]; -#ifdef WIN32 - SYSTEMTIME Systime; - GetSystemTime(&Systime); - //dayname, day, month, year - sprintf(retbuf, "\"%s %i %s %i\"", daynames[Systime.wDayOfWeek], Systime.wDay, monthnames[Systime.wMonth], Systime.wYear); -#else //linux - sprintf(retbuf, "\"unknown date\""); -#endif + static char retbuf[128]; + + time_t long_time; + time( &long_time ); + strftime( retbuf, sizeof(retbuf), + "%a %d %b %Y", localtime( &long_time )); + + + pr_file_p = retbuf; QCC_PR_Lex(); //translate the macro's value pr_file_p = oldpr_file_p+8; diff --git a/engine/qclib/qccmain.c b/engine/qclib/qccmain.c index f4ea3b63..07d3c0c0 100644 --- a/engine/qclib/qccmain.c +++ b/engine/qclib/qccmain.c @@ -485,7 +485,7 @@ int WriteBodylessFuncs (int handle) { if (d->type->type == ev_function && !d->scope)// function parms are ok { - if (d->initialized != 1) + if (d->initialized != 1 && d->references>0) { SafeWrite(handle, d->name, strlen(d->name)+1); ret++;