X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=sidebyside;f=Kernel%2Flib.c;h=3399d3d85ca7af8fb496117c03f09d7eb4c8e170;hb=71d97264ff059a530d86584f690a43831468dc69;hp=c8a0e9f156616a2996067743d341fd91ecf07aed;hpb=d84c449919ed7a288945d043a04802d96daf7047;p=tpg%2Facess2.git diff --git a/Kernel/lib.c b/Kernel/lib.c index c8a0e9f1..3399d3d8 100644 --- a/Kernel/lib.c +++ b/Kernel/lib.c @@ -5,6 +5,10 @@ #include // === CONSTANTS === +#define RANDOM_SEED 0xACE55052 +#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 @@ -12,6 +16,9 @@ const short DAYS_BEFORE[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 3 // === PROTOTYPES === int ReadUTF8(Uint8 *str, Uint32 *Val); +// === GLOBALS === +static Uint giRandomState = RANDOM_SEED; + // === CODE === static const char cUCDIGITS[] = "0123456789ABCDEF"; /** @@ -134,11 +141,24 @@ int strcmp(char *str1, char *str2) */ 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 @@ -293,5 +313,20 @@ Sint64 timestamp(int sec, int mins, int hrs, int day, int month, int year) return stamp * 1000; } +/** + * \fn Uint rand() + * \brief Pseudo random number generator + * \note Unknown effectiveness (made up on the spot) + */ +Uint rand() +{ + 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); EXPORT(ReadUTF8);