From 5cccd9a242c3d66453e6ee31ec64cad5de468351 Mon Sep 17 00:00:00 2001 From: Scott Ehlert Date: Tue, 27 Feb 2007 21:30:04 +0000 Subject: [PATCH] Added hex format specifier (%X and %x) --HG-- extra : convert_revision : svn%3A39bc706e-5318-0410-9160-8a85361fbb7c/trunk%40550 --- core/sm_stringutil.cpp | 94 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 94 insertions(+) diff --git a/core/sm_stringutil.cpp b/core/sm_stringutil.cpp index 47abe741..3720da97 100644 --- a/core/sm_stringutil.cpp +++ b/core/sm_stringutil.cpp @@ -22,6 +22,7 @@ #define LADJUST 0x00000004 /* left adjustment */ #define ZEROPAD 0x00000080 /* zero (as opposed to blank) pad */ +#define UPPERDIGITS 0x00000100 /* make alpha digits uppercase */ #define to_digit(c) ((c) - '0') #define is_digit(c) ((unsigned)to_digit(c) <= 9) @@ -358,6 +359,65 @@ void AddInt(char **buf_p, size_t &maxlen, int val, int width, int flags) *buf_p = buf; } +void AddHex(char **buf_p, size_t &maxlen, unsigned int val, int width, int flags) +{ + char text[32]; + int digits; + char *buf; + char digit; + int hexadjust; + + if (flags & UPPERDIGITS) + { + hexadjust = 'A' - '9' - 1; + } else { + hexadjust = 'a' - '9' - 1; + } + + digits = 0; + do + { + digit = ('0' + val % 16); + if (digit > '9') + { + digit += hexadjust; + } + + text[digits++] = digit; + val /= 16; + } while(val); + + buf = *buf_p; + + if (!(flags & LADJUST)) + { + while (digits < width && maxlen) + { + *buf++ = (flags & ZEROPAD) ? '0' : ' '; + width--; + maxlen--; + } + } + + while (digits-- && maxlen) + { + *buf++ = text[digits]; + width--; + maxlen--; + } + + if (flags & LADJUST) + { + while (width-- && maxlen) + { + *buf++ = (flags & ZEROPAD) ? '0' : ' '; + maxlen--; + } + } + + *buf_p = buf; +} + size_t gnprintf(char *buffer, size_t maxlen, const char *format, void **args) { if (!buffer || !maxlen) @@ -486,6 +546,21 @@ reswitch: arg++; break; } + case 'X': + { + unsigned int *value = (unsigned int *)args[arg]; + flags |= UPPERDIGITS; + AddHex(&buf_p, llen, *value, width, flags); + arg++; + break; + } + case 'x': + { + unsigned int *value = (unsigned int *)args[arg]; + AddHex(&buf_p, llen, *value, width, flags); + arg++; + break; + } case '%': { if (!llen) @@ -704,6 +779,25 @@ reswitch: llen -= res; break; } + case 'X': + { + CHECK_ARGS(0); + cell_t *value; + pCtx->LocalToPhysAddr(params[arg], &value); + flags |= UPPERDIGITS; + AddHex(&buf_p, llen, static_cast(*value), width, flags); + arg++; + break; + } + case 'x': + { + CHECK_ARGS(0); + cell_t *value; + pCtx->LocalToPhysAddr(params[arg], &value); + AddHex(&buf_p, llen, static_cast(*value), width, flags); + arg++; + break; + } case '%': { if (!llen)