diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | stream.c | 36 |
2 files changed, 12 insertions, 30 deletions
@@ -1,5 +1,11 @@ 2011-12-22 Kaz Kylheku <kaz@kylheku.com> + * stream.c (vformat): Combine ~a and ~s cases, so numbers and + strings are printed the same way under ~s and ~a. The only difference + is printing other kinds of objects. + +2011-12-22 Kaz Kylheku <kaz@kylheku.com> + Bug #35026 * stream.c (format_num): New argument: sign character. @@ -1004,7 +1004,7 @@ val vformat(val stream, val fmtstr, va_list vl) sprintf(num_buf, num_fmt->oct, value); } goto output_num; - case 'a': + case 'a': case 's': obj = va_arg(vl, val); if (obj == nao) goto premature; @@ -1023,38 +1023,15 @@ val vformat(val stream, val fmtstr, va_list vl) mp_toradix(mp(obj), (unsigned char *) pnum, 10); goto output_num; } - obj_pprint(obj, stream); - continue; - case 's': - obj = va_arg(vl, val); - if (obj == nao) - goto premature; - if (fixnump(obj)) { - value = c_num(obj); - sprintf(num_buf, num_fmt->dec, value); - if (!vformat_num(stream, num_buf, 0, 0, 0, 0, 0)) - return nil; - continue; - } else if (bignump(obj)) { - int nchars = mp_radix_size(mp(obj), 10); - val res; - if (nchars >= (int) sizeof (num_buf)) - pnum = (char *) chk_malloc(nchars + 1); - mp_toradix(mp(obj), (unsigned char *) pnum, 10); - res = vformat_num(stream, pnum, 0, 0, 0, 0, 0); - if (pnum != num_buf) - free(pnum); - if (!res) - return nil; - continue; - } - obj_print(obj, stream); + if (ch == 'a') + obj_pprint(obj, stream); + else + obj_print(obj, stream); continue; case 'p': ptr = va_arg(vl, void *); value = (cnum) ptr; - strcpy(num_buf, "0x"); - sprintf(num_buf + 2, num_fmt->hex, value); + sprintf(num_buf, num_fmt->hex, value); goto output_num; default: abort(); @@ -1076,7 +1053,6 @@ val vformat(val stream, val fmtstr, va_list vl) } } - if (va_arg(vl, val) != nao) internal_error("unterminated format argument list"); return t; |