From c056272954ddc5af1c61bb7c174bdccaf208f1a1 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Sun, 12 Feb 2012 18:18:44 -0800 Subject: * lib.c (obj_print): Print control characters in string and character literals as hex escapes, followed by semicolon if necessary. Don't use iswprint function since it is locale-specific and concludes that non-ASCII characters are unprintable. Changed print syntax for lazy strings. (obj_pprint): Changed print syntax for lazy strings. * parser.l: Bugfix in hex/octal character constant. num_esc(yytext) was called rather than num_esc(yytext+1). * parser.y (chrlit): Bugfix: missing case for hex and octal constants which are given by a LITCHAR token. * stream.c (vformat): Bugfix: strings were being printed as if using ~a even under ~s. --- ChangeLog | 18 ++++++++++++++++++ lib.c | 23 ++++++++++++++--------- parser.l | 2 +- parser.y | 2 ++ stream.c | 4 ---- 5 files changed, 35 insertions(+), 14 deletions(-) diff --git a/ChangeLog b/ChangeLog index ef4c7e99..67ad8f13 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,21 @@ +2012-02-12 Kaz Kylheku + + * lib.c (obj_print): Print control characters in string and + character literals as hex escapes, followed by semicolon if + necessary. Don't use iswprint function since it is locale-specific + and concludes that non-ASCII characters are unprintable. + Changed print syntax for lazy strings. + (obj_pprint): Changed print syntax for lazy strings. + + * parser.l: Bugfix in hex/octal character constant. + num_esc(yytext) was called rather than num_esc(yytext+1). + + * parser.y (chrlit): Bugfix: missing case for hex and octal + constants which are given by a LITCHAR token. + + * stream.c (vformat): Bugfix: strings were being printed as if using ~a + even under ~s. + 2012-02-12 Kaz Kylheku Task #11486 diff --git a/lib.c b/lib.c index bea1e7d9..1e39f77d 100644 --- a/lib.c +++ b/lib.c @@ -3789,7 +3789,12 @@ val obj_print(val obj, val out) { const wchar_t *ptr; put_char(out, chr('"')); + int semi_flag = 0; + for (ptr = c_str(obj); *ptr; ptr++) { + if (semi_flag && iswxdigit(*ptr)) + put_char(out, chr(';')); + semi_flag = 0; switch (*ptr) { case '\a': put_string(out, lit("\\a")); break; case '\b': put_string(out, lit("\\b")); break; @@ -3802,10 +3807,12 @@ val obj_print(val obj, val out) case '\\': put_string(out, lit("\\\\")); break; case 27: put_string(out, lit("\\e")); break; default: - if (iswprint(*ptr)) + if (*ptr >= ' ') { put_char(out, chr(*ptr)); - else - format(out, lit("\\~03o"), num(*ptr), nao); + } else { + format(out, lit("\\x~,02X"), num(*ptr), nao); + semi_flag = 1; + } } } put_char(out, chr('"')); @@ -3828,10 +3835,10 @@ val obj_print(val obj, val out) case 27: put_string(out, lit("esc")); break; case ' ': put_string(out, lit("space")); break; default: - if (iswprint(ch)) + if (ch >= ' ') put_char(out, chr(ch)); else - format(out, lit("x~x"), num(ch), nao); + format(out, lit("x~,02x"), num(ch), nao); } } return obj; @@ -3868,8 +3875,7 @@ val obj_print(val obj, val out) } return obj; case LSTR: - obj_print(obj->ls.prefix, out); - put_string(out, lit("#<... lazy string>")); + format(out, lit("#"), obj->ls.prefix); return obj; case COBJ: obj->co.ops->print(obj, out); @@ -3964,8 +3970,7 @@ val obj_pprint(val obj, val out) } return obj; case LSTR: - obj_pprint(obj->ls.prefix, out); - put_string(out, lit("...")); + format(out, lit("#"), obj->ls.prefix); return obj; case COBJ: obj->co.ops->print(obj, out); diff --git a/parser.l b/parser.l index 10328440..e206661d 100644 --- a/parser.l +++ b/parser.l @@ -601,7 +601,7 @@ UONLY {U2}{U}|{U3}{U}{U}|{U4}{U}{U}{U} } (x{HEX}+|o{OCT}+) { - yylval.chr = num_esc(yytext); + yylval.chr = num_esc(yytext+1); return LITCHAR; } diff --git a/parser.y b/parser.y index fef42eaf..1059c863 100644 --- a/parser.y +++ b/parser.y @@ -812,6 +812,8 @@ chrlit : HASH_BACKSLASH IDENT { wchar_t ch; str, nao); }} end_of_char(); $$ = chr(ch); } + | HASH_BACKSLASH LITCHAR { $$ = chr($2); + end_of_char(); } | HASH_BACKSLASH error { $$ = nil; yybadtoken(yychar, lit("character literal")); } diff --git a/stream.c b/stream.c index 38af8afe..ac14a83c 100644 --- a/stream.c +++ b/stream.c @@ -1010,10 +1010,6 @@ val vformat(val stream, val fmtstr, va_list vl) value = c_num(obj); sprintf(num_buf, num_fmt->dec, value); goto output_num; - } else if (stringp(obj)) { - if (!vformat_str(stream, obj, width, left, precision)) - return nil; - continue; } else if (bignump(obj)) { int nchars = mp_radix_size(mp(obj), 10); if (nchars >= (int) sizeof (num_buf)) -- cgit v1.2.3