/* 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.
unsigned char counter;
#endif
#ifdef UTF2000
+ char bom_flag;
unsigned char er_counter;
unsigned char er_buf[ER_BUF_SIZE];
str->counter = 0;
#endif /* MULE */
#ifdef UTF2000
+ str->bom_flag = 0;
str->er_counter = 0;
str->combined_char_count = 0;
str->combining_table = Qnil;
? 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;
}
}
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);
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); */
{
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);
else
char_id = cpos;
COMPOSE_ADD_CHAR (str, char_id, dst);
+ decoded:
cpos = 0;
counter = 0;
}
str->flags = flags;
str->cpos = cpos;
str->counter = counter;
+#ifdef UTF2000
+ str->bom_flag = bom_flag;
+#endif
}
void