Composite commit (GUI / Networking)
[tpg/acess2.git] / Kernel / lib.c
index 2ce5c98..66c9660 100644 (file)
@@ -27,7 +27,7 @@ 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);
+char   *_strdup(const char *File, int Line, const char *Str);
 char   **str_split(const char *__str, char __ch);
  int   strpos8(const char *str, Uint32 Search);
  int   ReadUTF8(Uint8 *str, Uint32 *Val);
@@ -54,7 +54,8 @@ EXPORT(strcpy);
 EXPORT(strncpy);
 EXPORT(strcmp);
 EXPORT(strncmp);
-EXPORT(strdup);
+//EXPORT(strdup);
+EXPORT(_strdup);       // Takes File/Line too
 EXPORT(str_split);
 EXPORT(strpos8);
 EXPORT(DivUp);
@@ -177,6 +178,10 @@ void itoa(char *buf, Uint num, int base, int minLength, char pad)
        if(pos==__maxlen){return pos;}\
        if(__s){__s[pos++]=ch;}else{pos++;}\
        }while(0)
+#define GETVAL()       do {\
+       if(isLongLong)  val = va_arg(args, Uint64);\
+       else    val = va_arg(args, unsigned int);\
+       }while(0)
 /**
  * \brief VArg String Number Print Formatted
  */
@@ -214,9 +219,6 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args)
                        goto printString;
                }
                
-               // Get Argument
-               val = va_arg(args, Uint);
-               
                // - Padding Side Flag
                if(c == '+') {
                        bPadLeft = 1;
@@ -233,8 +235,7 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args)
                
                // - Minimum length
                if(c == '*') {  // Dynamic length
-                       minSize = val;
-                       val = va_arg(args, Uint);
+                       minSize = va_arg(args, unsigned int);
                        c = *__format++;
                }
                else if('1' <= c && c <= '9')
@@ -256,9 +257,6 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args)
                {
                        c = *__format++;
                        if(c == 'l') {
-                               #if BITS == 32
-                               val |= (Uint64)va_arg(args, Uint) << 32;
-                               #endif
                                c = *__format++;
                                isLongLong = 1;
                        }
@@ -270,6 +268,7 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args)
                {
                case 'd':
                case 'i':
+                       GETVAL();
                        if( isLongLong && val >> 63 ) {
                                PUTCH('-');
                                val = -val;
@@ -281,26 +280,39 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args)
                        itoa(p, val, 10, minSize, pad);
                        goto printString;
                case 'u':
+                       GETVAL();
                        itoa(p, val, 10, minSize, pad);
                        goto printString;
+               case 'X':
+                       #if BITS == 64
+                       isLongLong = 1; // TODO: Handle non-x86 64-bit archs
+                       #endif
+                       GETVAL();
+                       itoa(p, val, 16, minSize, pad);
+                       goto printString;
+                       
                case 'x':
+                       GETVAL();
                        itoa(p, val, 16, minSize, pad);
                        goto printString;
                case 'o':
+                       GETVAL();
                        itoa(p, val, 8, minSize, pad);
                        goto printString;
                case 'b':
+                       GETVAL();
                        itoa(p, val, 2, minSize, pad);
                        goto printString;
 
                case 'B':       //Boolean
+                       val = va_arg(args, unsigned int);
                        if(val) p = "True";
                        else    p = "False";
                        goto printString;
                
                // String - Null Terminated Array
                case 's':
-                       p = (char*)(tVAddr)val;
+                       p = va_arg(args, char*);        // Get Argument
                printString:
                        if(!p)          p = "(null)";
                        len = strlen(p);
@@ -310,7 +322,7 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args)
                        break;
                
                case 'C':       // Non-Null Terminated Character Array
-                       p = (char*)(tVAddr)val;
+                       p = va_arg(args, char*);
                        if(!p)  goto printString;
                        while(minSize--)        PUTCH(*p++);
                        break;
@@ -318,6 +330,7 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args)
                // Single Character
                case 'c':
                default:
+                       GETVAL();
                        PUTCH( (Uint8)val );
                        break;
                }
@@ -451,6 +464,7 @@ int strncmp(const char *Str1, const char *Str2, size_t num)
        return *Str1-*Str2;
 }
 
+#if 0
 /**
  * \fn char *strdup(const char *Str)
  * \brief Duplicates a string
@@ -459,9 +473,25 @@ char *strdup(const char *Str)
 {
        char    *ret;
        ret = malloc(strlen(Str)+1);
+       if( !ret )      return NULL;
+       strcpy(ret, Str);
+       return ret;
+}
+#else
+
+/**
+ * \fn char *_strdup(const char *File, int Line, const char *Str)
+ * \brief Duplicates a string
+ */
+char *_strdup(const char *File, int Line, const char *Str)
+{
+       char    *ret;
+       ret = Heap_Allocate(File, Line, strlen(Str)+1);
+       if( !ret )      return NULL;
        strcpy(ret, Str);
        return ret;
 }
+#endif
 
 /**
  * \brief Split a string using the passed character

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