diff options
author | Andy Wingo <wingo@pobox.com> | 2012-02-14 13:09:34 +0100 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2012-02-14 14:10:53 +0100 |
commit | 6c98257f2ead0855f218369ea7f9a823cdb9727e (patch) | |
tree | fe42b6d4fa787da958c47f11e18840ee84246d0d /libguile/print.c | |
parent | ca2ec018f2131fc137e7bfb9119287d1fa915435 (diff) | |
download | guile-6c98257f2ead0855f218369ea7f9a823cdb9727e.tar.gz |
refactor port encoding modes: utf-8 and iconv
* libguile/ports.h (struct scm_t_port): Add a flag for the port encoding
mode: UTF8 or iconv. The iconv descriptors are now in a separate
structure so that we can avoid attaching finalizers to the ports
themselves, in some cases.
* libguile/ports.c (scm_c_make_port_with_encoding): Init the encoding
mode.
(scm_i_remove_port): Adapt to call close_iconv_descriptors.
(finalize_iconv_descriptors, open_iconv_descriptors):
(close_iconv_descriptors): New infrastructure to manage iconv
descriptors.
(scm_i_port_iconv_descriptors): New internal helper.
(scm_i_set_port_encoding_x): Use open_iconv_descriptors, if needed.
(get_iconv_codepoint): Use pt->iconv_descriptors.
(get_codepoint): Check the port encoding mode flags.
* libguile/print.c (display_string_using_iconv): Use
scm_i_port_iconv_descriptors.
(display_string): Use pt->encoding_mode flag.
Diffstat (limited to 'libguile/print.c')
-rw-r--r-- | libguile/print.c | 15 |
1 files changed, 5 insertions, 10 deletions
diff --git a/libguile/print.c b/libguile/print.c index 10b16f345..a1bf5eded 100644 --- a/libguile/print.c +++ b/libguile/print.c @@ -861,9 +861,9 @@ display_string_using_iconv (const void *str, int narrow_p, size_t len, scm_t_string_failed_conversion_handler strategy) { size_t printed; - scm_t_port *pt; + scm_t_iconv_descriptors *id; - pt = SCM_PTAB_ENTRY (port); + id = scm_i_port_iconv_descriptors (port); printed = 0; @@ -892,7 +892,7 @@ display_string_using_iconv (const void *str, int narrow_p, size_t len, output = encoded_output; output_left = sizeof (encoded_output); - done = iconv (pt->output_cd, &input, &input_left, + done = iconv (id->output_cd, &input, &input_left, &output, &output_left); output_len = sizeof (encoded_output) - output_left; @@ -902,7 +902,7 @@ display_string_using_iconv (const void *str, int narrow_p, size_t len, int errno_save = errno; /* Reset the `iconv' state. */ - iconv (pt->output_cd, NULL, NULL, NULL, NULL); + iconv (id->output_cd, NULL, NULL, NULL, NULL); /* Print the OUTPUT_LEN bytes successfully converted. */ scm_lfwrite_unlocked (encoded_output, output_len, port); @@ -966,12 +966,7 @@ display_string (const void *str, int narrow_p, pt = SCM_PTAB_ENTRY (port); - if (pt->output_cd == (iconv_t) -1) - /* Initialize the conversion descriptors, if needed. */ - scm_i_set_port_encoding_x (port, pt->encoding); - - /* FIXME: In 2.1, add a flag to determine whether a port is UTF-8. */ - if (pt->output_cd == (iconv_t) -1) + if (pt->encoding_mode == SCM_PORT_ENCODING_MODE_UTF8) return display_string_as_utf8 (str, narrow_p, len, port); else return display_string_using_iconv (str, narrow_p, len, |