aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/mprintf.c59
1 files changed, 32 insertions, 27 deletions
diff --git a/lib/mprintf.c b/lib/mprintf.c
index 3a83cf001..1e5235769 100644
--- a/lib/mprintf.c
+++ b/lib/mprintf.c
@@ -325,7 +325,13 @@ static long dprintf_Pass1(const char *format, va_stack_t *vto, char **endpos,
int flags;
long max_param=0;
long i;
- int aux_signed_int;
+
+ int va_signed_int;
+ unsigned int va_unsigned_int;
+ long va_signed_long;
+ unsigned long va_unsigned_long;
+ mp_intmax_t va_signed_long_long;
+ mp_uintmax_t va_unsigned_long_long;
while(*fmt) {
if(*fmt++ == '%') {
@@ -574,34 +580,32 @@ static long dprintf_Pass1(const char *format, va_stack_t *vto, char **endpos,
case FORMAT_INT:
#ifdef HAVE_LONG_LONG_TYPE
- if((vto[i].flags & FLAGS_LONGLONG) && (vto[i].flags & FLAGS_UNSIGNED))
- vto[i].data.num.as_unsigned =
- (mp_uintmax_t)va_arg(arglist, unsigned LONG_LONG_TYPE);
- else if(vto[i].flags & FLAGS_LONGLONG)
- vto[i].data.num.as_signed =
- (mp_intmax_t)va_arg(arglist, LONG_LONG_TYPE);
+ if((vto[i].flags & FLAGS_LONGLONG) && (vto[i].flags & FLAGS_UNSIGNED)) {
+ va_unsigned_long_long = va_arg(arglist, mp_uintmax_t);
+ vto[i].data.num.as_unsigned = (mp_uintmax_t)va_unsigned_long_long;
+ }
+ else if(vto[i].flags & FLAGS_LONGLONG) {
+ va_signed_long_long = va_arg(arglist, mp_intmax_t);
+ vto[i].data.num.as_signed = (mp_intmax_t)va_signed_long_long;
+ }
else
#endif
{
- if((vto[i].flags & FLAGS_LONG) && (vto[i].flags & FLAGS_UNSIGNED))
- vto[i].data.num.as_unsigned =
- (mp_uintmax_t)va_arg(arglist, unsigned long);
- else if(vto[i].flags & FLAGS_LONG)
- vto[i].data.num.as_signed =
- (mp_intmax_t)va_arg(arglist, long);
- else if(vto[i].flags & FLAGS_UNSIGNED)
- vto[i].data.num.as_unsigned =
- (mp_uintmax_t)va_arg(arglist, unsigned int);
+ if((vto[i].flags & FLAGS_LONG) && (vto[i].flags & FLAGS_UNSIGNED)) {
+ va_unsigned_long = va_arg(arglist, unsigned long);
+ vto[i].data.num.as_unsigned = (mp_uintmax_t)va_unsigned_long;
+ }
+ else if(vto[i].flags & FLAGS_LONG) {
+ va_signed_long = va_arg(arglist, long);
+ vto[i].data.num.as_signed = (mp_intmax_t)va_signed_long;
+ }
+ else if(vto[i].flags & FLAGS_UNSIGNED) {
+ va_unsigned_int = va_arg(arglist, unsigned int);
+ vto[i].data.num.as_unsigned = (mp_uintmax_t)va_unsigned_int;
+ }
else {
- /*
- vto[i].data.num.as_signed =
- (mp_intmax_t)va_arg(arglist, int);
- */
- aux_signed_int = va_arg(arglist, int);
- if(sizeof(mp_intmax_t) > sizeof(long))
- vto[i].data.num.as_signed = (mp_intmax_t)aux_signed_int;
- else
- vto[i].data.num.as_signed = (long)aux_signed_int;
+ va_signed_int = va_arg(arglist, int);
+ vto[i].data.num.as_signed = (mp_intmax_t)va_signed_int;
}
}
break;
@@ -776,8 +780,9 @@ static int dprintf_formatf(
if(is_neg) {
/* signed_num might fail to hold absolute negative minimum by 1 */
signed_num = p->data.num.as_signed + (mp_intmax_t)1;
- num = (mp_uintmax_t)-signed_num;
- num += (mp_uintmax_t)1;
+ signed_num = -signed_num;
+ num = (mp_uintmax_t)signed_num;
+ num += (mp_uintmax_t)0x1;
}
goto number;