X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;ds=sidebyside;f=Kernel%2Flib.c;h=3d91c71c742b59f2cf3eee6a50bb6409c83e131f;hb=77ed20ce9d7e25654215980d0f89e63b8dd366f0;hp=b69bdd0befc61c4cd6e3b3c81df6fd8b9ee53dfa;hpb=db419c7f9e80bdf8382517df999f7605a7740d45;p=tpg%2Facess2.git diff --git a/Kernel/lib.c b/Kernel/lib.c index b69bdd0b..3d91c71c 100644 --- a/Kernel/lib.c +++ b/Kernel/lib.c @@ -8,6 +8,7 @@ #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 @@ -55,7 +56,7 @@ void itoa(char *buf, Uint num, int base, int minLength, char pad) } /** - * \fn int tolower(int __c) + * \fn int tolower(int c) * \brief Converts a character to lower case */ int tolower(int c) @@ -69,7 +70,7 @@ int tolower(int c) * \fn int strucmp(char *Str1, char *Str2) * \brief Compare \a Str1 and \a Str2 case-insensitively */ -int strucmp(char *Str1, char *Str2) +int strucmp(const char *Str1, const char *Str2) { while(*Str1 && tolower(*Str1) == tolower(*Str2)) Str1++, Str2++; @@ -77,10 +78,10 @@ int strucmp(char *Str1, char *Str2) } /** - * \fn int strpos(char *Str, char Ch) + * \fn int strpos(const char *Str, char Ch) * \brief Search a string for an ascii character */ -int strpos(char *Str, char Ch) +int strpos(const char *Str, char Ch) { int pos; for(pos=0;Str[pos];pos++) @@ -91,6 +92,8 @@ int strpos(char *Str, char Ch) } /** + * \fn int ByteSum(void *Ptr, int Size) + * \brief Adds the bytes in a memory region and returns the sum */ int ByteSum(void *Ptr, int Size) { @@ -100,10 +103,10 @@ int ByteSum(void *Ptr, int Size) } /** - * \fn Uint strlen(char *__str) + * \fn Uint strlen(const char *__str) * \brief Get the length of string */ -Uint strlen(char *__str) +Uint strlen(const char *__str) { Uint ret = 0; while(*__str++) ret++; @@ -111,10 +114,10 @@ Uint strlen(char *__str) } /** - * \fn char *strcpy(char *__str1, char *__str2) + * \fn char *strcpy(const char *__str1, const char *__str2) * \brief Copy a string to a new location */ -char *strcpy(char *__str1, char *__str2) +char *strcpy(char *__str1, const char *__str2) { while(*__str2) *__str1++ = *__str2++; @@ -123,11 +126,11 @@ char *strcpy(char *__str1, char *__str2) } /** - * \fn int strcmp(char *str1, char *str2) + * \fn int strcmp(const char *str1, const char *str2) * \brief Compare two strings return the difference between * the first non-matching characters. */ -int strcmp(char *str1, char *str2) +int strcmp(const char *str1, const char *str2) { while(*str1 && *str1 == *str2) str1++, str2++; @@ -135,33 +138,45 @@ int strcmp(char *str1, char *str2) } /** - * \fn int strncmp(char *Str1, char *Str2, size_t num) + * \fn int strncmp(const char *Str1, const char *Str2, size_t num) * \brief Compare strings \a Str1 and \a Str2 to a maximum of \a num characters */ -int strncmp(char *Str1, char *Str2, size_t num) +int strncmp(const char *Str1, const 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) + * \fn char *strdup(const char *Str) * \brief Duplicates a string */ -char *strdup(char *str) +char *strdup(const char *Str) { char *ret; - ret = malloc(strlen(str)+1); - strcpy(ret, str); + ret = malloc(strlen(Str)+1); + strcpy(ret, Str); return ret; } /** - * \fn int strpos8(char *str, Uint32 search) + * \fn int DivUp(int num, int dem) + * \brief Divide two numbers, rounding up + * \param num Numerator + * \param dem Denominator + */ +int DivUp(int num, int dem) +{ + return (num+dem-1)/dem; +} + +/** + * \fn int strpos8(const char *str, Uint32 search) * \brief Search a string for a UTF-8 character */ -int strpos8(char *str, Uint32 Search) +int strpos8(const char *str, Uint32 Search) { int pos; Uint32 val = 0; @@ -318,17 +333,12 @@ Sint64 timestamp(int sec, int mins, int hrs, int day, int month, int year) */ Uint rand() { - #if 0 - Uint ret = giRandomState; - int roll = randomState & 31; - randomState = (randomState << roll) | (randomState >> (32-roll)); - randomState ^= 0x9A3C5E78; - return ret; - #else + Uint old = giRandomState; + // Get the next state value giRandomState = (RANDOM_A*giRandomState + RANDOM_C) & 0xFFFFFFFF; - Log("giRandomState = 0x%x", giRandomState); + // Check if it has changed, and if it hasn't, change it + if(giRandomState == old) giRandomState += RANDOM_SPRUCE; return giRandomState; - #endif } EXPORT(timestamp);