From ec8c796bd17158c54f2415b1e71a82d309687126 Mon Sep 17 00:00:00 2001 From: Thomas Roessler Date: Tue, 30 Mar 1999 23:50:33 +0000 Subject: This patch removes at least some of the horrible utf-8 kluges in charset.c. The new DECODER framework is currently only used in handler.c, and there in a horribly inefficient manner. We should use greater blocks of data, which would be much more efficient than what we are currently doing. Most of the other charset-related code still uses the old mutt_display_char() &friends interface, which is actually ok as long as you don't try to handle multibyte character sets. The most notable change should be the one to mutt_get_translation(): It will delay the loading and parsing of character set information files until it's really needed, catching a huge amount of standard cases. As a side effect, this will make "iso tagged as ascii" "work" again, as long as both sides use the same iso character set. --- charset.h | 38 ++++++++++++++++++++++++++------------ 1 file changed, 26 insertions(+), 12 deletions(-) (limited to 'charset.h') diff --git a/charset.h b/charset.h index 39522428..8f466ef5 100644 --- a/charset.h +++ b/charset.h @@ -53,31 +53,45 @@ typedef struct } CHARSET; -/* this one could be made a bit smaller with two levels - * of nested unions and structs. It's not worth the effort. - */ +#define DECODER_BUFFSIZE 4096 + +struct decoder_buff +{ + size_t size, used; + char buff[DECODER_BUFFSIZE]; +}; typedef struct decoder { - STATE *s; - short is_utf8; - CHARSET_MAP *map; + short src_is_utf8; + short just_take_id; + short forced; + + /* used for utf-8 decoding */ CHARSET *chs; - struct utf8_state *sfu; -} -DECODER; + /* used for 8-bit to 8-bit recoding */ + CHARSET_MAP *chm; + + /* the buffers */ + struct decoder_buff in; + struct decoder_buff out; +} +DECODER; + +DECODER *mutt_open_decoder (const char *, const char *); +void mutt_decoder_push (DECODER *, void *, size_t, size_t *); +void mutt_decoder_pop (DECODER *, void *, size_t, size_t *); +void mutt_decoder_pop_to_state (DECODER *, STATE *); +void mutt_free_decoder (DECODER **); CHARSET *mutt_get_charset(const char *); CHARSET_MAP *mutt_get_translation(const char *, const char *); -DECODER *mutt_open_decoder (STATE *, BODY *, int); int mutt_display_string(char *, CHARSET_MAP *); int mutt_is_utf8(const char *); int mutt_recode_file (const char *, const char *, const char *); unsigned char mutt_display_char(unsigned char, CHARSET_MAP *); -void mutt_close_decoder (DECODER **); void mutt_decode_utf8_string(char *, CHARSET *); -void mutt_decoder_putc (DECODER *, char); #endif -- cgit v1.2.3