summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2011-12-22 17:20:25 -0800
committerKaz Kylheku <kaz@kylheku.com>2011-12-22 17:20:25 -0800
commit5a00d4815ac646ac275c93203a423b3c7aa1c2a0 (patch)
treeb4e64fee963109101a93e1a18994b8e896b497f8
parent428519803e55041438569a590f15aa581c4a4737 (diff)
downloadtxr-5a00d4815ac646ac275c93203a423b3c7aa1c2a0.tar.gz
txr-5a00d4815ac646ac275c93203a423b3c7aa1c2a0.tar.bz2
txr-5a00d4815ac646ac275c93203a423b3c7aa1c2a0.zip
* 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.
-rw-r--r--ChangeLog6
-rw-r--r--stream.c36
2 files changed, 12 insertions, 30 deletions
diff --git a/ChangeLog b/ChangeLog
index f1c2484d..1ce4fd22 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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.
diff --git a/stream.c b/stream.c
index 146dcb56..aecb621c 100644
--- a/stream.c
+++ b/stream.c
@@ -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;