X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Flib.c;h=cfbae0f01918afe9f053d134449c1bec9fc3176e;hb=60149f3ea48a795f9fbb15149e87d3a41aa136bf;hp=f99f58ac705bcb821d03ebe13a3a51ed1e8ad4ac;hpb=6ea2f6040da80c963882f6ccfe4bf21ff048eaff;p=tpg%2Facess2.git diff --git a/Kernel/lib.c b/Kernel/lib.c index f99f58ac..cfbae0f0 100644 --- a/Kernel/lib.c +++ b/Kernel/lib.c @@ -14,15 +14,130 @@ const short DAYS_BEFORE[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 3 #define UNIX_TO_2K ((30*365*3600*24) + (7*3600*24)) //Normal years + leap years // === PROTOTYPES === + int atoi(const char *string); +void itoa(char *buf, Uint num, int base, int minLength, char pad); + int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args); + int sprintf(char *__s, const char *__format, ...); + int tolower(int c); + int strucmp(const char *Str1, const char *Str2); + int strpos(const char *Str, char Ch); + Uint8 ByteSum(void *Ptr, int Size); +size_t strlen(const char *__s); +char *strcpy(char *__str1, const char *__str2); +char *strncpy(char *__str1, const char *__str2, size_t max); + int strcmp(const char *str1, const char *str2); + int strncmp(const char *str1, const char *str2, size_t num); +char *strdup(const char *Str); + int DivUp(int num, int dem); + int strpos8(const char *str, Uint32 Search); int ReadUTF8(Uint8 *str, Uint32 *Val); + int WriteUTF8(Uint8 *str, Uint32 Val); +Sint64 timestamp(int sec, int mins, int hrs, int day, int month, int year); +Uint rand(void); + int CheckString(char *String); + int CheckMem(void *Mem, int NumBytes); + int ModUtil_LookupString(char **Array, char *Needle); + int ModUtil_SetIdent(char *Dest, char *Value); + +// === EXPORTS === +EXPORT(atoi); +EXPORT(itoa); +EXPORT(vsnprintf); +EXPORT(sprintf); +EXPORT(tolower); +EXPORT(strucmp); +EXPORT(strpos); +EXPORT(ByteSum); +EXPORT(strlen); +EXPORT(strcpy); +EXPORT(strncpy); +EXPORT(strcmp); +EXPORT(strncmp); +EXPORT(strdup); +EXPORT(DivUp); +EXPORT(strpos8); +EXPORT(ReadUTF8); +EXPORT(WriteUTF8); +EXPORT(timestamp); +EXPORT(CheckString); +EXPORT(CheckMem); +EXPORT(ModUtil_LookupString); +EXPORT(ModUtil_SetIdent); // === GLOBALS === static Uint giRandomState = RANDOM_SEED; // === CODE === +/** + * \brief Convert a string into an integer + */ +int atoi(const char *string) +{ + int ret = 0; + int bNeg = 0; + + //Log("atoi: (string='%s')", string); + + // Clear non-numeric characters + while( !('0' <= *string && *string <= '9') && *string != '-' ) string++; + if( *string == '-' ) { + bNeg = 1; + while( !('0' <= *string && *string <= '9') ) string++; + } + + if(*string == '0') + { + string ++; + if(*string == 'x') + { + // Hex + string ++; + for( ;; string ++ ) + { + if('0' <= *string && *string <= '9') { + ret *= 16; + ret += *string - '0'; + } + else if('A' <= *string && *string <= 'F') { + ret *= 16; + ret += *string - 'A' + 10; + } + else if('a' <= *string && *string <= 'f') { + ret *= 16; + ret += *string - 'a' + 10; + } + else + break; + } + } + else // Octal + { + for( ; '0' <= *string && *string <= '7'; string ++ ) + { + ret *= 8; + ret += *string - '0'; + } + } + } + else // Decimal + { + for( ; '0' <= *string && *string <= '9'; string++) + { + ret *= 10; + ret += *string - '0'; + } + } + + if(bNeg) ret = -ret; + + //Log("atoi: RETURN %i", ret); + + return ret; +} + static const char cUCDIGITS[] = "0123456789ABCDEF"; /** - * \fn static void itoa(char *buf, Uint num, int base, int minLength, char pad) + * \fn void itoa(char *buf, Uint num, int base, int minLength, char pad) * \brief Convert an integer into a character string */ void itoa(char *buf, Uint num, int base, int minLength, char pad) @@ -55,7 +170,14 @@ void itoa(char *buf, Uint num, int base, int minLength, char pad) buf[i] = 0; } -#define PUTCH(c) do{if(pos==__maxlen)break;if(__s){__s[pos++]=(c);}else{pos++;}}while(0) +/** + * \brief Append a character the the vsnprintf output + */ +#define PUTCH(c) do{\ + char ch=(c);\ + if(pos==__maxlen){return pos;}\ + if(__s){__s[pos++]=ch;}else{pos++;}\ + }while(0) int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args) { char c, pad = ' '; @@ -65,6 +187,10 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args) int isLongLong = 0; Uint64 val; size_t pos = 0; + // Flags + // int bPadLeft = 0; + + //Log("vsnprintf: (__s=%p, __maxlen=%i, __format='%s', ...)", __s, __maxlen, __format); while((c = *__format++) != 0) { @@ -72,6 +198,7 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args) if(c != '%') { PUTCH(c); continue; } c = *__format++; + //Log("pos = %i", pos); // Literal % if(c == '%') { PUTCH('%'); continue; } @@ -87,6 +214,7 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args) // Get Argument val = va_arg(args, Uint); + //Log("val = %x", val); // - Padding if(c == '0') { @@ -157,6 +285,7 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args) case 's': p = (char*)(Uint)val; printString: + //Log("p = '%s'", p); if(!p) p = "(null)"; while(*p) PUTCH(*p++); break; @@ -177,7 +306,6 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args) if(__s && pos != __maxlen) __s[pos] = '\0'; - return pos; } @@ -209,7 +337,7 @@ int tolower(int c) } /** - * \fn int strucmp(char *Str1, char *Str2) + * \fn int strucmp(const char *Str1, const char *Str2) * \brief Compare \a Str1 and \a Str2 case-insensitively */ int strucmp(const char *Str1, const char *Str2) @@ -256,7 +384,7 @@ Uint strlen(const char *__str) } /** - * \fn char *strcpy(const char *__str1, const char *__str2) + * \fn char *strcpy(char *__str1, const char *__str2) * \brief Copy a string to a new location */ char *strcpy(char *__str1, const char *__str2) @@ -268,7 +396,7 @@ char *strcpy(char *__str1, const char *__str2) } /** - * \fn char *strcpy(const char *__str1, const char *__str2) + * \fn char *strncpy(char *__str1, const char *__str2, size_t max) * \brief Copy a string to a new location */ char *strncpy(char *__str1, const char *__str2, size_t max) @@ -486,7 +614,7 @@ Sint64 timestamp(int sec, int mins, int hrs, int day, int month, int year) * \brief Pseudo random number generator * \note Unknown effectiveness (made up on the spot) */ -Uint rand() +Uint rand(void) { Uint old = giRandomState; // Get the next state value @@ -583,17 +711,3 @@ int ModUtil_SetIdent(char *Dest, char *Value) strncpy(Dest, Value, 32); return 1; } - -EXPORT(strlen); -EXPORT(strdup); -EXPORT(strcmp); -EXPORT(strncmp); -EXPORT(strcpy); -EXPORT(strncpy); - -EXPORT(timestamp); -EXPORT(ReadUTF8); -EXPORT(CheckMem); -EXPORT(CheckString); -EXPORT(ModUtil_LookupString); -EXPORT(ModUtil_SetIdent);