core/sm_stringutil.cpp
changeset 276 065d151c41b2
parent 274 959c85596341
child 288 d89bf250dac4
     1.1 --- a/core/sm_stringutil.cpp	Sun Jan 07 01:32:08 2007 +0000
     1.2 +++ b/core/sm_stringutil.cpp	Sun Jan 07 08:47:38 2007 +0000
     1.3 @@ -3,18 +3,10 @@
     1.4  #include <stdarg.h>
     1.5  #include "sm_stringutil.h"
     1.6  
     1.7 -#define ALT				0x00000001		/* alternate form */
     1.8 -#define HEXPREFIX		0x00000002		/* add 0x or 0X prefix */
     1.9  #define LADJUST			0x00000004		/* left adjustment */
    1.10 -#define LONGDBL			0x00000008		/* long double */
    1.11 -#define LONGINT			0x00000010		/* long integer */
    1.12 -#define QUADINT			0x00000020		/* quad integer */
    1.13 -#define SHORTINT		0x00000040		/* short integer */
    1.14  #define ZEROPAD			0x00000080		/* zero (as opposed to blank) pad */
    1.15 -#define FPT				0x00000100		/* floating point number */
    1.16  #define to_digit(c)		((c) - '0')
    1.17  #define is_digit(c)		((unsigned)to_digit(c) <= 9)
    1.18 -#define to_char(n)		((n) + '0')
    1.19  
    1.20  //:TODO: fix this macro when we have a debugger
    1.21  
    1.22 @@ -25,6 +17,8 @@
    1.23  	}
    1.24  */
    1.25  
    1.26 +//:TODO: review this code before we choose a license
    1.27 +
    1.28  void AddString(char **buf_p, size_t &maxlen, const char *string, int width, int prec)
    1.29  {
    1.30  	int size = 0;
    1.31 @@ -252,8 +246,180 @@
    1.32  	*buf_p = buf;
    1.33  }
    1.34  
    1.35 +size_t gnprintf(char *buffer, size_t maxlen, const char *format, void **args)
    1.36 +{
    1.37 +	if (!buffer || !maxlen)
    1.38 +	{
    1.39 +		return 0;
    1.40 +	}
    1.41 +
    1.42 +	int arg = 0;
    1.43 +	char *buf_p;
    1.44 +	char ch;
    1.45 +	int flags;
    1.46 +	int width;
    1.47 +	int prec;
    1.48 +	int n;
    1.49 +	char sign;
    1.50 +	const char *fmt;
    1.51 +	size_t llen = maxlen - 1;
    1.52 +
    1.53 +	buf_p = buffer;
    1.54 +	fmt = format;
    1.55 +
    1.56 +	while (true)
    1.57 +	{
    1.58 +		// run through the format string until we hit a '%' or '\0'
    1.59 +		for (ch = *fmt; llen && ((ch = *fmt) != '\0') && (ch != '%'); fmt++)
    1.60 +		{
    1.61 +			*buf_p++ = ch;
    1.62 +			llen--;
    1.63 +		}
    1.64 +		if ((ch == '\0') || (llen <= 0))
    1.65 +		{
    1.66 +			goto done;
    1.67 +		}
    1.68 +
    1.69 +		// skip over the '%'
    1.70 +		fmt++;
    1.71 +
    1.72 +		// reset formatting state
    1.73 +		flags = 0;
    1.74 +		width = 0;
    1.75 +		prec = -1;
    1.76 +		sign = '\0';
    1.77 +
    1.78 +rflag:
    1.79 +		ch = *fmt++;
    1.80 +reswitch:
    1.81 +		switch(ch)
    1.82 +		{
    1.83 +		case '-':
    1.84 +			{
    1.85 +				flags |= LADJUST;
    1.86 +				goto rflag;
    1.87 +			}
    1.88 +		case '.':
    1.89 +			{
    1.90 +				n = 0;
    1.91 +				while(is_digit((ch = *fmt++)))
    1.92 +				{
    1.93 +					n = 10 * n + (ch - '0');
    1.94 +				}
    1.95 +				prec = (n < 0) ? -1 : n;
    1.96 +				goto reswitch;
    1.97 +			}
    1.98 +		case '0':
    1.99 +			{
   1.100 +				flags |= ZEROPAD;
   1.101 +				goto rflag;
   1.102 +			}
   1.103 +		case '1':
   1.104 +		case '2':
   1.105 +		case '3':
   1.106 +		case '4':
   1.107 +		case '5':
   1.108 +		case '6':
   1.109 +		case '7':
   1.110 +		case '8':
   1.111 +		case '9':
   1.112 +			{
   1.113 +				n = 0;
   1.114 +				do
   1.115 +				{
   1.116 +					n = 10 * n + (ch - '0');
   1.117 +					ch = *fmt++;
   1.118 +				} while(is_digit(ch));
   1.119 +				width = n;
   1.120 +				goto reswitch;
   1.121 +			}
   1.122 +		case 'c':
   1.123 +			{
   1.124 +				if (!llen)
   1.125 +				{
   1.126 +					goto done;
   1.127 +				}
   1.128 +				char *c = (char *)args[arg];
   1.129 +				*buf_p++ = *c;
   1.130 +				llen--;
   1.131 +				arg++;
   1.132 +				break;
   1.133 +			}
   1.134 +		case 'd':
   1.135 +		case 'i':
   1.136 +			{
   1.137 +				int *value = (int *)args[arg];
   1.138 +				AddInt(&buf_p, llen, *value, width, flags);
   1.139 +				arg++;
   1.140 +				break;
   1.141 +			}
   1.142 +		case 'u':
   1.143 +			{
   1.144 +				unsigned int *value = (unsigned int *)args[arg];
   1.145 +				AddUInt(&buf_p, llen, *value, width, flags);
   1.146 +				arg++;
   1.147 +				break;
   1.148 +			}
   1.149 +		case 'f':
   1.150 +			{
   1.151 +				float *value = (float *)args[arg];
   1.152 +				AddFloat(&buf_p, llen, *value, width, prec);
   1.153 +				arg++;
   1.154 +				break;
   1.155 +			}
   1.156 +		case 's':
   1.157 +			{
   1.158 +				const char *str = (const char *)args[arg];
   1.159 +				AddString(&buf_p, llen, str, width, prec);
   1.160 +				arg++;
   1.161 +				break;
   1.162 +			}
   1.163 +		case '%':
   1.164 +			{
   1.165 +				if (!llen)
   1.166 +				{
   1.167 +					goto done;
   1.168 +				}
   1.169 +				*buf_p++ = ch;
   1.170 +				llen--;
   1.171 +				break;
   1.172 +			}
   1.173 +		case '\0':
   1.174 +			{
   1.175 +				if (!llen)
   1.176 +				{
   1.177 +					goto done;
   1.178 +				}
   1.179 +				*buf_p++ = '%';
   1.180 +				llen--;
   1.181 +				goto done;
   1.182 +			}
   1.183 +		default:
   1.184 +			{
   1.185 +				if (!llen)
   1.186 +				{
   1.187 +					goto done;
   1.188 +				}
   1.189 +				*buf_p++ = ch;
   1.190 +				llen--;
   1.191 +				break;
   1.192 +			}
   1.193 +		}
   1.194 +	}
   1.195 +
   1.196 +done:
   1.197 +	*buf_p = '\0';
   1.198 +
   1.199 +	return (maxlen - llen - 1);
   1.200 +}
   1.201 +
   1.202  size_t atcprintf(char *buffer, size_t maxlen, const char *format, IPluginContext *pCtx, const cell_t *params, int *param)
   1.203  {
   1.204 +	if (!buffer || !maxlen)
   1.205 +	{
   1.206 +		return 0;
   1.207 +	}
   1.208 +
   1.209  	int arg;
   1.210  	//int args = params[0] / sizeof(cell); //:TODO: wrong, i think params[0] has now the param count not the byte count
   1.211  	// either way this is only used when the above macro is fixed, until then not needed