diff options
author | Andy Wingo <wingo@pobox.com> | 2015-01-22 14:38:00 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2015-01-22 14:38:00 +0100 |
commit | 1cd779140dd74ddfaa62032882cb4745c2302cee (patch) | |
tree | 067851909bb6ab5a26ef6cd4bb02e4b778f092b0 /libguile | |
parent | baa74d36959739d7669cefb1918ab777ce9dcf56 (diff) | |
parent | 5943a62042432b86d757200ef595d7aebb5c9bac (diff) | |
download | guile-1cd779140dd74ddfaa62032882cb4745c2302cee.tar.gz |
Merge commit '5943a62042432b86d757200ef595d7aebb5c9bac'
Diffstat (limited to 'libguile')
-rw-r--r-- | libguile/print.c | 76 |
1 files changed, 51 insertions, 25 deletions
diff --git a/libguile/print.c b/libguile/print.c index 0a2067f1e..d95051183 100644 --- a/libguile/print.c +++ b/libguile/print.c @@ -67,6 +67,9 @@ static size_t display_string (const void *, int, size_t, SCM, scm_t_string_failed_conversion_handler); +static size_t write_string (const void *, int, size_t, SCM, + scm_t_string_failed_conversion_handler); + static int display_character (scm_t_wchar, SCM, scm_t_string_failed_conversion_handler); @@ -705,32 +708,29 @@ iprin1 (SCM exp, SCM port, scm_print_state *pstate) scm_i_print_stringbuf (exp, port, pstate); break; case scm_tc7_string: - if (SCM_WRITINGP (pstate)) - { - size_t len, i; - - display_character ('"', port, iconveh_question_mark); - len = scm_i_string_length (exp); - for (i = 0; i < len; ++i) - write_character (scm_i_string_ref (exp, i), port, 1); - - display_character ('"', port, iconveh_question_mark); - scm_remember_upto_here_1 (exp); - } - else - { - size_t len, printed; + { + size_t len, printed; - len = scm_i_string_length (exp); + len = scm_i_string_length (exp); + if (SCM_WRITINGP (pstate)) + { + printed = write_string (scm_i_string_data (exp), + scm_i_is_narrow_string (exp), + len, port, + PORT_CONVERSION_HANDLER (port)); + len += 2; /* account for the quotes */ + } + else printed = display_string (scm_i_string_data (exp), scm_i_is_narrow_string (exp), len, port, PORT_CONVERSION_HANDLER (port)); - if (SCM_UNLIKELY (printed < len)) - scm_encoding_error (__func__, errno, - "cannot convert to output locale", - port, scm_c_string_ref (exp, printed)); - } + + if (SCM_UNLIKELY (printed < len)) + scm_encoding_error (__func__, errno, + "cannot convert to output locale", + port, scm_c_string_ref (exp, printed)); + } scm_remember_upto_here_1 (exp); break; @@ -1125,8 +1125,6 @@ display_string_using_iconv (const void *str, int narrow_p, size_t len, return printed; } -#undef STR_REF - /* Display the LEN codepoints in STR to PORT according to STRATEGY; return the number of codepoints successfully displayed. If NARROW_P, then STR is interpreted as a sequence of `char', denoting a Latin-1 @@ -1149,8 +1147,8 @@ display_string (const void *str, int narrow_p, return display_string_using_iconv (str, narrow_p, len, port, strategy); } -/* Attempt to display CH to PORT according to STRATEGY. Return non-zero - if CH was successfully displayed, zero otherwise (e.g., if it was not +/* Attempt to display CH to PORT according to STRATEGY. Return one if + CH was successfully displayed, zero otherwise (e.g., if it was not representable in PORT's encoding.) */ static int display_character (scm_t_wchar ch, SCM port, @@ -1159,6 +1157,34 @@ display_character (scm_t_wchar ch, SCM port, return display_string (&ch, 0, 1, port, strategy) == 1; } +/* Same as 'display_string', but using the 'write' syntax. */ +static size_t +write_string (const void *str, int narrow_p, + size_t len, SCM port, + scm_t_string_failed_conversion_handler strategy) +{ + size_t printed; + + printed = display_character ('"', port, strategy); + + if (printed > 0) + { + size_t i; + + for (i = 0; i < len; ++i) + { + write_character (STR_REF (str, i), port, 1); + printed++; + } + + printed += display_character ('"', port, strategy); + } + + return printed; +} + +#undef STR_REF + /* Attempt to pretty-print CH, a combining character, to PORT. Return zero upon failure, non-zero otherwise. The idea is to print CH above a dotted circle to make it more visible. */ |