CON stuff

git-svn-id: https://svn.eduke32.com/eduke32@1436 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
terminx 2009-06-19 01:10:10 +00:00
parent cc58eafd29
commit 64f4c975c2
5 changed files with 3710 additions and 3654 deletions

View file

@ -29,10 +29,6 @@ DEALINGS IN THE SOFTWARE.
#ifndef NEDMALLOC_H #ifndef NEDMALLOC_H
#define NEDMALLOC_H #define NEDMALLOC_H
#ifndef UNREFERENCED_PARAMETER
#define UNREFERENCED_PARAMETER(x) x=x
#endif
/* See malloc.c.h for what each function does. /* See malloc.c.h for what each function does.
REPLACE_SYSTEM_ALLOCATOR causes nedalloc's functions to be called malloc, REPLACE_SYSTEM_ALLOCATOR causes nedalloc's functions to be called malloc,

View file

@ -34,7 +34,7 @@ DEALINGS IN THE SOFTWARE.
/*#define FULLSANITYCHECKS*/ /*#define FULLSANITYCHECKS*/
#include "nedmalloc.h" #include "nedmalloc.h"
#ifdef WIN32 #ifdef _WIN32
#include <malloc.h> #include <malloc.h>
#include <stddef.h> #include <stddef.h>
#endif #endif

View file

@ -489,6 +489,7 @@ const char *keyw[] =
"getarraysize", // 343 "getarraysize", // 343
"savenn", // 344 "savenn", // 344
"copy", // 345 "copy", // 345
"<null>", // 346 internal inversion function
"<null>" "<null>"
}; };
@ -1896,6 +1897,24 @@ static int32_t C_GetNextValue(int32_t type)
return 0; // literal value return 0; // literal value
} }
static inline int32_t C_IntPow2(int32_t v)
{
return ((v!=0) && (v&(v-1))==0);
}
static inline uint32_t C_Pow2IntLogBase2(int32_t v)
{
static const uint32_t b[] = {0xAAAAAAAA, 0xCCCCCCCC, 0xF0F0F0F0,
0xFF00FF00, 0xFFFF0000};
register uint32_t r = (v & b[0]) != 0;
int32_t i = 4;
for (; i > 0; i--)
r |= ((v & b[i]) != 0) << i;
return r;
}
static int32_t C_CheckMalformedBranch(intptr_t lastScriptPtr) static int32_t C_CheckMalformedBranch(intptr_t lastScriptPtr)
{ {
switch (C_GetKeyword()) switch (C_GetKeyword())
@ -1904,6 +1923,7 @@ static int32_t C_CheckMalformedBranch(intptr_t lastScriptPtr)
case CON_ENDA: case CON_ENDA:
case CON_ENDEVENT: case CON_ENDEVENT:
case CON_ENDS: case CON_ENDS:
case CON_ELSE:
g_scriptPtr = lastScriptPtr + &script[0]; g_scriptPtr = lastScriptPtr + &script[0];
g_ifElseAborted = 1; g_ifElseAborted = 1;
C_ReportError(-1); C_ReportError(-1);
@ -3884,17 +3904,44 @@ static int32_t C_ParseCommand(void)
case CON_SHIFTVARL: case CON_SHIFTVARL:
case CON_SHIFTVARR: case CON_SHIFTVARR:
// syntax: [rand|add|set]var <var1> <const1> {
// sets var1 to const1 intptr_t *inst = g_scriptPtr-1;
// adds const1 to var1 (const1 can be negative...) char *tptr = textptr;
//printf("Found [add|set]var at line= %d\n",g_lineNumber); // syntax: [rand|add|set]var <var1> <const1>
// sets var1 to const1
// adds const1 to var1 (const1 can be negative...)
//printf("Found [add|set]var at line= %d\n",g_lineNumber);
// get the ID of the DEF // get the ID of the DEF
if (tw != CON_ZSHOOT && tw != CON_EZSHOOT) if (tw != CON_ZSHOOT && tw != CON_EZSHOOT)
C_GetNextVarType(GAMEVAR_READONLY); C_GetNextVarType(GAMEVAR_READONLY);
else C_GetNextVar(); else C_GetNextVar();
C_GetNextValue(LABEL_DEFINE); // the number to check against... C_GetNextValue(LABEL_DEFINE); // the number to check against...
if (tw == CON_DIVVAR || (tw == CON_MULVAR && *(g_scriptPtr-1) > 0))
{
int32_t i = *(g_scriptPtr-1);
j = klabs(*(g_scriptPtr-1));
if (C_IntPow2(j))
{
*inst = ((tw == CON_DIVVAR) ? CON_SHIFTVARR : CON_SHIFTVARL);
*(g_scriptPtr-1) = C_Pow2IntLogBase2(j);
// initprintf("%s:%d: replacing multiply/divide with shift\n",g_szScriptFileName,g_lineNumber);
if (i == j)
return 0;
*g_scriptPtr++ = CON_INV + (g_lineNumber<<12);
textptr = tptr;
C_GetNextVarType(GAMEVAR_READONLY);
C_GetNextValue(LABEL_DEFINE);
g_scriptPtr--;
// initprintf("%s:%d: adding inversion\n",g_szScriptFileName,g_lineNumber);
}
}
}
return 0; return 0;
case CON_WRITEARRAYTOFILE: case CON_WRITEARRAYTOFILE:
case CON_READARRAYFROMFILE: case CON_READARRAYFROMFILE:

View file

@ -903,6 +903,7 @@ enum ScriptKeywords_t
CON_GETARRAYSIZE, // 343 CON_GETARRAYSIZE, // 343
CON_SAVENN, // 344 CON_SAVENN, // 344
CON_COPY, // 345 CON_COPY, // 345
CON_INV, // 346
CON_END CON_END
}; };
#endif #endif

File diff suppressed because it is too large Load diff