X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=KernelLand%2FKernel%2Flibc.c;h=ea705795f33c1735d6fb5f3b06fba9b4c9c8075f;hb=ea8e0fad3dfc8bf735d41eedbad2a8e6198059aa;hp=be645a58b01a0fe50a430cd6f7e8a842fd4501dc;hpb=a3228edcd7ab931cd433537f51b0359b67a8fe2a;p=tpg%2Facess2.git diff --git a/KernelLand/Kernel/libc.c b/KernelLand/Kernel/libc.c index be645a58..ea705795 100644 --- a/KernelLand/Kernel/libc.c +++ b/KernelLand/Kernel/libc.c @@ -22,9 +22,6 @@ void itoa(char *buf, Uint64 num, int base, int minLength, char pad); int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args); int snprintf(char *__s, size_t __n, const char *__format, ...); int sprintf(char *__s, const char *__format, ...); -#endif - int tolower(int c); -#if 0 int strucmp(const char *Str1, const char *Str2); char *strchr(const char *__s, int __c); int strpos(const char *Str, char Ch); @@ -49,8 +46,10 @@ EXPORT(vsnprintf); EXPORT(snprintf); EXPORT(sprintf); EXPORT(tolower); + EXPORT(strucmp); EXPORT(strchr); +EXPORT(strrchr); EXPORT(strpos); EXPORT(strlen); EXPORT(strcpy); @@ -185,7 +184,12 @@ void itoa(char *buf, Uint64 num, int base, int minLength, char pad) /** * \brief Append a character the the vsnprintf output */ -#define PUTCH(c) _putch(c) +#define PUTCH(ch) do { \ + if(pos < __maxlen) { \ + if(__s) __s[pos] = ch; \ + } \ + pos ++; \ + } while(0) #define GETVAL() do {\ if(isLongLong) val = va_arg(args, Uint64);\ else val = va_arg(args, unsigned int);\ @@ -204,17 +208,6 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args) size_t pos = 0; // Flags int bPadLeft = 0; - - auto void _putch(char ch); - - void _putch(char ch) - { - if(pos < __maxlen) - { - if(__s) __s[pos] = ch; - pos ++; - } - } while((c = *__format++) != 0) { @@ -417,15 +410,95 @@ int sprintf(char *__s, const char *__format, ...) return ret; } -/** - * \fn int tolower(int c) - * \brief Converts a character to lower case +/* + * ================== + * ctype.h + * ================== */ +int isalnum(int c) +{ + return isalpha(c) || isdigit(c); +} +int isalpha(int c) +{ + return isupper(c) || islower(c); +} +int isascii(int c) +{ + return (0 <= c && c < 128); +} +int isblank(int c) +{ + if(c == '\t') return 1; + if(c == ' ') return 1; + return 0; +} +int iscntrl(int c) +{ + // TODO: Check iscntrl + if(c < ' ') return 1; + return 0; +} +int isdigit(int c) +{ + return ('0' <= c && c <= '9'); +} +int isgraph(int c) +{ + // TODO: Check isgraph + return 0; +} +int islower(int c) +{ + return ('a' <= c && c <= 'z'); +} +int isprint(int c) +{ + if( ' ' <= c && c <= 0x7F ) return 1; + return 0; +} +int ispunct(int c) +{ + switch(c) + { + case '.': case ',': + case '?': case '!': + return 1; + default: + return 0; + } +} +int isspace(int c) +{ + if(c == ' ') return 1; + if(c == '\t') return 1; + if(c == '\v') return 1; + if(c == '\n') return 1; + if(c == '\r') return 1; + return 0; +} +int isupper(int c) +{ + return ('a' <= c && c <= 'z'); +} +int isxdigit(int c) +{ + return isdigit(c) || ('a' <= c && c <= 'f') || ('A' <= c && c <= 'F'); +} + +int toupper(int c) +{ + if( islower(c) ) + return c - 0x20; + else + return c; +} int tolower(int c) { - if('A' <= c && c <= 'Z') - return c - 'A' + 'a'; - return c; + if( isupper(c) ) + return c + 0x20; + else + return c; } /** @@ -451,6 +524,15 @@ char *strchr(const char *__s, int __c) return NULL; } +char *strrchr(const char *__s, int __c) +{ + size_t ofs = strlen(__s); + while(--ofs && __s[ofs] != __c); + if( __s[ofs] == __c ) + return (char*)__s + ofs; + return NULL; +} + /** * \fn int strpos(const char *Str, char Ch) * \brief Search a string for an ascii character @@ -610,7 +692,6 @@ int rand(void) void *memmove(void *__dest, const void *__src, size_t len) { - size_t block_size; char *dest = __dest; const char *src = __src; void *ret = __dest; @@ -627,6 +708,8 @@ void *memmove(void *__dest, const void *__src, size_t len) if( (tVAddr)dest < (tVAddr)src ) return memcpy(dest, src, len); + #if 0 + size_t block_size; if( (tVAddr)dest < (tVAddr)src ) block_size = (tVAddr)src - (tVAddr)dest; else @@ -643,6 +726,13 @@ void *memmove(void *__dest, const void *__src, size_t len) } memcpy(dest, src, len); return ret; + #else + for( int i = len; i--; ) + { + dest[i] = src[i]; + } + return ret; + #endif } @@ -661,7 +751,7 @@ int CheckString(const char *String) addr = (tVAddr)String; - if( !MM_GetPhysAddr( addr ) ) + if( !MM_GetPhysAddr( (void*)addr ) ) return 0; // Check 1st page @@ -673,7 +763,7 @@ int CheckString(const char *String) { if(bUser && !MM_IsUser(addr) ) return 0; - if(!bUser && !MM_GetPhysAddr(addr) ) + if(!bUser && !MM_GetPhysAddr((void*)addr) ) return 0; } addr ++;