1.1 --- a/core/sm_stringutil.cpp Tue Feb 27 08:32:29 2007 +0000
1.2 +++ b/core/sm_stringutil.cpp Tue Feb 27 21:30:04 2007 +0000
1.3 @@ -22,6 +22,7 @@
1.4
1.5 #define LADJUST 0x00000004 /* left adjustment */
1.6 #define ZEROPAD 0x00000080 /* zero (as opposed to blank) pad */
1.7 +#define UPPERDIGITS 0x00000100 /* make alpha digits uppercase */
1.8 #define to_digit(c) ((c) - '0')
1.9 #define is_digit(c) ((unsigned)to_digit(c) <= 9)
1.10
1.11 @@ -358,6 +359,65 @@
1.12 *buf_p = buf;
1.13 }
1.14
1.15 +void AddHex(char **buf_p, size_t &maxlen, unsigned int val, int width, int flags)
1.16 +{
1.17 + char text[32];
1.18 + int digits;
1.19 + char *buf;
1.20 + char digit;
1.21 + int hexadjust;
1.22 +
1.23 + if (flags & UPPERDIGITS)
1.24 + {
1.25 + hexadjust = 'A' - '9' - 1;
1.26 + } else {
1.27 + hexadjust = 'a' - '9' - 1;
1.28 + }
1.29 +
1.30 + digits = 0;
1.31 + do
1.32 + {
1.33 + digit = ('0' + val % 16);
1.34 + if (digit > '9')
1.35 + {
1.36 + digit += hexadjust;
1.37 + }
1.38 +
1.39 + text[digits++] = digit;
1.40 + val /= 16;
1.41 + } while(val);
1.42 +
1.43 + buf = *buf_p;
1.44 +
1.45 + if (!(flags & LADJUST))
1.46 + {
1.47 + while (digits < width && maxlen)
1.48 + {
1.49 + *buf++ = (flags & ZEROPAD) ? '0' : ' ';
1.50 + width--;
1.51 + maxlen--;
1.52 + }
1.53 + }
1.54 +
1.55 + while (digits-- && maxlen)
1.56 + {
1.57 + *buf++ = text[digits];
1.58 + width--;
1.59 + maxlen--;
1.60 + }
1.61 +
1.62 + if (flags & LADJUST)
1.63 + {
1.64 + while (width-- && maxlen)
1.65 + {
1.66 + *buf++ = (flags & ZEROPAD) ? '0' : ' ';
1.67 + maxlen--;
1.68 + }
1.69 + }
1.70 +
1.71 + *buf_p = buf;
1.72 +}
1.73 +
1.74 size_t gnprintf(char *buffer, size_t maxlen, const char *format, void **args)
1.75 {
1.76 if (!buffer || !maxlen)
1.77 @@ -486,6 +546,21 @@
1.78 arg++;
1.79 break;
1.80 }
1.81 + case 'X':
1.82 + {
1.83 + unsigned int *value = (unsigned int *)args[arg];
1.84 + flags |= UPPERDIGITS;
1.85 + AddHex(&buf_p, llen, *value, width, flags);
1.86 + arg++;
1.87 + break;
1.88 + }
1.89 + case 'x':
1.90 + {
1.91 + unsigned int *value = (unsigned int *)args[arg];
1.92 + AddHex(&buf_p, llen, *value, width, flags);
1.93 + arg++;
1.94 + break;
1.95 + }
1.96 case '%':
1.97 {
1.98 if (!llen)
1.99 @@ -704,6 +779,25 @@
1.100 llen -= res;
1.101 break;
1.102 }
1.103 + case 'X':
1.104 + {
1.105 + CHECK_ARGS(0);
1.106 + cell_t *value;
1.107 + pCtx->LocalToPhysAddr(params[arg], &value);
1.108 + flags |= UPPERDIGITS;
1.109 + AddHex(&buf_p, llen, static_cast<unsigned int>(*value), width, flags);
1.110 + arg++;
1.111 + break;
1.112 + }
1.113 + case 'x':
1.114 + {
1.115 + CHECK_ARGS(0);
1.116 + cell_t *value;
1.117 + pCtx->LocalToPhysAddr(params[arg], &value);
1.118 + AddHex(&buf_p, llen, static_cast<unsigned int>(*value), width, flags);
1.119 + arg++;
1.120 + break;
1.121 + }
1.122 case '%':
1.123 {
1.124 if (!llen)