diff -r 81670bcf543e -r 065d151c41b2 core/sm_stringutil.cpp --- a/core/sm_stringutil.cpp Sun Jan 07 01:32:08 2007 +0000 +++ b/core/sm_stringutil.cpp Sun Jan 07 08:47:38 2007 +0000 @@ -3,18 +3,10 @@ #include #include "sm_stringutil.h" -#define ALT 0x00000001 /* alternate form */ -#define HEXPREFIX 0x00000002 /* add 0x or 0X prefix */ #define LADJUST 0x00000004 /* left adjustment */ -#define LONGDBL 0x00000008 /* long double */ -#define LONGINT 0x00000010 /* long integer */ -#define QUADINT 0x00000020 /* quad integer */ -#define SHORTINT 0x00000040 /* short integer */ #define ZEROPAD 0x00000080 /* zero (as opposed to blank) pad */ -#define FPT 0x00000100 /* floating point number */ #define to_digit(c) ((c) - '0') #define is_digit(c) ((unsigned)to_digit(c) <= 9) -#define to_char(n) ((n) + '0') //:TODO: fix this macro when we have a debugger @@ -25,6 +17,8 @@ } */ +//:TODO: review this code before we choose a license + void AddString(char **buf_p, size_t &maxlen, const char *string, int width, int prec) { int size = 0; @@ -252,8 +246,180 @@ *buf_p = buf; } +size_t gnprintf(char *buffer, size_t maxlen, const char *format, void **args) +{ + if (!buffer || !maxlen) + { + return 0; + } + + int arg = 0; + char *buf_p; + char ch; + int flags; + int width; + int prec; + int n; + char sign; + const char *fmt; + size_t llen = maxlen - 1; + + buf_p = buffer; + fmt = format; + + while (true) + { + // run through the format string until we hit a '%' or '\0' + for (ch = *fmt; llen && ((ch = *fmt) != '\0') && (ch != '%'); fmt++) + { + *buf_p++ = ch; + llen--; + } + if ((ch == '\0') || (llen <= 0)) + { + goto done; + } + + // skip over the '%' + fmt++; + + // reset formatting state + flags = 0; + width = 0; + prec = -1; + sign = '\0'; + +rflag: + ch = *fmt++; +reswitch: + switch(ch) + { + case '-': + { + flags |= LADJUST; + goto rflag; + } + case '.': + { + n = 0; + while(is_digit((ch = *fmt++))) + { + n = 10 * n + (ch - '0'); + } + prec = (n < 0) ? -1 : n; + goto reswitch; + } + case '0': + { + flags |= ZEROPAD; + goto rflag; + } + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + { + n = 0; + do + { + n = 10 * n + (ch - '0'); + ch = *fmt++; + } while(is_digit(ch)); + width = n; + goto reswitch; + } + case 'c': + { + if (!llen) + { + goto done; + } + char *c = (char *)args[arg]; + *buf_p++ = *c; + llen--; + arg++; + break; + } + case 'd': + case 'i': + { + int *value = (int *)args[arg]; + AddInt(&buf_p, llen, *value, width, flags); + arg++; + break; + } + case 'u': + { + unsigned int *value = (unsigned int *)args[arg]; + AddUInt(&buf_p, llen, *value, width, flags); + arg++; + break; + } + case 'f': + { + float *value = (float *)args[arg]; + AddFloat(&buf_p, llen, *value, width, prec); + arg++; + break; + } + case 's': + { + const char *str = (const char *)args[arg]; + AddString(&buf_p, llen, str, width, prec); + arg++; + break; + } + case '%': + { + if (!llen) + { + goto done; + } + *buf_p++ = ch; + llen--; + break; + } + case '\0': + { + if (!llen) + { + goto done; + } + *buf_p++ = '%'; + llen--; + goto done; + } + default: + { + if (!llen) + { + goto done; + } + *buf_p++ = ch; + llen--; + break; + } + } + } + +done: + *buf_p = '\0'; + + return (maxlen - llen - 1); +} + size_t atcprintf(char *buffer, size_t maxlen, const char *format, IPluginContext *pCtx, const cell_t *params, int *param) { + if (!buffer || !maxlen) + { + return 0; + } + int arg; //int args = params[0] / sizeof(cell); //:TODO: wrong, i think params[0] has now the param count not the byte count // either way this is only used when the above macro is fixed, until then not needed