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