X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=src%2Ftext-coding.c;h=79c9dcb158a01a9e40bcec3b7bf6ca8debc9b54b;hb=021b0929854c960c0941faee7e6c84fbce8b1776;hp=f22cf5a46fa4aec2c16d2a353fa367f80a3b5451;hpb=924e9439268759b8d501e982e7620159646798fc;p=chise%2Fxemacs-chise.git.1 diff --git a/src/text-coding.c b/src/text-coding.c index f22cf5a..79c9dcb 100644 --- a/src/text-coding.c +++ b/src/text-coding.c @@ -1,7 +1,7 @@ /* Code conversion functions. Copyright (C) 1991, 1995 Free Software Foundation, Inc. Copyright (C) 1995 Sun Microsystems, Inc. - Copyright (C) 1999,2000,2001,2002,2003,2004,2005 MORIOKA Tomohiko + Copyright (C) 1999,2000,2001,2002,2003,2004,2005,2008 MORIOKA Tomohiko This file is part of XEmacs. @@ -2320,6 +2320,7 @@ struct decoding_stream unsigned char counter; #endif #ifdef UTF2000 + char bom_flag; unsigned char er_counter; unsigned char er_buf[ER_BUF_SIZE]; @@ -2464,6 +2465,7 @@ reset_decoding_stream (struct decoding_stream *str) str->counter = 0; #endif /* MULE */ #ifdef UTF2000 + str->bom_flag = 0; str->er_counter = 0; str->combined_char_count = 0; str->combining_table = Qnil; @@ -3346,7 +3348,14 @@ decode_add_er_char (struct decoding_stream *str, Emchar c, ? DECODE_CHAR (ccs, code, 0) : decode_builtin_char (ccs, code); - DECODE_ADD_UCS_CHAR (chr, dst); + if ( chr >= 0 ) + DECODE_ADD_UCS_CHAR (chr, dst); + else + { + Dynarr_add_many (dst, str->er_buf, str->er_counter); + Dynarr_add (dst, ';'); + } + goto decoded; } } @@ -4497,6 +4506,7 @@ decode_coding_utf8 (Lstream *decoding, const Extbyte *src, eol_type_t eol_type = str->eol_type; unsigned char counter = str->counter; #ifdef UTF2000 + int bom_flag = str->bom_flag; Lisp_Object ccs = CODING_SYSTEM_ISO2022_INITIAL_CHARSET (DECODING_STREAM_DATA (decoding)->codesys, 0); @@ -4512,11 +4522,20 @@ decode_coding_utf8 (Lstream *decoding, const Extbyte *src, COMPOSE_FLUSH_CHARS (str, dst); decode_flush_er_chars (str, dst); DECODE_HANDLE_EOL_TYPE (eol_type, c, flags, dst); + + if ( bom_flag == 0 ) + bom_flag = -1; + DECODE_ADD_UCS_CHAR (c, dst); } else if ( c < 0xC0 ) - /* decode_add_er_char (str, c, dst); */ - COMPOSE_ADD_CHAR (str, c, dst); + { + if ( bom_flag == 0 ) + bom_flag = -1; + + /* decode_add_er_char (str, c, dst); */ + COMPOSE_ADD_CHAR (str, c, dst); + } else { /* decode_flush_er_chars (str, dst); */ @@ -4554,6 +4573,17 @@ decode_coding_utf8 (Lstream *decoding, const Extbyte *src, { Emchar char_id; + if ( bom_flag == 0 ) + { + if ( cpos == 0xFEFF ) + { + bom_flag = 1; + goto decoded; + } + else + bom_flag = -1; + } + if (!NILP (ccs)) { char_id = decode_defined_char (ccs, cpos, 0); @@ -4564,6 +4594,7 @@ decode_coding_utf8 (Lstream *decoding, const Extbyte *src, else char_id = cpos; COMPOSE_ADD_CHAR (str, char_id, dst); + decoded: cpos = 0; counter = 0; } @@ -4596,6 +4627,9 @@ decode_coding_utf8 (Lstream *decoding, const Extbyte *src, str->flags = flags; str->cpos = cpos; str->counter = counter; +#ifdef UTF2000 + str->bom_flag = bom_flag; +#endif } void