core/sm_stringutil.cpp
changeset 544 69b2b24500e2
parent 535 f255342d132f
child 591 86e97f3eda1f
     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)