// === CONSTANTS ===
#define RANDOM_SEED 0xACE55052
-#define RANDOM_A 0x12231ADE
-#define RANDOM_C 0x1BADBEEF
+#define RANDOM_A 0x00731ADE
+#define RANDOM_C 12345
+#define RANDOM_SPRUCE 0xf12b02b
// Jan Feb Mar Apr May Jun Jul Aug Sept Oct Nov Dec
const short DAYS_BEFORE[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
#define UNIX_TO_2K ((30*365*3600*24) + (7*3600*24)) //Normal years + leap years
// === PROTOTYPES ===
int ReadUTF8(Uint8 *str, Uint32 *Val);
+// === GLOBALS ===
+static Uint giRandomState = RANDOM_SEED;
+
// === CODE ===
static const char cUCDIGITS[] = "0123456789ABCDEF";
/**
*/
int strncmp(char *Str1, char *Str2, size_t num)
{
- while(num-- && *Str1 && *Str1 == *Str2)
+ if(num == 0) return 0; // TODO: Check what should officially happen here
+ while(--num && *Str1 && *Str1 == *Str2)
Str1++, Str2++;
return *Str1-*Str2;
}
+/**
+ * \fn char *strdup(char *str)
+ * \brief Duplicates a string
+ */
+char *strdup(char *str)
+{
+ char *ret;
+ ret = malloc(strlen(str)+1);
+ strcpy(ret, str);
+ return ret;
+}
+
/**
* \fn int strpos8(char *str, Uint32 search)
* \brief Search a string for a UTF-8 character
*/
Uint rand()
{
- #if 0
- static Uint randomState = RANDOM_SEED;
- Uint ret = randomState;
- int roll = randomState & 31;
- randomState = (randomState << roll) | (randomState >> (32-roll));
- randomState ^= 0x9A3C5E78;
- return ret;
- #else
- static Uint randomState = RANDOM_SEED;
- return randomState = (RANDOM_A*randomState + RANDOM_C) & 0xFFFFFFFF;
- #endif
+ Uint old = giRandomState;
+ // Get the next state value
+ giRandomState = (RANDOM_A*giRandomState + RANDOM_C) & 0xFFFFFFFF;
+ // Check if it has changed, and if it hasn't, change it
+ if(giRandomState == old) giRandomState += RANDOM_SPRUCE;
+ return giRandomState;
}
EXPORT(timestamp);