(detected_mask): Delete unused variable.

(decode_coding_iso_2022): Pay attention to the byte sequence of
CTEXT extended segment, and retain those bytes as is.
(decode_coding_ccl): Delete unused variable `valids'.
(setup_coding_system): Delete unused variable `category'.
(consume_chars): Delete unused variable `category'.  Make it work
for non-multibyte case.
(make_conversion_work_buffer): Argument changed.
(saved_coding): Delete unused variable.
(code_conversion_restore): Don't check saved_coding->destination.
(code_conversion_save): New function.
(decode_coding_gap, encode_coding_gap): Call code_conversion_save
instead of record_unwind_protect.
(decode_coding_object, encode_coding_object): Likewise.  Recover
PT.
(detect_coding_system): Delete unused variable `mask'.
(Fdefine_coding_system_internal): Delete unsed vaiable id;
This commit is contained in:
Kenichi Handa 2003-05-28 11:37:09 +00:00
parent 201dc484dc
commit 4776e6380a
2 changed files with 225 additions and 79 deletions

View file

@ -701,26 +701,6 @@ static enum coding_category coding_priorities[coding_category_max];
Nth coding category. */
static struct coding_system coding_categories[coding_category_max];
static int detected_mask[coding_category_raw_text] =
{ CATEGORY_MASK_ISO,
CATEGORY_MASK_ISO,
CATEGORY_MASK_ISO,
CATEGORY_MASK_ISO,
CATEGORY_MASK_ISO,
CATEGORY_MASK_ISO,
CATEGORY_MASK_UTF_8,
CATEGORY_MASK_UTF_16,
CATEGORY_MASK_UTF_16,
CATEGORY_MASK_UTF_16,
CATEGORY_MASK_UTF_16,
CATEGORY_MASK_UTF_16,
CATEGORY_MASK_CHARSET,
CATEGORY_MASK_SJIS,
CATEGORY_MASK_BIG5,
CATEGORY_MASK_CCL,
CATEGORY_MASK_EMACS_MULE
};
/*** Commonly used macros and functions ***/
#ifndef min
@ -3080,6 +3060,70 @@ decode_coding_iso_2022 (coding)
}
continue;
case '%':
ONE_MORE_BYTE (c1);
if (c1 == '/')
{
/* CTEXT extended segment:
ESC % / [0-4] M L --ENCODING-NAME-- \002 --BYTES--
We keep these bytes as is for the moment.
They may be decoded by post-read-conversion. */
int dim, M, L;
int size;
ONE_MORE_BYTE (dim);
ONE_MORE_BYTE (M);
ONE_MORE_BYTE (L);
size = ((M - 128) * 128) + (L - 128);
if (charbuf + 8 + size > charbuf_end)
goto break_loop;
*charbuf++ = ISO_CODE_ESC;
*charbuf++ = '%';
*charbuf++ = '/';
*charbuf++ = dim;
*charbuf++ = BYTE8_TO_CHAR (M);
*charbuf++ = BYTE8_TO_CHAR (L);
while (size-- > 0)
{
ONE_MORE_BYTE (c1);
*charbuf++ = ASCII_BYTE_P (c1) ? c1 : BYTE8_TO_CHAR (c1);
}
}
else if (c1 == 'G')
{
/* XFree86 extension for embedding UTF-8 in CTEXT:
ESC % G --UTF-8-BYTES-- ESC % @
We keep these bytes as is for the moment.
They may be decoded by post-read-conversion. */
int *p = charbuf;
if (p + 6 > charbuf_end)
goto break_loop;
*p++ = ISO_CODE_ESC;
*p++ = '%';
*p++ = 'G';
while (p < charbuf_end)
{
ONE_MORE_BYTE (c1);
if (c1 == ISO_CODE_ESC
&& src + 1 < src_end
&& src[0] == '%'
&& src[1] == '@')
break;
*p++ = ASCII_BYTE_P (c1) ? c1 : BYTE8_TO_CHAR (c1);
}
if (p + 3 > charbuf_end)
goto break_loop;
*p++ = ISO_CODE_ESC;
*p++ = '%';
*p++ = '@';
charbuf = p;
}
else
goto invalid_code;
continue;
break;
default:
if (! (CODING_ISO_FLAGS (coding) & CODING_ISO_FLAG_DESIGNATION))
goto invalid_code;
@ -3168,6 +3212,10 @@ decode_coding_iso_2022 (coding)
*charbuf++ = ASCII_BYTE_P (c) ? c : BYTE8_TO_CHAR (c);
char_offset++;
coding->errors++;
continue;
break_loop:
break;
}
no_more_source:
@ -4287,7 +4335,7 @@ decode_coding_ccl (coding)
struct ccl_program ccl;
int source_charbuf[1024];
int source_byteidx[1024];
Lisp_Object attrs, eol_type, charset_list, valids;
Lisp_Object attrs, eol_type, charset_list;
CODING_GET_INFO (coding, attrs, eol_type, charset_list);
setup_ccl_program (&ccl, CODING_CCL_DECODER (coding));
@ -4793,7 +4841,6 @@ setup_coding_system (coding_system, coding)
{
int i;
int flags = XINT (AREF (attrs, coding_attr_iso_flags));
enum coding_category category = XINT (CODING_ATTR_CATEGORY (attrs));
/* Invoke graphic register 0 to plane 0. */
CODING_ISO_INVOCATION (coding, 0) = 0;
@ -5948,13 +5995,13 @@ consume_chars (coding)
int *buf = coding->charbuf;
int *buf_end = coding->charbuf + coding->charbuf_size;
const unsigned char *src = coding->source + coding->consumed;
const unsigned char *src_end = coding->source + coding->src_bytes;
EMACS_INT pos = coding->src_pos + coding->consumed_char;
EMACS_INT end_pos = coding->src_pos + coding->src_chars;
int multibytep = coding->src_multibyte;
Lisp_Object eol_type;
int c;
EMACS_INT stop, stop_composition, stop_charset;
int id;
eol_type = CODING_ID_EOL_TYPE (coding->id);
if (VECTORP (eol_type))
@ -5978,8 +6025,6 @@ consume_chars (coding)
{
if (pos == stop)
{
int *p;
if (pos == end_pos)
break;
if (pos == stop_composition)
@ -5993,9 +6038,16 @@ consume_chars (coding)
}
if (! multibytep)
c = *src++;
{
EMACS_INT bytes = MULTIBYTE_LENGTH (src, src_end);
if (bytes > 0)
c = STRING_CHAR_ADVANCE (src), pos += bytes;
else
c = *src++, pos++;
}
else
c = STRING_CHAR_ADVANCE (src);
c = STRING_CHAR_ADVANCE (src), pos++;
if ((c == '\r') && (coding->mode & CODING_MODE_SELECTIVE_DISPLAY))
c = '\n';
if (! EQ (eol_type, Qunix))
@ -6009,7 +6061,6 @@ consume_chars (coding)
}
}
*buf++ = c;
pos++;
}
coding->consumed = src - coding->source;
@ -6081,9 +6132,10 @@ encode_coding (coding)
return (coding->result);
}
/* Work buffer */
/* List of currently used working buffer. */
/* Stack of working buffers used in code conversion. An nil element
means that the code conversion of that level is not using a working
buffer. */
Lisp_Object Vcode_conversion_work_buf_list;
/* A working buffer used by the top level conversion. */
@ -6095,32 +6147,35 @@ Lisp_Object Vcode_conversion_reused_work_buf;
buffer. */
Lisp_Object
make_conversion_work_buffer (multibytep)
int multibytep;
make_conversion_work_buffer (multibytep, depth)
int multibytep, depth;
{
struct buffer *current = current_buffer;
Lisp_Object buf;
Lisp_Object buf, name;
if (NILP (Vcode_conversion_work_buf_list))
if (depth == 0)
{
if (NILP (Vcode_conversion_reused_work_buf))
Vcode_conversion_reused_work_buf
= Fget_buffer_create (build_string (" *code-conversion-work*"));
Vcode_conversion_work_buf_list
= Fcons (Vcode_conversion_reused_work_buf, Qnil);
= Fget_buffer_create (build_string (" *code-conversion-work<0>*"));
buf = Vcode_conversion_reused_work_buf;
}
else
{
int depth = XINT (Flength (Vcode_conversion_work_buf_list));
char str[128];
if (depth < 0)
{
name = build_string (" *code-conversion-work*");
name = Fgenerate_new_buffer_name (name, Qnil);
}
else
{
char str[128];
sprintf (str, " *code-conversion-work*<%d>", depth);
Vcode_conversion_work_buf_list
= Fcons (Fget_buffer_create (build_string (str)),
Vcode_conversion_work_buf_list);
sprintf (str, " *code-conversion-work*<%d>", depth);
name = build_string (str);
}
buf = Fget_buffer_create (name);
}
buf = XCAR (Vcode_conversion_work_buf_list);
set_buffer_internal (XBUFFER (buf));
current_buffer->undo_list = Qt;
Ferase_buffer ();
@ -6129,30 +6184,42 @@ make_conversion_work_buffer (multibytep)
return buf;
}
static struct coding_system *saved_coding;
Lisp_Object
code_conversion_restore (info)
Lisp_Object info;
static Lisp_Object
code_conversion_restore (buffer)
Lisp_Object buffer;
{
int depth = XINT (Flength (Vcode_conversion_work_buf_list));
Lisp_Object buf;
Lisp_Object workbuf;
if (depth > 0)
{
buf = XCAR (Vcode_conversion_work_buf_list);
Vcode_conversion_work_buf_list = XCDR (Vcode_conversion_work_buf_list);
if (depth > 1 && !NILP (Fbuffer_live_p (buf)))
Fkill_buffer (buf);
}
if (EQ (saved_coding->dst_object, Qt)
&& saved_coding->destination)
xfree (saved_coding->destination);
return save_excursion_restore (info);
workbuf = XCAR (Vcode_conversion_work_buf_list);
if (! NILP (workbuf)
&& ! EQ (workbuf, Vcode_conversion_reused_work_buf)
&& ! NILP (Fbuffer_live_p (workbuf)))
Fkill_buffer (workbuf);
Vcode_conversion_work_buf_list = XCDR (Vcode_conversion_work_buf_list);
set_buffer_internal (XBUFFER (buffer));
return Qnil;
}
static Lisp_Object
code_conversion_save (buffer, with_work_buf, multibyte)
Lisp_Object buffer;
int with_work_buf, multibyte;
{
Lisp_Object workbuf;
if (with_work_buf)
{
int depth = XINT (Flength (Vcode_conversion_work_buf_list));
workbuf = make_conversion_work_buffer (multibyte, depth);
}
else
workbuf = Qnil;
Vcode_conversion_work_buf_list
= Fcons (workbuf, Vcode_conversion_work_buf_list);
record_unwind_protect (code_conversion_restore, buffer);
return workbuf;
}
int
decode_coding_gap (coding, chars, bytes)
@ -6160,11 +6227,12 @@ decode_coding_gap (coding, chars, bytes)
EMACS_INT chars, bytes;
{
int count = specpdl_ptr - specpdl;
Lisp_Object buffer;
saved_coding = coding;
record_unwind_protect (code_conversion_restore, save_excursion_save ());
buffer = Fcurrent_buffer ();
code_conversion_save (buffer, 0, 0);
coding->src_object = Fcurrent_buffer ();
coding->src_object = buffer;
coding->src_chars = chars;
coding->src_bytes = bytes;
coding->src_pos = -chars;
@ -6193,10 +6261,9 @@ encode_coding_gap (coding, chars, bytes)
int count = specpdl_ptr - specpdl;
Lisp_Object buffer;
saved_coding = coding;
record_unwind_protect (code_conversion_restore, save_excursion_save ());
buffer = Fcurrent_buffer ();
code_conversion_save (buffer, 0, 0);
coding->src_object = buffer;
coding->src_chars = chars;
coding->src_bytes = bytes;
@ -6257,9 +6324,10 @@ decode_coding_object (coding, src_object, from, from_byte, to, to_byte,
EMACS_INT chars = to - from;
EMACS_INT bytes = to_byte - from_byte;
Lisp_Object attrs;
Lisp_Object buffer;
int saved_pt = -1, saved_pt_byte;
saved_coding = coding;
record_unwind_protect (code_conversion_restore, save_excursion_save ());
buffer = Fcurrent_buffer ();
if (NILP (dst_object))
{
@ -6284,6 +6352,7 @@ decode_coding_object (coding, src_object, from, from_byte, to, to_byte,
move_gap_both (from, from_byte);
if (EQ (src_object, dst_object))
{
saved_pt = PT, saved_pt_byte = PT_BYTE;
TEMP_SET_PT_BOTH (from, from_byte);
del_range_both (from, from_byte, to, to_byte, 1);
coding->src_pos = -chars;
@ -6304,13 +6373,14 @@ decode_coding_object (coding, src_object, from, from_byte, to, to_byte,
|| (! NILP (CODING_ATTR_POST_READ (attrs))
&& NILP (dst_object)))
{
coding->dst_object = make_conversion_work_buffer (1);
coding->dst_object = code_conversion_save (buffer, 1, 1);
coding->dst_pos = BEG;
coding->dst_pos_byte = BEG_BYTE;
coding->dst_multibyte = 1;
}
else if (BUFFERP (dst_object))
{
code_conversion_save (buffer, 0, 0);
coding->dst_object = dst_object;
coding->dst_pos = BUF_PT (XBUFFER (dst_object));
coding->dst_pos_byte = BUF_PT_BYTE (XBUFFER (dst_object));
@ -6319,6 +6389,7 @@ decode_coding_object (coding, src_object, from, from_byte, to, to_byte,
}
else
{
code_conversion_save (buffer, 0, 0);
coding->dst_object = Qnil;
coding->dst_multibyte = 1;
}
@ -6368,6 +6439,25 @@ decode_coding_object (coding, src_object, from, from_byte, to, to_byte,
}
}
if (saved_pt >= 0)
{
/* This is the case of:
(BUFFERP (src_object) && EQ (src_object, dst_object))
As we have moved PT while replacing the original buffer
contents, we must recover it now. */
set_buffer_internal (XBUFFER (src_object));
if (saved_pt < from)
TEMP_SET_PT_BOTH (saved_pt, saved_pt_byte);
else if (saved_pt < from + chars)
TEMP_SET_PT_BOTH (from, from_byte);
else if (! NILP (current_buffer->enable_multibyte_characters))
TEMP_SET_PT_BOTH (saved_pt + (coding->produced_char - chars),
saved_pt_byte + (coding->produced - bytes));
else
TEMP_SET_PT_BOTH (saved_pt + (coding->produced - bytes),
saved_pt_byte + (coding->produced - bytes));
}
unbind_to (count, Qnil);
}
@ -6384,9 +6474,10 @@ encode_coding_object (coding, src_object, from, from_byte, to, to_byte,
EMACS_INT chars = to - from;
EMACS_INT bytes = to_byte - from_byte;
Lisp_Object attrs;
Lisp_Object buffer;
int saved_pt = -1, saved_pt_byte;
saved_coding = coding;
record_unwind_protect (code_conversion_restore, save_excursion_save ());
buffer = Fcurrent_buffer ();
coding->src_object = src_object;
coding->src_chars = chars;
@ -6397,7 +6488,8 @@ encode_coding_object (coding, src_object, from, from_byte, to, to_byte,
if (! NILP (CODING_ATTR_PRE_WRITE (attrs)))
{
coding->src_object = make_conversion_work_buffer (coding->src_multibyte);
coding->src_object = code_conversion_save (buffer, 1,
coding->src_multibyte);
set_buffer_internal (XBUFFER (coding->src_object));
if (STRINGP (src_object))
insert_from_string (src_object, from, from_byte, chars, bytes, 0);
@ -6409,6 +6501,7 @@ encode_coding_object (coding, src_object, from, from_byte, to, to_byte,
if (EQ (src_object, dst_object))
{
set_buffer_internal (XBUFFER (src_object));
saved_pt = PT, saved_pt_byte = PT_BYTE;
del_range_both (from, from_byte, to, to_byte, 1);
set_buffer_internal (XBUFFER (coding->src_object));
}
@ -6426,14 +6519,17 @@ encode_coding_object (coding, src_object, from, from_byte, to, to_byte,
}
else if (STRINGP (src_object))
{
code_conversion_save (buffer, 0, 0);
coding->src_pos = from;
coding->src_pos_byte = from_byte;
}
else if (BUFFERP (src_object))
{
code_conversion_save (buffer, 0, 0);
set_buffer_internal (XBUFFER (src_object));
if (EQ (src_object, dst_object))
{
saved_pt = PT, saved_pt_byte = PT_BYTE;
coding->src_object = del_range_1 (from, to, 1, 1);
coding->src_pos = 0;
coding->src_pos_byte = 0;
@ -6446,6 +6542,8 @@ encode_coding_object (coding, src_object, from, from_byte, to, to_byte,
coding->src_pos_byte = from_byte;
}
}
else
code_conversion_save (buffer, 0, 0);
if (BUFFERP (dst_object))
{
@ -6493,6 +6591,25 @@ encode_coding_object (coding, src_object, from, from_byte, to, to_byte,
}
}
if (saved_pt >= 0)
{
/* This is the case of:
(BUFFERP (src_object) && EQ (src_object, dst_object))
As we have moved PT while replacing the original buffer
contents, we must recover it now. */
set_buffer_internal (XBUFFER (src_object));
if (saved_pt < from)
TEMP_SET_PT_BOTH (saved_pt, saved_pt_byte);
else if (saved_pt < from + chars)
TEMP_SET_PT_BOTH (from, from_byte);
else if (! NILP (current_buffer->enable_multibyte_characters))
TEMP_SET_PT_BOTH (saved_pt + (coding->produced_char - chars),
saved_pt_byte + (coding->produced - bytes));
else
TEMP_SET_PT_BOTH (saved_pt + (coding->produced - bytes),
saved_pt_byte + (coding->produced - bytes));
}
unbind_to (count, Qnil);
}
@ -6589,7 +6706,6 @@ detect_coding_system (src, src_bytes, highest, multibytep, coding_system)
Lisp_Object coding_system;
{
unsigned char *src_end = src + src_bytes;
int mask = CATEGORY_MASK_ANY;
Lisp_Object attrs, eol_type;
Lisp_Object val;
struct coding_system coding;
@ -8005,7 +8121,7 @@ usage: (define-coding-system-internal ...) */)
else if (EQ (coding_type, Qiso_2022))
{
Lisp_Object initial, reg_usage, request, flags;
int i, id;
int i;
if (nargs < coding_arg_iso2022_max)
goto short_args;