diff --git a/src/xpdev/xpprintf.c b/src/xpdev/xpprintf.c index 5970b4a3c01c62e11efb2ec35f3dd8cc0ef34185..dce15253090f9085ea552f2f507bbece899a7344 100644 --- a/src/xpdev/xpprintf.c +++ b/src/xpdev/xpprintf.c @@ -53,6 +53,7 @@ char *xp_asprintf_next(char *format, int type, ...) int modifier=0; char *fmt_start; int correct_type=0; + char num_str[128]; /* More than enough room for a 256-bit int */ /* * Find the next non %% format, leaving %% as it is @@ -391,7 +392,429 @@ char *xp_asprintf_next(char *format, int type, ...) type=type & ~XP_PRINTF_CONVERT; if(type != correct_type) { switch(correct_type) { - + case XP_PRINTF_TYPE_INT: + switch(type) { + case XP_PRINTF_TYPE_INT: + i=i; + break; + case XP_PRINTF_TYPE_UINT: + i=ui; + break; + case XP_PRINTF_TYPE_LONG: + i=l; + break; + case XP_PRINTF_TYPE_ULONG: + i=ul; + break; + case XP_PRINTF_TYPE_LONGLONG: + i=ll; + break; + case XP_PRINTF_TYPE_ULONGLONG: + i=ull; + break; + case XP_PRINTF_TYPE_CHARP: + i=strtol(cp, NULL, 0); + break; + case XP_PRINTF_TYPE_DOUBLE: + i=d; + break; + case XP_PRINTF_TYPE_LONGDOUBLE: + i=ld; + break; + case XP_PRINTF_TYPE_VOIDP: + i=(int)pntr; + break; + case XP_PRINTF_TYPE_SIZET: + i=s; + break; + } + break; + case XP_PRINTF_TYPE_UINT: + switch(type) { + case XP_PRINTF_TYPE_INT: + ui=i; + break; + case XP_PRINTF_TYPE_UINT: + ui=ui; + break; + case XP_PRINTF_TYPE_LONG: + ui=l; + break; + case XP_PRINTF_TYPE_ULONG: + ui=ul; + break; + case XP_PRINTF_TYPE_LONGLONG: + ui=ll; + break; + case XP_PRINTF_TYPE_ULONGLONG: + ui=ull; + break; + case XP_PRINTF_TYPE_CHARP: + ui=strtoul(cp, NULL, 0); + break; + case XP_PRINTF_TYPE_DOUBLE: + ui=d; + break; + case XP_PRINTF_TYPE_LONGDOUBLE: + ui=ld; + break; + case XP_PRINTF_TYPE_VOIDP: + ui=(unsigned int)pntr; + break; + case XP_PRINTF_TYPE_SIZET: + ui=s; + break; + } + break; + case XP_PRINTF_TYPE_LONG: + switch(type) { + case XP_PRINTF_TYPE_INT: + l=i; + break; + case XP_PRINTF_TYPE_UINT: + l=ui; + break; + case XP_PRINTF_TYPE_LONG: + l=l; + break; + case XP_PRINTF_TYPE_ULONG: + l=ul; + break; + case XP_PRINTF_TYPE_LONGLONG: + l=ll; + break; + case XP_PRINTF_TYPE_ULONGLONG: + l=ull; + break; + case XP_PRINTF_TYPE_CHARP: + l=strtol(cp, NULL, 0); + break; + case XP_PRINTF_TYPE_DOUBLE: + l=d; + break; + case XP_PRINTF_TYPE_LONGDOUBLE: + l=ld; + break; + case XP_PRINTF_TYPE_VOIDP: + l=(long)pntr; + break; + case XP_PRINTF_TYPE_SIZET: + l=s; + break; + } + break; + case XP_PRINTF_TYPE_ULONG: + switch(type) { + case XP_PRINTF_TYPE_INT: + ul=i; + break; + case XP_PRINTF_TYPE_UINT: + ul=ui; + break; + case XP_PRINTF_TYPE_LONG: + ul=l; + break; + case XP_PRINTF_TYPE_ULONG: + ul=ul; + break; + case XP_PRINTF_TYPE_LONGLONG: + ul=ll; + break; + case XP_PRINTF_TYPE_ULONGLONG: + ul=ull; + break; + case XP_PRINTF_TYPE_CHARP: + ul=strtoul(cp, NULL, 0); + break; + case XP_PRINTF_TYPE_DOUBLE: + ul=d; + break; + case XP_PRINTF_TYPE_LONGDOUBLE: + ul=ld; + break; + case XP_PRINTF_TYPE_VOIDP: + ul=(unsigned long)pntr; + break; + case XP_PRINTF_TYPE_SIZET: + ul=s; + break; + } + break; + case XP_PRINTF_TYPE_LONGLONG: + switch(type) { + case XP_PRINTF_TYPE_INT: + ll=i; + break; + case XP_PRINTF_TYPE_UINT: + ll=ui; + break; + case XP_PRINTF_TYPE_LONG: + ll=l; + break; + case XP_PRINTF_TYPE_ULONG: + ll=ul; + break; + case XP_PRINTF_TYPE_LONGLONG: + ll=ll; + break; + case XP_PRINTF_TYPE_ULONGLONG: + ll=ull; + break; + case XP_PRINTF_TYPE_CHARP: + ll=strtoll(cp, NULL, 0); + break; + case XP_PRINTF_TYPE_DOUBLE: + ll=d; + break; + case XP_PRINTF_TYPE_LONGDOUBLE: + ll=ld; + break; + case XP_PRINTF_TYPE_VOIDP: + ll=(long long)pntr; + break; + case XP_PRINTF_TYPE_SIZET: + ll=s; + break; + } + break; + case XP_PRINTF_TYPE_ULONGLONG: + switch(type) { + case XP_PRINTF_TYPE_INT: + ull=i; + break; + case XP_PRINTF_TYPE_UINT: + ull=ui; + break; + case XP_PRINTF_TYPE_LONG: + ull=l; + break; + case XP_PRINTF_TYPE_ULONG: + ull=ul; + break; + case XP_PRINTF_TYPE_LONGLONG: + ull=ll; + break; + case XP_PRINTF_TYPE_ULONGLONG: + ull=ull; + break; + case XP_PRINTF_TYPE_CHARP: + ull=strtoull(cp, NULL, 0); + break; + case XP_PRINTF_TYPE_DOUBLE: + ull=d; + break; + case XP_PRINTF_TYPE_LONGDOUBLE: + ull=ld; + break; + case XP_PRINTF_TYPE_VOIDP: + ull=(unsigned long long int)pntr; + break; + case XP_PRINTF_TYPE_SIZET: + ull=s; + break; + } + break; + case XP_PRINTF_TYPE_CHARP: + num_str[0]=0; + switch(type) { + case XP_PRINTF_TYPE_INT: + sprintf(num_str, "%d", i); + cp=num_str; + break; + case XP_PRINTF_TYPE_UINT: + sprintf(num_str, "%u", i); + cp=num_str; + break; + case XP_PRINTF_TYPE_LONG: + sprintf(num_str, "%ld", l); + cp=num_str; + break; + case XP_PRINTF_TYPE_ULONG: + sprintf(num_str, "%lu", ul); + cp=num_str; + break; + case XP_PRINTF_TYPE_LONGLONG: + /* ToDo MSVC doesn't like this */ + sprintf(num_str, "%lld", ll); + cp=num_str; + break; + case XP_PRINTF_TYPE_ULONGLONG: + /* ToDo MSVC doesn't like this */ + sprintf(num_str, "%llu", ull); + cp=num_str; + break; + case XP_PRINTF_TYPE_CHARP: + cp=cp; + break; + case XP_PRINTF_TYPE_DOUBLE: + sprintf(num_str, "%f", d); + cp=num_str; + break; + case XP_PRINTF_TYPE_LONGDOUBLE: + sprintf(num_str, "%Lf", d); + cp=num_str; + break; + case XP_PRINTF_TYPE_VOIDP: + /* ToDo: Or should this pretend it's a char *? */ + sprintf(num_str, "%p", pntr); + cp=num_str; + break; + case XP_PRINTF_TYPE_SIZET: + sprintf(num_str, "%zu", s); + cp=num_str; + break; + } + break; + case XP_PRINTF_TYPE_DOUBLE: + switch(type) { + case XP_PRINTF_TYPE_INT: + d=i; + break; + case XP_PRINTF_TYPE_UINT: + d=ui; + break; + case XP_PRINTF_TYPE_LONG: + d=l; + break; + case XP_PRINTF_TYPE_ULONG: + d=ul; + break; + case XP_PRINTF_TYPE_LONGLONG: + d=ll; + break; + case XP_PRINTF_TYPE_ULONGLONG: + d=ull; + break; + case XP_PRINTF_TYPE_CHARP: + d=strtod(cp, NULL); + break; + case XP_PRINTF_TYPE_DOUBLE: + d=d; + break; + case XP_PRINTF_TYPE_LONGDOUBLE: + d=ld; + break; + case XP_PRINTF_TYPE_VOIDP: + d=(double)((long int)pntr); + break; + case XP_PRINTF_TYPE_SIZET: + d=s; + break; + } + break; + case XP_PRINTF_TYPE_LONGDOUBLE: + switch(type) { + case XP_PRINTF_TYPE_INT: + ld=i; + break; + case XP_PRINTF_TYPE_UINT: + ld=ui; + break; + case XP_PRINTF_TYPE_LONG: + ld=l; + break; + case XP_PRINTF_TYPE_ULONG: + ld=ul; + break; + case XP_PRINTF_TYPE_LONGLONG: + ld=ll; + break; + case XP_PRINTF_TYPE_ULONGLONG: + ld=ull; + break; + case XP_PRINTF_TYPE_CHARP: + /* strtold() isn't ubiquitous yet */ + ld=strtod(cp, NULL); + break; + case XP_PRINTF_TYPE_DOUBLE: + ld=d; + break; + case XP_PRINTF_TYPE_LONGDOUBLE: + ld=ld; + break; + case XP_PRINTF_TYPE_VOIDP: + ld=(long double)((long int)pntr); + break; + case XP_PRINTF_TYPE_SIZET: + ld=s; + break; + } + break; + case XP_PRINTF_TYPE_VOIDP: + /* ToDo: this is nasty... */ + switch(type) { + case XP_PRINTF_TYPE_INT: + pntr=(void *)i; + break; + case XP_PRINTF_TYPE_UINT: + pntr=(void *)ui; + break; + case XP_PRINTF_TYPE_LONG: + pntr=(void *)l; + break; + case XP_PRINTF_TYPE_ULONG: + pntr=(void *)ul; + break; + case XP_PRINTF_TYPE_LONGLONG: + pntr=(void *)ll; + break; + case XP_PRINTF_TYPE_ULONGLONG: + pntr=(void *)ull; + break; + case XP_PRINTF_TYPE_CHARP: + pntr=(void *)cp; + break; + case XP_PRINTF_TYPE_DOUBLE: + pntr=(void *)(long int)d; + break; + case XP_PRINTF_TYPE_LONGDOUBLE: + pntr=(void *)(long int)ld; + break; + case XP_PRINTF_TYPE_VOIDP: + pntr=pntr; + break; + case XP_PRINTF_TYPE_SIZET: + pntr=(void *)s; + break; + } + break; + case XP_PRINTF_TYPE_SIZET: + switch(type) { + case XP_PRINTF_TYPE_INT: + s=i; + break; + case XP_PRINTF_TYPE_UINT: + s=ui; + break; + case XP_PRINTF_TYPE_LONG: + s=l; + break; + case XP_PRINTF_TYPE_ULONG: + s=ul; + break; + case XP_PRINTF_TYPE_LONGLONG: + s=ll; + break; + case XP_PRINTF_TYPE_ULONGLONG: + s=ull; + break; + case XP_PRINTF_TYPE_CHARP: + s=strtoll(cp, NULL, 0); + break; + case XP_PRINTF_TYPE_DOUBLE: + s=d; + break; + case XP_PRINTF_TYPE_LONGDOUBLE: + s=ld; + break; + case XP_PRINTF_TYPE_VOIDP: + s=(size_t)pntr; + break; + case XP_PRINTF_TYPE_SIZET: + s=s; + break; + } + break; } } } @@ -419,7 +842,10 @@ char *xp_asprintf_next(char *format, int type, ...) j=sprintf(entry_buf, this_format, ull); break; case XP_PRINTF_TYPE_CHARP: - j=sprintf(entry_buf, this_format, cp); + if(cp==NULL) + j=sprintf(entry_buf, this_format, "<null>"); + else + j=sprintf(entry_buf, this_format, cp); break; case XP_PRINTF_TYPE_DOUBLE: j=sprintf(entry_buf, this_format, d);