diff --git a/src/sbbs3/js_sprintf.c b/src/sbbs3/js_sprintf.c index 8f898a1e3d46d8451f5c180e47956eb342906c5a..3b93012d6c66efa7f2454f4ce7adbc251823adc7 100644 --- a/src/sbbs3/js_sprintf.c +++ b/src/sbbs3/js_sprintf.c @@ -39,15 +39,25 @@ js_sprintf(JSContext *cx, uint argn, uintN argc, jsval *argv) p=op; p=xp_asprintf_start(p); - for(; argn<argc; argn++) { - if(JSVAL_IS_DOUBLE(argv[argn])) - p=xp_asprintf_next(p,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_DOUBLE,JSVAL_TO_DOUBLE(argv[argn])); - else if(JSVAL_IS_INT(argv[argn])) - p=xp_asprintf_next(p,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_INT,JSVAL_TO_INT(argv[argn])); - else if(JSVAL_IS_BOOLEAN(argv[argn]) && xp_printf_get_type(p)!=XP_PRINTF_TYPE_CHARP) - p=xp_asprintf_next(p,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_INT,JSVAL_TO_BOOLEAN(argv[argn])); + int cur = 0; + for (;;) { + int next = xp_printf_get_next(p); + if (next < 0) + break; + if (next > 0 && next != (cur + 1)) + cur = next; + else + cur++; + if (cur > argc) + break; + if(JSVAL_IS_DOUBLE(argv[cur])) + p=xp_asprintf_next(p,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_DOUBLE,JSVAL_TO_DOUBLE(argv[cur])); + else if(JSVAL_IS_INT(argv[cur])) + p=xp_asprintf_next(p,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_INT,JSVAL_TO_INT(argv[cur])); + else if(JSVAL_IS_BOOLEAN(argv[cur]) && xp_printf_get_type(p)!=XP_PRINTF_TYPE_CHARP) + p=xp_asprintf_next(p,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_INT,JSVAL_TO_BOOLEAN(argv[cur])); else { - JSVALUE_TO_RASTRING(cx, argv[argn], p2, &p2_sz, NULL); + JSVALUE_TO_RASTRING(cx, argv[cur], p2, &p2_sz, NULL); if(JS_IsExceptionPending(cx)) JS_ClearPendingException(cx); if(p2==NULL) { diff --git a/src/xpdev/xpprintf.c b/src/xpdev/xpprintf.c index e7fdca0d88148eeb7a4e785d63f2939b5f7903cf..af459876c3ba2929c355aba3fb48d7985fb9ab41 100644 --- a/src/xpdev/xpprintf.c +++ b/src/xpdev/xpprintf.c @@ -19,6 +19,8 @@ * Note: If this box doesn't appear square, then you need to fix your tabs. * ****************************************************************************/ +#if !defined(__BORLANDC__) + #if defined(__linux__) && !defined(_GNU_SOURCE) #define _GNU_SOURCE // asprintf() on Linux #endif @@ -75,12 +77,8 @@ struct arg_table_entry { unsigned uint_type; long long_type; unsigned long ulong_type; -#if defined(XP_PRINTF_TYPE_LONGLONG) long long longlong_type; -#endif -#if defined(XP_PRINTF_TYPE_ULONGLONG) unsigned long long ulonglong_type; -#endif char *charp_type; double double_type; long double longdouble_type; @@ -294,11 +292,9 @@ int xp_printf_get_type(const char *format) case 'l': correct_type=XP_PRINTF_TYPE_LONG; break; -#if defined(XP_PRINTF_TYPE_ULONGLONG) case 'l'|'l'<<8: correct_type=XP_PRINTF_TYPE_LONGLONG; break; -#endif case 'j': correct_type=XP_PRINTF_TYPE_INTMAX; break; @@ -331,11 +327,9 @@ int xp_printf_get_type(const char *format) case 'l': correct_type=XP_PRINTF_TYPE_ULONG; break; -#if defined(XP_PRINTF_TYPE_ULONGLONG) case 'l'|'l'<<8: correct_type=XP_PRINTF_TYPE_ULONGLONG; break; -#endif case 'j': correct_type=XP_PRINTF_TYPE_UINTMAX; break; @@ -449,10 +443,8 @@ char* xp_asprintf_next(char *format, int type, ...) unsigned int ui=0; long int l=0; unsigned long int ul=0; -#if defined(XP_PRINTF_TYPE_LONGLONG) long long int ll=0; unsigned long long int ull=0; -#endif double d=0; long double ld=0; char* cp=NULL; @@ -693,11 +685,9 @@ char* xp_asprintf_next(char *format, int type, ...) case 'l': correct_type=XP_PRINTF_TYPE_LONG; break; -#if defined(XP_PRINTF_TYPE_LONGLONG) case 'l'|'l'<<8: correct_type=XP_PRINTF_TYPE_LONGLONG; break; -#endif case 'j': correct_type=XP_PRINTF_TYPE_INTMAX; break; @@ -730,11 +720,9 @@ char* xp_asprintf_next(char *format, int type, ...) case 'l': correct_type=XP_PRINTF_TYPE_ULONG; break; -#if defined(XP_PRINTF_TYPE_LONGLONG) case 'l'|'l'<<8: correct_type=XP_PRINTF_TYPE_ULONGLONG; break; -#endif case 'j': correct_type=XP_PRINTF_TYPE_UINTMAX; break; @@ -825,14 +813,12 @@ char* xp_asprintf_next(char *format, int type, ...) case XP_PRINTF_TYPE_ULONG: ul=va_arg(vars, unsigned long int); break; -#if defined(XP_PRINTF_TYPE_LONGLONG) case XP_PRINTF_TYPE_LONGLONG: ll=va_arg(vars, long long int); break; case XP_PRINTF_TYPE_ULONGLONG: ull=va_arg(vars, unsigned long long int); break; -#endif case XP_PRINTF_TYPE_CHARP: cp=va_arg(vars, char*); break; @@ -866,14 +852,12 @@ char* xp_asprintf_next(char *format, int type, ...) case XP_PRINTF_TYPE_ULONG: i=ul; break; -#if defined(XP_PRINTF_TYPE_LONGLONG) case XP_PRINTF_TYPE_LONGLONG: i=ll; break; case XP_PRINTF_TYPE_ULONGLONG: i=ull; break; -#endif case XP_PRINTF_TYPE_CHARP: if(cp) i=*cp; @@ -908,14 +892,12 @@ char* xp_asprintf_next(char *format, int type, ...) case XP_PRINTF_TYPE_ULONG: i=ul; break; -#if defined(XP_PRINTF_TYPE_LONGLONG) case XP_PRINTF_TYPE_LONGLONG: i=ll; break; case XP_PRINTF_TYPE_ULONGLONG: i=ull; break; -#endif case XP_PRINTF_TYPE_CHARP: if (cp) i=strtol(cp, NULL, 0); @@ -948,14 +930,12 @@ char* xp_asprintf_next(char *format, int type, ...) case XP_PRINTF_TYPE_ULONG: ui=ul; break; -#if defined(XP_PRINTF_TYPE_LONGLONG) case XP_PRINTF_TYPE_LONGLONG: ui=ll; break; case XP_PRINTF_TYPE_ULONGLONG: ui=ull; break; -#endif case XP_PRINTF_TYPE_CHARP: if (cp) ui=strtoul(cp, NULL, 0); @@ -988,14 +968,12 @@ char* xp_asprintf_next(char *format, int type, ...) case XP_PRINTF_TYPE_ULONG: l=ul; break; -#if defined(XP_PRINTF_TYPE_LONGLONG) case XP_PRINTF_TYPE_LONGLONG: l=ll; break; case XP_PRINTF_TYPE_ULONGLONG: l=ull; break; -#endif case XP_PRINTF_TYPE_CHARP: if (cp) l=strtol(cp, NULL, 0); @@ -1028,14 +1006,12 @@ char* xp_asprintf_next(char *format, int type, ...) case XP_PRINTF_TYPE_LONG: ul=l; break; -#if defined(XP_PRINTF_TYPE_LONGLONG) case XP_PRINTF_TYPE_LONGLONG: ul=ll; break; case XP_PRINTF_TYPE_ULONGLONG: ul=ull; break; -#endif case XP_PRINTF_TYPE_CHARP: if (cp) ul=strtoul(cp, NULL, 0); @@ -1056,7 +1032,6 @@ char* xp_asprintf_next(char *format, int type, ...) break; } break; -#if defined(XP_PRINTF_TYPE_LONGLONG) case XP_PRINTF_TYPE_LONGLONG: switch(type) { case XP_PRINTF_TYPE_CHAR: @@ -1133,7 +1108,6 @@ char* xp_asprintf_next(char *format, int type, ...) break; } break; -#endif case XP_PRINTF_TYPE_CHARP: num_str[0]=0; switch(type) { @@ -1154,7 +1128,6 @@ char* xp_asprintf_next(char *format, int type, ...) sprintf(num_str, "%lu", ul); cp=num_str; break; -#if defined(XP_PRINTF_TYPE_LONGLONG) case XP_PRINTF_TYPE_LONGLONG: /* ToDo MSVC doesn't like this */ sprintf(num_str, "%lld", ll); @@ -1165,7 +1138,6 @@ char* xp_asprintf_next(char *format, int type, ...) sprintf(num_str, "%llu", ull); cp=num_str; break; -#endif case XP_PRINTF_TYPE_DOUBLE: sprintf(num_str, "%f", d); cp=num_str; @@ -1200,14 +1172,12 @@ char* xp_asprintf_next(char *format, int type, ...) case XP_PRINTF_TYPE_ULONG: d=ul; break; -#if defined(XP_PRINTF_TYPE_LONGLONG) case XP_PRINTF_TYPE_LONGLONG: d=ll; break; case XP_PRINTF_TYPE_ULONGLONG: d=ull; break; -#endif case XP_PRINTF_TYPE_CHARP: if (cp) d=strtod(cp, NULL); @@ -1240,21 +1210,15 @@ char* xp_asprintf_next(char *format, int type, ...) case XP_PRINTF_TYPE_ULONG: ld=ul; break; -#if defined(XP_PRINTF_TYPE_LONGLONG) case XP_PRINTF_TYPE_LONGLONG: ld=ll; break; case XP_PRINTF_TYPE_ULONGLONG: ld=ull; break; -#endif case XP_PRINTF_TYPE_CHARP: if (cp) -#if defined(__BORLANDC__) - ld=strtod(cp, NULL); -#else ld=strtold(cp, NULL); -#endif else ld = 0.0L; break; @@ -1285,14 +1249,12 @@ char* xp_asprintf_next(char *format, int type, ...) case XP_PRINTF_TYPE_ULONG: pntr=(void *)((uintptr_t)ul); break; -#if defined(XP_PRINTF_TYPE_LONGLONG) case XP_PRINTF_TYPE_LONGLONG: pntr=(void *)((intptr_t)ll); break; case XP_PRINTF_TYPE_ULONGLONG: pntr=(void *)((uintptr_t)ull); break; -#endif case XP_PRINTF_TYPE_CHARP: pntr=(void *)(cp); break; @@ -1322,21 +1284,15 @@ char* xp_asprintf_next(char *format, int type, ...) case XP_PRINTF_TYPE_ULONG: s=ul; break; -#if defined(XP_PRINTF_TYPE_LONGLONG) case XP_PRINTF_TYPE_LONGLONG: s=ll; break; case XP_PRINTF_TYPE_ULONGLONG: s=ull; break; -#endif case XP_PRINTF_TYPE_CHARP: if (cp) -#if defined(__BORLANDC__) - s=strtoul(cp, NULL, 0); -#else s=strtoull(cp, NULL, 0); -#endif else s = 0; break; @@ -1374,14 +1330,12 @@ char* xp_asprintf_next(char *format, int type, ...) case XP_PRINTF_TYPE_ULONG: j=asprintf(&entry, fmt_nofield, ul); break; -#if defined(XP_PRINTF_TYPE_LONGLONG) case XP_PRINTF_TYPE_LONGLONG: j=asprintf(&entry, fmt_nofield, ll); break; case XP_PRINTF_TYPE_ULONGLONG: j=asprintf(&entry, fmt_nofield, ull); break; -#endif case XP_PRINTF_TYPE_CHARP: if(cp==NULL) j=asprintf(&entry, fmt_nofield, "<null>"); @@ -1590,16 +1544,12 @@ build_arg_table(const char *format, va_list va) case XP_PRINTF_TYPE_ULONG: ret[i].ulong_type = va_arg(wva, unsigned long); break; -#ifdef XP_PRINTF_TYPE_LONGLONG case XP_PRINTF_TYPE_LONGLONG: ret[i].longlong_type = va_arg(wva, long long); break; -#endif -#ifdef XP_PRINTF_TYPE_ULONGLONG case XP_PRINTF_TYPE_ULONGLONG: ret[i].ulonglong_type = va_arg(wva, unsigned long long); break; -#endif case XP_PRINTF_TYPE_CHARP: ret[i].charp_type = va_arg(wva, char *); break; @@ -1680,14 +1630,12 @@ char* xp_vasprintf(const char *format, va_list va) case XP_PRINTF_TYPE_ULONG: next=xp_asprintf_next(working, type, va_arg(wva, unsigned long)); break; - #if defined(XP_PRINTF_TYPE_LONGLONG) case XP_PRINTF_TYPE_LONGLONG: next=xp_asprintf_next(working, type, va_arg(wva, long long)); break; case XP_PRINTF_TYPE_ULONGLONG: next=xp_asprintf_next(working, type, va_arg(wva, unsigned long long)); break; - #endif case XP_PRINTF_TYPE_CHARP: next=xp_asprintf_next(working, type, va_arg(wva, char *)); break; @@ -1735,16 +1683,12 @@ char* xp_vasprintf(const char *format, va_list va) case XP_PRINTF_TYPE_ULONG: next=xp_asprintf_next(working, type, atable[curpos - 1].ulong_type); break; -#if defined(XP_PRINTF_TYPE_LONGLONG) case XP_PRINTF_TYPE_LONGLONG: next=xp_asprintf_next(working, type, atable[curpos - 1].longlong_type); break; -#endif -#if defined(XP_PRINTF_TYPE_ULONGLONG) case XP_PRINTF_TYPE_ULONGLONG: next=xp_asprintf_next(working, type, atable[curpos - 1].ulonglong_type); break; -#endif case XP_PRINTF_TYPE_CHARP: next=xp_asprintf_next(working, type, atable[curpos - 1].charp_type); break; @@ -1799,9 +1743,7 @@ int main(int argc, char *argv[]) char *format; char *p; int i,j; -#if defined(XP_PRINTF_TYPE_LONGLONG) long long L; -#endif long l; char *cp; double d; @@ -1844,12 +1786,10 @@ int main(int argc, char *argv[]) l=atol(argv[j]+1); p=xp_asprintf_next(format,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_LONG,l); break; -#if defined(XP_PRINTF_TYPE_LONGLONG) case 'L': L=strtoll(argv[j]+1, NULL, 10); p=xp_asprintf_next(format,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_LONGLONG,L); break; -#endif case 's': cp=argv[j]+1; p=xp_asprintf_next(format,XP_PRINTF_CONVERT|XP_PRINTF_TYPE_CHARP,cp); @@ -1867,3 +1807,5 @@ int main(int argc, char *argv[]) } #endif + +#endif diff --git a/src/xpdev/xpprintf.h b/src/xpdev/xpprintf.h index ed9114ddc8781e5a2142cee461a723d31e315dfd..fbc090a489eb2494d3c93e945ed7f077e2689121 100644 --- a/src/xpdev/xpprintf.h +++ b/src/xpdev/xpprintf.h @@ -22,6 +22,8 @@ #ifndef _XPPRINTF_H_ #define _XPPRINTF_H_ +#if !defined(__BORLANDC__) + #include <stdarg.h> #include "wrapdll.h" @@ -36,10 +38,8 @@ #define XP_PRINTF_TYPE_USHORT XP_PRINTF_TYPE_UINT #define XP_PRINTF_TYPE_LONG 4 #define XP_PRINTF_TYPE_ULONG 5 -#if !defined(__BORLANDC__) - #define XP_PRINTF_TYPE_LONGLONG 6 - #define XP_PRINTF_TYPE_ULONGLONG 7 -#endif +#define XP_PRINTF_TYPE_LONGLONG 6 +#define XP_PRINTF_TYPE_ULONGLONG 7 #define XP_PRINTF_TYPE_CHARP 8 #define XP_PRINTF_TYPE_DOUBLE 9 #define XP_PRINTF_TYPE_FLOAT XP_PRINTF_TYPE_DOUBLE /* Floats are promoted to doubles */ @@ -61,6 +61,7 @@ DLLEXPORT char* xp_asprintf_next(char *format, int type, ...); DLLEXPORT char* xp_asprintf_end(char *format, size_t *endlen); DLLEXPORT char* xp_asprintf(const char *format, ...); DLLEXPORT char* xp_vasprintf(const char *format, va_list va); +DLLEXPORT int xp_printf_get_next(char *format); DLLEXPORT int xp_printf_get_type(const char *format); #if defined(_MSC_VER) || defined(__MSVCRT__) || defined(__BORLANDC__) DLLEXPORT int vasprintf(char **strptr, const char *format, va_list va); @@ -72,3 +73,5 @@ DLLEXPORT int asprintf(char **strptr, const char *format, ...); #endif #endif + +#endif