mirror of
https://github.com/blendogames/thirtyflightsofloving.git
synced 2025-02-22 19:51:06 +00:00
Add support for arrays of structs (up to 4 dimensions) to extractfuncs.
This commit is contained in:
parent
1816e40c8f
commit
b573e7da75
7 changed files with 309 additions and 126 deletions
|
@ -48,12 +48,19 @@ typedef enum {false, true} qboolean;
|
|||
|
||||
//#define PATHSEPERATOR_STR "\\"
|
||||
|
||||
#define MAX_VAR_ARRAY_DIMENSIONS 4 // Knightmare added
|
||||
|
||||
typedef struct replacefunc_s
|
||||
{
|
||||
char *name;
|
||||
char *newname;
|
||||
char *filename;
|
||||
char dec[MAX_TOKEN]; // function declaration
|
||||
// Knightmare added
|
||||
int isArray;
|
||||
int nArrayDims;
|
||||
size_t arrayDimSizes[MAX_VAR_ARRAY_DIMENSIONS];
|
||||
// end Knightmare
|
||||
struct replacefunc_s *next;
|
||||
} replacefunc_t;
|
||||
|
||||
|
|
|
@ -166,6 +166,9 @@ void DumpReplaceFunctions (char *typeName)
|
|||
int len, newlen;
|
||||
unsigned char *buf, *newbuf;
|
||||
int updated;
|
||||
// Knightmare added
|
||||
size_t i, j, k, l;
|
||||
char varNameBuf[256];
|
||||
|
||||
updated = 0;
|
||||
|
||||
|
@ -180,7 +183,40 @@ void DumpReplaceFunctions (char *typeName)
|
|||
for ( rf = replacefuncs; rf; rf = rf->next )
|
||||
{
|
||||
if (typeName)
|
||||
{
|
||||
// TODO: output all elements of an array
|
||||
if (rf->isArray)
|
||||
{
|
||||
for (i = 0; i < rf->arrayDimSizes[0]; i++)
|
||||
{
|
||||
for (j = 0; j < rf->arrayDimSizes[1]; j++)
|
||||
{
|
||||
for (k = 0; k < rf->arrayDimSizes[2]; k++)
|
||||
{
|
||||
for (l = 0; l < rf->arrayDimSizes[3]; l++) {
|
||||
Com_sprintf (varNameBuf, sizeof(varNameBuf), "%s[%d][%d][%d][%d]", rf->name, i, j, k, l);
|
||||
Log_Print( "{\"%s\", &%s},\n", varNameBuf, varNameBuf );
|
||||
}
|
||||
if (rf->nArrayDims == 3) {
|
||||
Com_sprintf (varNameBuf, sizeof(varNameBuf), "%s[%d][%d][%d]", rf->name, i, j, k);
|
||||
Log_Print( "{\"%s\", &%s},\n", varNameBuf, varNameBuf );
|
||||
}
|
||||
}
|
||||
if (rf->nArrayDims == 2) {
|
||||
Com_sprintf (varNameBuf, sizeof(varNameBuf), "%s[%d][%d]", rf->name, i, j);
|
||||
Log_Print( "{\"%s\", &%s},\n", varNameBuf, varNameBuf );
|
||||
}
|
||||
}
|
||||
if (rf->nArrayDims == 1) {
|
||||
Com_sprintf (varNameBuf, sizeof(varNameBuf), "%s[%d]", rf->name, i);
|
||||
Log_Print( "{\"%s\", &%s},\n", varNameBuf, varNameBuf );
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
Log_Print( "{\"%s\", &%s},\n", rf->name, rf->name );
|
||||
}
|
||||
}
|
||||
else
|
||||
Log_Print( "{\"%s\", (byte *)%s},\n", rf->name, rf->name );
|
||||
} // end for
|
||||
|
@ -230,6 +266,10 @@ void DumpReplaceFunctions (char *typeName)
|
|||
remove( "debug\\g_save.sbr" );
|
||||
remove( "release\\g_save.obj" );
|
||||
remove( "release\\g_save.sbr" );
|
||||
remove( "x64\\debug\\g_save.obj" );
|
||||
remove( "x64\\debug\\g_save.sbr" );
|
||||
remove( "x64\\release\\g_save.obj" );
|
||||
remove( "x64\\release\\g_save.sbr" );
|
||||
#endif
|
||||
|
||||
updated = 1;
|
||||
|
@ -305,6 +345,10 @@ void DumpReplaceFunctions (char *typeName)
|
|||
remove( "debug\\g_save.sbr" );
|
||||
remove( "release\\g_save.obj" );
|
||||
remove( "release\\g_save.sbr" );
|
||||
remove( "x64\\debug\\g_save.obj" );
|
||||
remove( "x64\\debug\\g_save.sbr" );
|
||||
remove( "x64\\release\\g_save.obj" );
|
||||
remove( "x64\\release\\g_save.sbr" );
|
||||
#endif
|
||||
|
||||
updated = 1;
|
||||
|
@ -324,9 +368,15 @@ void DumpReplaceFunctions (char *typeName)
|
|||
free( newbuf );
|
||||
|
||||
#ifdef _WIN32
|
||||
if ( updated ) {
|
||||
if ( updated )
|
||||
{
|
||||
if (typeName) {
|
||||
printf( "Updated the %s table, recompile required.\n", typeName );
|
||||
}
|
||||
else {
|
||||
printf( "Updated the function table, recompile required.\n" );
|
||||
}
|
||||
}
|
||||
#endif
|
||||
} // end of the function DumpReplaceFunctions
|
||||
|
||||
|
@ -388,8 +438,7 @@ void ConcatDec (tokenList_t *list, char *str, size_t strSize, int inc)
|
|||
return;
|
||||
}
|
||||
}*/
|
||||
if (list->next)
|
||||
{
|
||||
if (list->next) {
|
||||
ConcatDec (list->next, str, strSize, inc);
|
||||
}
|
||||
// strncat (str, list->token.string);
|
||||
|
@ -408,8 +457,7 @@ void AddFunctionName (char *funcname, char *filename, tokenList_t *head)
|
|||
replacefunc_t *f;
|
||||
tokenList_t *list;
|
||||
|
||||
if ( FindFunctionName(funcname) )
|
||||
{
|
||||
if ( FindFunctionName(funcname) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -450,9 +498,82 @@ void AddFunctionName (char *funcname, char *filename, tokenList_t *head)
|
|||
list = head;
|
||||
f->dec[0] = '\0';
|
||||
ConcatDec (list, f->dec, sizeof(f->dec), 0);
|
||||
|
||||
} // end of the function AddFunctionName
|
||||
|
||||
/*
|
||||
=================
|
||||
ConcatVarDec
|
||||
|
||||
Knightmare- this builds out var declaration
|
||||
=================
|
||||
*/
|
||||
void ConcatVarDec (tokenList_t *list, char *str, size_t strSize, int nDims, size_t DimSizes[])
|
||||
{
|
||||
int i;
|
||||
char buf[32];
|
||||
|
||||
if (list->next) {
|
||||
ConcatVarDec (list->next, str, strSize, nDims, DimSizes);
|
||||
}
|
||||
Q_strncatz (str, strSize, list->token.string);
|
||||
for (i = 0; i < nDims; i++) {
|
||||
Com_sprintf (buf, sizeof(buf), "[%d]", DimSizes[i]);
|
||||
Q_strncatz (str, strSize, buf );
|
||||
}
|
||||
Q_strncatz (str, strSize, " " );
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
AddVarName
|
||||
|
||||
Knightmare- this adds structs / vars of a given type
|
||||
=================
|
||||
*/
|
||||
void AddVarName (char *funcname, int nDims, size_t DimSizes[], char *filename, tokenList_t *head)
|
||||
{
|
||||
int i;
|
||||
replacefunc_t *f;
|
||||
tokenList_t *list;
|
||||
|
||||
if ( FindFunctionName(funcname) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
f = (replacefunc_t *) GetMemory(sizeof(replacefunc_t) + (int)strlen(funcname) + 1 + 6 + (int)strlen(filename) + 1);
|
||||
f->name = (char *)f + sizeof(replacefunc_t);
|
||||
Q_strncpyz (f->name, strlen(funcname) + 1, funcname);
|
||||
f->newname = (char *)f + sizeof(replacefunc_t) + strlen(funcname) + 1;
|
||||
Com_sprintf (f->newname, 6, "F%d", numfuncs++);
|
||||
f->filename = (char *)f + sizeof(replacefunc_t) + strlen(funcname) + 1 + strlen(f->newname) + 1;
|
||||
Q_strncpyz (f->filename, strlen(filename) + 1, filename);
|
||||
if (nDims > 0)
|
||||
{
|
||||
f->isArray = 1;
|
||||
f->nArrayDims = min(nDims, MAX_VAR_ARRAY_DIMENSIONS);
|
||||
for (i = 0; i < MAX_VAR_ARRAY_DIMENSIONS; i++) {
|
||||
f->arrayDimSizes[i] = DimSizes[i];
|
||||
}
|
||||
/* printf ("AddVarName: var %s has array size(s) of: ", funcname);
|
||||
for (i = 0; i < f->nArrayDims; i++) {
|
||||
printf ("[%d]", f->arrayDimSizes[i]);
|
||||
}
|
||||
printf ("\n"); */
|
||||
}
|
||||
else {
|
||||
f->isArray = 0;
|
||||
f->nArrayDims = 0;
|
||||
memset (f->arrayDimSizes, 0, sizeof(f->arrayDimSizes));
|
||||
}
|
||||
f->next = replacefuncs;
|
||||
replacefuncs = f;
|
||||
|
||||
// construct the declaration
|
||||
list = head;
|
||||
f->dec[0] = '\0';
|
||||
ConcatVarDec (list, f->dec, sizeof(f->dec), f->nArrayDims, f->arrayDimSizes);
|
||||
}
|
||||
|
||||
/*
|
||||
=================
|
||||
AddTokenToList
|
||||
|
@ -518,18 +639,22 @@ void StripTokenList (tokenList_t *head)
|
|||
|
||||
/*
|
||||
=================
|
||||
GetTypeNamesFromFile
|
||||
GetVarNamesFromFile
|
||||
|
||||
Knightmare- this gets structs / vars of a given type
|
||||
=================
|
||||
*/
|
||||
void GetTypeNamesFromFile (char *filename, char *typeName)
|
||||
void GetVarNamesFromFile (char *filename, char *typeName)
|
||||
{
|
||||
source_t *source;
|
||||
token_t token, lasttoken;
|
||||
int indent = 0;//, brace;
|
||||
token_t token, lastToken, varToken;
|
||||
int indent = 0;
|
||||
int isStatic = 0;
|
||||
int isExtern = 0;
|
||||
int isArray = 0;
|
||||
int sqBracketLevel = 0;
|
||||
int nArrayDims = 0;
|
||||
size_t arrayDimSizes[MAX_VAR_ARRAY_DIMENSIONS] = {0};
|
||||
tokenList_t *listHead;
|
||||
|
||||
listHead = NULL;
|
||||
|
@ -551,6 +676,9 @@ void GetTypeNamesFromFile (char *filename, char *typeName)
|
|||
case ';':
|
||||
isStatic = 0;
|
||||
isExtern = 0;
|
||||
isArray = 0;
|
||||
nArrayDims = 0;
|
||||
memset(arrayDimSizes, 0, sizeof(arrayDimSizes));
|
||||
break;
|
||||
case '{':
|
||||
indent++;
|
||||
|
@ -570,22 +698,66 @@ void GetTypeNamesFromFile (char *filename, char *typeName)
|
|||
if ( token.string[0] == 'e' && !strcmp( token.string, "extern" ) ) {
|
||||
isExtern = 1;
|
||||
}
|
||||
if ( !isStatic && !isExtern && indent == 0 && !strcmp(token.string, typeName) )
|
||||
if ( !isStatic && !isExtern && (indent == 0) && !strcmp(token.string, typeName) ) // type name matches
|
||||
{
|
||||
if ( PC_ReadToken( source, &token ) )
|
||||
if ( PC_ReadToken(source, &token) ) // next token should be var name
|
||||
{
|
||||
if ( token.type == TT_NAME )
|
||||
{
|
||||
memcpy( &varToken, &token, sizeof(token_t) ); // save var name
|
||||
|
||||
// look for array sizes after var name
|
||||
while ( PC_ReadToken(source, &token) )
|
||||
{
|
||||
if ( token.string[0] == ';' ) { // end of declaration
|
||||
break;
|
||||
}
|
||||
// look for array dimensions ( e.g. var[x]... )
|
||||
if ( token.type == TT_PUNCTUATION )
|
||||
{
|
||||
switch ( token.string[0] )
|
||||
{
|
||||
case '[':
|
||||
isArray = 1;
|
||||
sqBracketLevel++;
|
||||
break;
|
||||
case ']':
|
||||
sqBracketLevel--;
|
||||
if ( sqBracketLevel < 0 )
|
||||
sqBracketLevel = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
// set array sizes
|
||||
if ( isArray && (token.type == TT_NUMBER) && (sqBracketLevel == 1) )
|
||||
{
|
||||
if (nArrayDims < MAX_VAR_ARRAY_DIMENSIONS) {
|
||||
arrayDimSizes[nArrayDims] = token.intvalue;
|
||||
nArrayDims++;
|
||||
}
|
||||
else {
|
||||
printf ("Too many array dimensions for var %s in file %s!\n", varToken.string, filename);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (listHead)
|
||||
listHead->next = NULL;
|
||||
listHead = NULL;
|
||||
AddTokenToList( &listHead, &token );
|
||||
AddFunctionName( token.string, filename, listHead );
|
||||
AddTokenToList (&listHead, &varToken);
|
||||
AddVarName (varToken.string, nArrayDims, arrayDimSizes, filename, listHead);
|
||||
// AddTokenToList (&listHead, &token);
|
||||
// AddVarName (token.string, nArrayDims, arrayDimSizes, filename, listHead);
|
||||
|
||||
// reset array sizes
|
||||
isArray = 0;
|
||||
nArrayDims = 0;
|
||||
memset(arrayDimSizes, 0, sizeof(arrayDimSizes));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
memcpy( &lasttoken, &token, sizeof( token_t ) );
|
||||
memcpy( &lastToken, &token, sizeof(token_t) );
|
||||
}
|
||||
FreeSource (source);
|
||||
}
|
||||
|
@ -752,7 +924,7 @@ void main (int argc, char *argv[])
|
|||
}
|
||||
}
|
||||
|
||||
if (argc < 1 || (firstParmSet && firstParm < 1))
|
||||
if ( (argc < 1) || (firstParmSet && firstParm < 1) )
|
||||
Usage ();
|
||||
// end Knightmare
|
||||
|
||||
|
@ -763,7 +935,7 @@ void main (int argc, char *argv[])
|
|||
if ( !(filedata.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) )
|
||||
{
|
||||
if (typeExtract)
|
||||
GetTypeNamesFromFile (filedata.cFileName, typeName);
|
||||
GetVarNamesFromFile (filedata.cFileName, typeName);
|
||||
else
|
||||
GetFunctionNamesFromFile (filedata.cFileName);
|
||||
}
|
||||
|
@ -845,7 +1017,7 @@ int main (int argc, char *argv[])
|
|||
{
|
||||
// printf( "%d: %s\n", i, argv[i] );
|
||||
if (typeExtract)
|
||||
GetTypeNamesFromFile (argv[i], typeName);
|
||||
GetVarNamesFromFile (argv[i], typeName);
|
||||
else
|
||||
GetFunctionNamesFromFile (argv[i]);
|
||||
}
|
||||
|
|
|
@ -1960,8 +1960,7 @@ int PC_EvaluateTokens( source_t *source, token_t *tokens, signed long int *intva
|
|||
v->intvalue = 1;
|
||||
v->floatvalue = 1;
|
||||
} //end if
|
||||
else
|
||||
{
|
||||
else {
|
||||
v->intvalue = 0;
|
||||
v->floatvalue = 0;
|
||||
} //end else
|
||||
|
@ -1970,7 +1969,10 @@ int PC_EvaluateTokens( source_t *source, token_t *tokens, signed long int *intva
|
|||
v->prev = lastvalue;
|
||||
if ( lastvalue ) {
|
||||
lastvalue->next = v;
|
||||
} else { firstvalue = v;}
|
||||
}
|
||||
else {
|
||||
firstvalue = v;
|
||||
}
|
||||
lastvalue = v;
|
||||
if ( brace ) {
|
||||
t = t->next;
|
||||
|
@ -1998,8 +2000,7 @@ int PC_EvaluateTokens( source_t *source, token_t *tokens, signed long int *intva
|
|||
v->intvalue = -(signed int) t->intvalue;
|
||||
v->floatvalue = -t->floatvalue;
|
||||
} //end if
|
||||
else
|
||||
{
|
||||
else {
|
||||
v->intvalue = t->intvalue;
|
||||
v->floatvalue = t->floatvalue;
|
||||
} //end else
|
||||
|
@ -2008,7 +2009,10 @@ int PC_EvaluateTokens( source_t *source, token_t *tokens, signed long int *intva
|
|||
v->prev = lastvalue;
|
||||
if ( lastvalue ) {
|
||||
lastvalue->next = v;
|
||||
} else { firstvalue = v;}
|
||||
}
|
||||
else {
|
||||
firstvalue = v;
|
||||
}
|
||||
lastvalue = v;
|
||||
//last token was a value
|
||||
lastwasvalue = 1;
|
||||
|
@ -2041,7 +2045,7 @@ int PC_EvaluateTokens( source_t *source, token_t *tokens, signed long int *intva
|
|||
t->subtype == P_RSHIFT || t->subtype == P_LSHIFT ||
|
||||
t->subtype == P_BIN_AND || t->subtype == P_BIN_OR ||
|
||||
t->subtype == P_BIN_XOR ) {
|
||||
SourceError( source, "illigal operator %s on floating point operands\n", t->string );
|
||||
SourceError( source, "illegal operator %s on floating point operands\n", t->string );
|
||||
error = 1;
|
||||
break;
|
||||
} //end if
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Loading…
Reference in a new issue