X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Kernel%2Flib.c;h=cfbae0f01918afe9f053d134449c1bec9fc3176e;hb=2e19f113bc68fd38f59d469b213d251ee50e314d;hp=62500fe9d40de9e06938bf5f7605767fbae3edb9;hpb=bd8dc898108f10c0498f4dc5d0164a50b5ff2e5c;p=tpg%2Facess2.git diff --git a/Kernel/lib.c b/Kernel/lib.c index 62500fe9..cfbae0f0 100644 --- a/Kernel/lib.c +++ b/Kernel/lib.c @@ -74,9 +74,16 @@ static Uint giRandomState = RANDOM_SEED; 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++; + while( !('0' <= *string && *string <= '9') && *string != '-' ) string++; + if( *string == '-' ) { + bNeg = 1; + while( !('0' <= *string && *string <= '9') ) string++; + } if(*string == '0') { @@ -85,32 +92,34 @@ int atoi(const char *string) { // Hex string ++; - for( ;; ) { - ret *= 16; - if('0' <= *string && *string <= '9') + for( ;; string ++ ) + { + if('0' <= *string && *string <= '9') { + ret *= 16; ret += *string - '0'; - else if('A' <= *string && *string <= 'F') + } + else if('A' <= *string && *string <= 'F') { + ret *= 16; ret += *string - 'A' + 10; - else if('a' <= *string && *string <= 'f') + } + else if('a' <= *string && *string <= 'f') { + ret *= 16; ret += *string - 'a' + 10; + } else break; - string ++; } } - else + else // Octal { - for( ;; ) + for( ; '0' <= *string && *string <= '7'; string ++ ) { ret *= 8; - if('0' <= *string && *string <= '7') - ret += *string - '0'; - else - break; + ret += *string - '0'; } } } - else + else // Decimal { for( ; '0' <= *string && *string <= '9'; string++) { @@ -118,6 +127,11 @@ int atoi(const char *string) ret += *string - '0'; } } + + if(bNeg) ret = -ret; + + //Log("atoi: RETURN %i", ret); + return ret; } @@ -156,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 = ' '; @@ -166,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) { @@ -173,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; } @@ -188,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') { @@ -258,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; @@ -274,14 +302,10 @@ int vsnprintf(char *__s, size_t __maxlen, const char *__format, va_list args) PUTCH( (Uint8)val ); break; } - - if(pos == __maxlen) - break; } if(__s && pos != __maxlen) __s[pos] = '\0'; - return pos; }