diff options
author | Jim Blandy <jimb@red-bean.com> | 1999-09-10 15:41:54 +0000 |
---|---|---|
committer | Jim Blandy <jimb@red-bean.com> | 1999-09-10 15:41:54 +0000 |
commit | 3305ef30e31ce1f33b485a2e8ec86d723c9c6757 (patch) | |
tree | 679edf56fbeb21d0e38e3baf573fdbeff95c0587 | |
parent | 3291c8ea6f479fcbf4dc28bc6fb3fa3d923dbfa3 (diff) | |
download | guile-3305ef30e31ce1f33b485a2e8ec86d723c9c6757.tar.gz |
* mbconv.c (scm_mb_iconv): Make buffer pointer for output encoding
a const scm_char_t *, to match the prototype.
* mbconv.c (scm_mb_iconv): Don't return scm_mb_iconv_more_room
unless we actually have text to convert. Remember that, even if
*inbytesleft is zero, there may be text remaining in the context's
buffer.
-rw-r--r-- | libguile/mbconv.c | 56 |
1 files changed, 29 insertions, 27 deletions
diff --git a/libguile/mbconv.c b/libguile/mbconv.c index 09b3f34f1..6d586fed1 100644 --- a/libguile/mbconv.c +++ b/libguile/mbconv.c @@ -221,6 +221,7 @@ scm_mb_iconv_open (const char *tocode, const char *fromcode) text_unknown_encoding_msg, args, args); } + /* Never reached. */ return 0; } @@ -298,42 +299,43 @@ scm_mb_iconv (struct scm_mb_iconv *context, return ours->from->reset (ours->from_data, 0, 0); } - if (! outbuf || *outbytesleft <= 0) - return scm_mb_iconv_more_room; - /* Oh! We actually have some *TEXT* to convert! Not bureaucracy!!! */ - while (*inbytesleft > 0) + while (*inbytesleft > 0 || ours->valid > 0) { + if (! outbuf || *outbytesleft <= 0) + return scm_mb_iconv_more_room; + /* Convert as many characters as possible from the input buffer into the intermediate scm_char_t buffer. */ - { - scm_char_t *buf = ours->buffer + ours->valid; - size_t buf_left = ours->size - ours->valid; - enum scm_mb_read_result read_result - = ours->from->read (ours->from_data, inbuf, inbytesleft, - &buf, &buf_left); - ours->valid = ours->size - buf_left; - - if (*inbytesleft < 0) - abort (); - - switch (read_result) - { - case scm_mb_read_ok: - break; - case scm_mb_read_incomplete: - return scm_mb_iconv_incomplete_encoding; - case scm_mb_read_error: - return scm_mb_iconv_bad_encoding; - default: + if (*inbytesleft > 0) + { + scm_char_t *buf = ours->buffer + ours->valid; + size_t buf_left = ours->size - ours->valid; + enum scm_mb_read_result read_result + = ours->from->read (ours->from_data, inbuf, inbytesleft, + &buf, &buf_left); + ours->valid = ours->size - buf_left; + + if (*inbytesleft < 0) abort (); - } - } + + switch (read_result) + { + case scm_mb_read_ok: + break; + case scm_mb_read_incomplete: + return scm_mb_iconv_incomplete_encoding; + case scm_mb_read_error: + return scm_mb_iconv_bad_encoding; + default: + abort (); + } + } /* Convert as many characters as possible from the intermediate scm_char_t buffer to the output buffer. */ { - scm_char_t *buf = ours->buffer; + const scm_char_t *buf = ours->buffer; size_t buf_left = ours->valid; enum scm_mb_write_result write_result = ours->to->write (ours->to_data, &buf, &buf_left, |