summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2012-02-12 18:18:44 -0800
committerKaz Kylheku <kaz@kylheku.com>2012-02-12 18:18:44 -0800
commitc056272954ddc5af1c61bb7c174bdccaf208f1a1 (patch)
tree1318218e41b3e9af31d5aa239fb23d3ab0c374f0
parentfb08292e908f1af8b93f26ba57c16d97cd3e08ca (diff)
downloadtxr-c056272954ddc5af1c61bb7c174bdccaf208f1a1.tar.gz
txr-c056272954ddc5af1c61bb7c174bdccaf208f1a1.tar.bz2
txr-c056272954ddc5af1c61bb7c174bdccaf208f1a1.zip
* 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.
-rw-r--r--ChangeLog18
-rw-r--r--lib.c23
-rw-r--r--parser.l2
-rw-r--r--parser.y2
-rw-r--r--stream.c4
5 files changed, 35 insertions, 14 deletions
diff --git a/ChangeLog b/ChangeLog
index ef4c7e99..67ad8f13 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,23 @@
2012-02-12 Kaz Kylheku <kaz@kylheku.com>
+ * 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 <kaz@kylheku.com>
+
Task #11486
* match.c (h_coll): Call consume_prefix in the loop.
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("#<lazy-string: ~s>"), 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("#<lazy-string: ~a>"), 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}
}
<CHRLIT>(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))