aboutsummaryrefslogtreecommitdiffstats
path: root/code/tools/asm
diff options
context:
space:
mode:
authortma <tma@edf5b092-35ff-0310-97b2-ce42778d08ea>2005-11-15 17:02:45 +0000
committertma <tma@edf5b092-35ff-0310-97b2-ce42778d08ea>2005-11-15 17:02:45 +0000
commit7d46a6d0fa3057d997fde6e4263a90cff8c32867 (patch)
tree4e7dd0e101eb37a4f8ef4890ce04c033464af8ee /code/tools/asm
parentb0380a16a5f433c24749d2b80d72002dc0f5303e (diff)
downloadioquake3-aero-7d46a6d0fa3057d997fde6e4263a90cff8c32867.tar.gz
ioquake3-aero-7d46a6d0fa3057d997fde6e4263a90cff8c32867.zip
Potential fix to https://bugzilla.icculus.org/show_bug.cgi?id=2486
git-svn-id: svn://svn.icculus.org/quake3/trunk@358 edf5b092-35ff-0310-97b2-ce42778d08ea
Diffstat (limited to 'code/tools/asm')
-rw-r--r--code/tools/asm/q3asm.c51
1 files changed, 21 insertions, 30 deletions
diff --git a/code/tools/asm/q3asm.c b/code/tools/asm/q3asm.c
index 6ff45a8..93af582 100644
--- a/code/tools/asm/q3asm.c
+++ b/code/tools/asm/q3asm.c
@@ -24,11 +24,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
#include "mathlib.h"
#include "../../qcommon/qfiles.h"
-/* MSVC-ism fix. */
-#ifdef _WIN32
-#define atoi(s) strtoul(s,NULL,10)
-#endif
-
/* 19079 total symbols in FI, 2002 Jan 23 */
#define DEFAULT_HASHTABLE_SIZE 2048
@@ -425,32 +420,33 @@ sort_symbols ()
}
-
+#ifdef _MSC_VER
+#define INT64 __int64
+#define atoi64 _atoi64
+#else
+#define INT64 long long int
+#define atoi64 atoll
+#endif
/*
Problem:
- BYTE values are specified as signed decimal string.
- A properly functional atoi() will cap large signed values at 0x7FFFFFFF.
- Negative word values are often specified as very large decimal values by lcc.
- Therefore, values that should be between 0x7FFFFFFF and 0xFFFFFFFF come out as 0x7FFFFFFF when using atoi().
- Bad.
+ BYTE values are specified as signed decimal string. A properly functional
+ atoip() will cap large signed values at 0x7FFFFFFF. Negative word values are
+ often specified as very large decimal values by lcc. Therefore, values that
+ should be between 0x7FFFFFFF and 0xFFFFFFFF come out as 0x7FFFFFFF when using
+ atoi(). Bad.
This function is one big evil hack to work around this problem.
*/
-/* FIXME: Find out maximum token length for VC++ -PH */
-int
-ThingToConvertDecimalIntoSigned32SoThatAtoiDoesntCapAt7FFFFFFF (const char *s)
+int atoiNoCap (const char *s)
{
- /* Variable `l' should be an integer variant larger than 32 bits.
- On gnu-x86, "long long" is 64 bits. -PH
- */
- long long int l;
+ INT64 l;
union {
unsigned int u;
signed int i;
} retval;
- l = atoll(s);
+ l = atoi64(s);
/* Now smash to signed 32 bits accordingly. */
if (l < 0) {
retval.i = (int)l;
@@ -460,11 +456,6 @@ ThingToConvertDecimalIntoSigned32SoThatAtoiDoesntCapAt7FFFFFFF (const char *s)
return retval.i; /* <- union hackage. I feel dirty with this. -PH */
}
-/* Programmer Attribute #1: laziness */
-#ifndef _WIN32
-#define atoi ThingToConvertDecimalIntoSigned32SoThatAtoiDoesntCapAt7FFFFFFF
-#endif
-
/*
@@ -734,7 +725,7 @@ ParseValue
*/
int ParseValue( void ) {
Parse();
- return atoi( token );
+ return atoiNoCap( token );
}
@@ -764,7 +755,7 @@ int ParseExpression(void) {
case '-':
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
- v = atoi(sym);
+ v = atoiNoCap(sym);
break;
default:
v = LookupSymbol(sym);
@@ -784,10 +775,10 @@ int ParseExpression(void) {
switch (token[i]) {
case '+':
- v += atoi(sym);
+ v += atoiNoCap(sym);
break;
case '-':
- v -= atoi(sym);
+ v -= atoiNoCap(sym);
break;
}
@@ -1087,7 +1078,7 @@ STAT("EQU");
Parse();
strcpy( name, token );
Parse();
- DefineSymbol( name, atoi(token) );
+ DefineSymbol( name, atoiNoCap(token) );
return 1;
}
return 0;
@@ -1580,7 +1571,7 @@ Assemble LCC bytecode assembly to Q3VM bytecode.\n\
Error("-b requires an argument");
}
i++;
- symtablelen = atoi(argv[i]);
+ symtablelen = atoiNoCap(argv[i]);
continue;
}