Merge branch 'master' of git://localhost/acess2
[tpg/acess2.git] / KernelLand / Kernel / libc.c
index be645a5..58c2e1a 100644 (file)
 #define        RANDOM_SPRUCE   0xf12b039
 
 // === PROTOTYPES ===
+unsigned long long     strtoull(const char *str, char **end, int base);
+unsigned long  strtoul(const char *str, char **end, int base);
+signed long long       strtoll(const char *str, char **end, int base);
+signed long    strtol(const char *str, char **end, int base);
 #if 0
  int   atoi(const char *string);
  int   ParseInt(const char *string, int *Val);
@@ -22,9 +26,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 +50,10 @@ EXPORT(vsnprintf);
 EXPORT(snprintf);
 EXPORT(sprintf);
 EXPORT(tolower);
+
 EXPORT(strucmp);
 EXPORT(strchr);
+EXPORT(strrchr);
 EXPORT(strpos);
 EXPORT(strlen);
 EXPORT(strcpy);
@@ -68,15 +71,10 @@ EXPORT(CheckString);
 EXPORT(CheckMem);
 
 // === CODE ===
-/**
- * \brief Convert a string into an integer
- */
-int atoi(const char *string)
-{
-       int ret = 0;
-       ParseInt(string, &ret);
-       return ret;
-}
+// - Import userland stroi.c file
+#define _LIB_H_
+#include "../../Usermode/Libraries/libc.so_src/strtoi.c"
+
 int ParseInt(const char *string, int *Val)
 {
         int    ret = 0;
@@ -185,7 +183,14 @@ 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; \
+               } else { \
+                       (void)ch;\
+               } \
+               pos ++; \
+       } while(0)
 #define GETVAL()       do {\
        if(isLongLong)  val = va_arg(args, Uint64);\
        else    val = va_arg(args, unsigned int);\
@@ -204,17 +209,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)
        {
@@ -231,8 +225,14 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args)
                if(c == 'p') {
                        Uint    ptr = va_arg(args, Uint);
                        PUTCH('*');     PUTCH('0');     PUTCH('x');
-                       for( len = BITS/4; len --; )
-                               PUTCH( cUCDIGITS[ (ptr>>(len*4))&15 ] );
+                       for( len = BITS/4; len -- && ((ptr>>(len*4))&15) == 0; )
+                               ;
+                       len ++;
+                       if( len == 0 )
+                               PUTCH( '0' );
+                       else
+                               while( len -- )
+                                       PUTCH( cUCDIGITS[ (ptr>>(len*4))&15 ] );
                        continue ;
                }
                
@@ -362,7 +362,7 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args)
                        if(!p)          p = "(null)";
                        len = strlen(p);
                        if( !bPadLeft ) while(len++ < minSize)  PUTCH(pad);
-                       while(*p && precision--)        PUTCH(*p++);
+                       while(*p && precision--) { PUTCH(*p); p++;} 
                        if( bPadLeft )  while(len++ < minSize)  PUTCH(pad);
                        break;
                
@@ -370,7 +370,10 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args)
                        p = va_arg(args, char*);
                        if( !CheckMem(p, minSize) )     continue;       // No #PFs please
                        if(!p)  goto printString;
-                       while(minSize--)        PUTCH(*p++);
+                       while(minSize--) {
+                               PUTCH(*p);
+                               p ++;
+                       }
                        break;
                
                // Single Character
@@ -417,15 +420,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 +534,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 +702,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 +718,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,10 +736,18 @@ 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
        
 }
 
-// NOTE: Strictly not libc, but lib.c is used by userland code too
+// NOTE: Strictly not libc, but lib.c is used by userland code too and hence these two
+// can't be in it.
 /**
  * \name Memory Validation
  * \{
@@ -661,7 +762,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 +774,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 ++;

UCC git Repository :: git.ucc.asn.au