EXPORT(UnHex);
EXPORT(SwapEndian16);
EXPORT(SwapEndian32);
+EXPORT(memmove);
// === CODE ===
/**
{
char tmpBuf[64+1];
int pos=0, i;
+ Uint64 rem;
// Sanity check
if(!buf) return;
// Convert
while(num > base-1) {
- tmpBuf[pos] = cUCDIGITS[ num % base ];
- num /= (Uint)base; // Shift `num` right 1 digit
+ num = DivMod64U(num, base, &rem); // Shift `num` and get remainder
+ tmpBuf[pos] = cUCDIGITS[ rem ];
pos++;
}
- tmpBuf[pos++] = cUCDIGITS[ num % base ]; // Last digit of `num`
+ tmpBuf[pos++] = cUCDIGITS[ num ]; // Last digit of `num`
// Put in reverse
i = 0;
}
itoa(tmpBuf, val, 10, minSize, pad);
goto printString;
- case 'u':
+ case 'u': // Unsigned
GETVAL();
itoa(tmpBuf, val, 10, minSize, pad);
goto printString;
- case 'X':
+ case 'P': // Physical Address
+ PUTCH('0');
+ PUTCH('x');
+ if(sizeof(tPAddr) > 4) isLongLong = 1;
+ GETVAL();
+ itoa(tmpBuf, val, 16, minSize, pad);
+ goto printString;
+ case 'X': // Hex
if(BITS == 64)
isLongLong = 1; // TODO: Handle non-x86 64-bit archs
GETVAL();
itoa(tmpBuf, val, 16, minSize, pad);
goto printString;
- case 'x':
+ case 'x': // Lower case hex
GETVAL();
itoa(tmpBuf, val, 16, minSize, pad);
goto printString;
- case 'o':
+ case 'o': // Octal
GETVAL();
itoa(tmpBuf, val, 8, minSize, pad);
goto printString;
// String - Null Terminated Array
case 's':
p = va_arg(args, char*); // Get Argument
- if( !CheckString(p) ) p = "(inval)"; // Avoid #PFs
+ if( !p || !CheckString(p) ) p = "(inval)"; // Avoid #PFs
printString:
if(!p) p = "(null)";
len = strlen(p);
char *strcat(char *__dest, const char *__src)
{
while(*__dest++);
+ __dest--;
while(*__src)
*__dest++ = *__src++;
*__dest = '\0';
/**
* \brief Convert a string of hexadecimal digits into a byte stream
*/
-int UnHex(Uint8 *Dest, size_t DestSize, const char *SourceString)
+int UnHex(Uint8 *Dest, size_t DestSize, const char *SourceString)
{
int i;
{
return ((Val&0xFF)<<24) | ((Val&0xFF00)<<8) | ((Val>>8)&0xFF00) | ((Val>>24)&0xFF);
}
+
+void *memmove(void *__dest, const void *__src, size_t len)
+{
+ size_t block_size;
+ char *dest = __dest;
+ const char *src = __src;
+ void *ret = __dest;
+
+ if( (tVAddr)dest > (tVAddr)src + len )
+ return memcpy(dest, src, len);
+ if( (tVAddr)dest + len < (tVAddr)src )
+ return memcpy(dest, src, len);
+
+ if( (tVAddr)dest < (tVAddr)src )
+ block_size = (tVAddr)src - (tVAddr)dest;
+ else
+ block_size = (tVAddr)dest - (tVAddr)src;
+
+ block_size &= ~0xF;
+
+ while(len >= block_size)
+ {
+ memcpy(dest, src, block_size);
+ len -= block_size;
+ dest += block_size;
+ src += block_size;
+ }
+ memcpy(dest, src, len);
+ return ret;
+
+}
+