# HG changeset patch # User Kenichi Handa # Date 1054121797 0 # Node ID 7349f4473e7fc0b87af31dc4d433b984c33d8d1c # Parent e8f4dff2bfc15bc14bbfd5bf0a6f7d383fb33654 (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; diff -r e8f4dff2bfc1 -r 7349f4473e7f src/coding.c --- a/src/coding.c Wed May 28 11:36:19 2003 +0000 +++ b/src/coding.c Wed May 28 11:36:37 2003 +0000 @@ -701,26 +701,6 @@ 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 @@ } 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 @@ *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 @@ 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 @@ { 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 @@ 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 @@ { if (pos == stop) { - int *p; - if (pos == end_pos) break; if (pos == stop_composition) @@ -5993,9 +6038,16 @@ } 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 @@ } } *buf++ = c; - pos++; } coding->consumed = src - coding->source; @@ -6081,9 +6132,10 @@ 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 @@ 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; - - if (NILP (Vcode_conversion_work_buf_list)) + Lisp_Object buf, name; + + 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]; - - sprintf (str, " *code-conversion-work*<%d>", depth); - Vcode_conversion_work_buf_list - = Fcons (Fget_buffer_create (build_string (str)), - Vcode_conversion_work_buf_list); - } - - buf = XCAR (Vcode_conversion_work_buf_list); + 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); + name = build_string (str); + } + buf = Fget_buffer_create (name); + } set_buffer_internal (XBUFFER (buf)); current_buffer->undo_list = Qt; Ferase_buffer (); @@ -6129,30 +6184,42 @@ 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; - - 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); + Lisp_Object workbuf; + + 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 @@ EMACS_INT chars, bytes; { int count = specpdl_ptr - specpdl; - - saved_coding = coding; - record_unwind_protect (code_conversion_restore, save_excursion_save ()); - - coding->src_object = Fcurrent_buffer (); + Lisp_Object buffer; + + buffer = Fcurrent_buffer (); + code_conversion_save (buffer, 0, 0); + + coding->src_object = buffer; coding->src_chars = chars; coding->src_bytes = bytes; coding->src_pos = -chars; @@ -6193,10 +6261,9 @@ 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 @@ EMACS_INT chars = to - from; EMACS_INT bytes = to_byte - from_byte; Lisp_Object attrs; - - saved_coding = coding; - record_unwind_protect (code_conversion_restore, save_excursion_save ()); + Lisp_Object buffer; + int saved_pt = -1, saved_pt_byte; + + buffer = Fcurrent_buffer (); if (NILP (dst_object)) { @@ -6284,6 +6352,7 @@ 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 @@ || (! 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 @@ } else { + code_conversion_save (buffer, 0, 0); coding->dst_object = Qnil; coding->dst_multibyte = 1; } @@ -6368,6 +6439,25 @@ } } + 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 @@ EMACS_INT chars = to - from; EMACS_INT bytes = to_byte - from_byte; Lisp_Object attrs; - - saved_coding = coding; - record_unwind_protect (code_conversion_restore, save_excursion_save ()); + Lisp_Object buffer; + int saved_pt = -1, saved_pt_byte; + + buffer = Fcurrent_buffer (); coding->src_object = src_object; coding->src_chars = chars; @@ -6397,7 +6488,8 @@ 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 @@ 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 @@ } 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 @@ coding->src_pos_byte = from_byte; } } + else + code_conversion_save (buffer, 0, 0); if (BUFFERP (dst_object)) { @@ -6493,6 +6591,25 @@ } } + 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 @@ 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 @@ 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;