comparison src/coding.c @ 65506:f376635f5061

(code_convert_region_unwind): Argument format changed. (run_pre_post_conversion_on_str): If pre-write-conversion function changed the current buffer, delete the new buffer. (run_pre_write_conversin_on_c_str): Likewise.
author Kenichi Handa <handa@m17n.org>
date Wed, 14 Sep 2005 07:05:43 +0000
parents a0d1312ede66
children 3e443750ea4c d84f940244dc
comparison
equal deleted inserted replaced
65505:f8283f171a8f 65506:f376635f5061
5351 if (encodep) shrink_encoding_region (beg, end, coding, str); \ 5351 if (encodep) shrink_encoding_region (beg, end, coding, str); \
5352 else shrink_decoding_region (beg, end, coding, str); \ 5352 else shrink_decoding_region (beg, end, coding, str); \
5353 } \ 5353 } \
5354 } while (0) 5354 } while (0)
5355 5355
5356 /* ARG is (CODING . BUFFER) where CODING is what to be set in 5356 /* ARG is (CODING BUFFER ...) where CODING is what to be set in
5357 Vlast_coding_system_used and BUFFER if non-nil is a buffer to 5357 Vlast_coding_system_used and the remaining elements are buffers to
5358 kill. */ 5358 kill. */
5359 static Lisp_Object 5359 static Lisp_Object
5360 code_convert_region_unwind (arg) 5360 code_convert_region_unwind (arg)
5361 Lisp_Object arg; 5361 Lisp_Object arg;
5362 { 5362 {
5363 inhibit_pre_post_conversion = 0; 5363 inhibit_pre_post_conversion = 0;
5364 Vlast_coding_system_used = XCAR (arg); 5364 Vlast_coding_system_used = XCAR (arg);
5365 if (! NILP (XCDR (arg))) 5365 for (arg = XCDR (arg); ! NILP (arg); arg = XCDR (arg))
5366 Fkill_buffer (XCDR (arg)); 5366 Fkill_buffer (XCAR (arg));
5367 return Qnil; 5367 return Qnil;
5368 } 5368 }
5369 5369
5370 /* Store information about all compositions in the range FROM and TO 5370 /* Store information about all compositions in the range FROM and TO
5371 of OBJ in memory blocks pointed by CODING->cmp_data. OBJ is a 5371 of OBJ in memory blocks pointed by CODING->cmp_data. OBJ is a
6079 int count = SPECPDL_INDEX (); 6079 int count = SPECPDL_INDEX ();
6080 struct gcpro gcpro1, gcpro2; 6080 struct gcpro gcpro1, gcpro2;
6081 int multibyte = STRING_MULTIBYTE (str); 6081 int multibyte = STRING_MULTIBYTE (str);
6082 Lisp_Object old_deactivate_mark; 6082 Lisp_Object old_deactivate_mark;
6083 Lisp_Object buffer_to_kill; 6083 Lisp_Object buffer_to_kill;
6084 Lisp_Object unwind_arg;
6084 6085
6085 record_unwind_protect (Fset_buffer, Fcurrent_buffer ()); 6086 record_unwind_protect (Fset_buffer, Fcurrent_buffer ());
6086 /* It is not crucial to specbind this. */ 6087 /* It is not crucial to specbind this. */
6087 old_deactivate_mark = Vdeactivate_mark; 6088 old_deactivate_mark = Vdeactivate_mark;
6088 GCPRO2 (str, old_deactivate_mark); 6089 GCPRO2 (str, old_deactivate_mark);
6089 6090
6090 /* We must insert the contents of STR as is without 6091 /* We must insert the contents of STR as is without
6091 unibyte<->multibyte conversion. For that, we adjust the 6092 unibyte<->multibyte conversion. For that, we adjust the
6092 multibyteness of the working buffer to that of STR. */ 6093 multibyteness of the working buffer to that of STR. */
6093 buffer_to_kill = set_conversion_work_buffer (multibyte); 6094 buffer_to_kill = set_conversion_work_buffer (multibyte);
6094 record_unwind_protect (code_convert_region_unwind, 6095 if (NILP (buffer_to_kill))
6095 Fcons (Vlast_coding_system_used, buffer_to_kill)); 6096 unwind_arg = Fcons (Vlast_coding_system_used, Qnil);
6097 else
6098 unwind_arg = list2 (Vlast_coding_system_used, buffer_to_kill);
6099 record_unwind_protect (code_convert_region_unwind, unwind_arg);
6096 6100
6097 insert_from_string (str, 0, 0, 6101 insert_from_string (str, 0, 0,
6098 SCHARS (str), SBYTES (str), 0); 6102 SCHARS (str), SBYTES (str), 0);
6099 UNGCPRO; 6103 UNGCPRO;
6100 inhibit_pre_post_conversion = 1; 6104 inhibit_pre_post_conversion = 1;
6101 if (encodep) 6105 if (encodep)
6102 call2 (coding->pre_write_conversion, make_number (BEG), make_number (Z)); 6106 {
6107 struct buffer *prev = current_buffer;
6108
6109 call2 (coding->pre_write_conversion, make_number (BEG), make_number (Z));
6110 if (prev != current_buffer)
6111 /* We must kill the current buffer too. */
6112 Fsetcdr (unwind_arg, Fcons (Fcurrent_buffer (), XCDR (unwind_arg)));
6113 }
6103 else 6114 else
6104 { 6115 {
6105 Vlast_coding_system_used = coding->symbol; 6116 Vlast_coding_system_used = coding->symbol;
6106 TEMP_SET_PT_BOTH (BEG, BEG_BYTE); 6117 TEMP_SET_PT_BOTH (BEG, BEG_BYTE);
6107 call1 (coding->post_read_conversion, make_number (Z - BEG)); 6118 call1 (coding->post_read_conversion, make_number (Z - BEG));
6131 int *size, nchars, nbytes; 6142 int *size, nchars, nbytes;
6132 struct coding_system *coding; 6143 struct coding_system *coding;
6133 { 6144 {
6134 struct gcpro gcpro1, gcpro2; 6145 struct gcpro gcpro1, gcpro2;
6135 struct buffer *cur = current_buffer; 6146 struct buffer *cur = current_buffer;
6147 struct buffer *prev;
6136 Lisp_Object old_deactivate_mark, old_last_coding_system_used; 6148 Lisp_Object old_deactivate_mark, old_last_coding_system_used;
6137 Lisp_Object args[3]; 6149 Lisp_Object args[3];
6138 Lisp_Object buffer_to_kill; 6150 Lisp_Object buffer_to_kill;
6139 6151
6140 /* It is not crucial to specbind this. */ 6152 /* It is not crucial to specbind this. */
6147 multibyteness of the working buffer to that of STR. */ 6159 multibyteness of the working buffer to that of STR. */
6148 buffer_to_kill = set_conversion_work_buffer (coding->src_multibyte); 6160 buffer_to_kill = set_conversion_work_buffer (coding->src_multibyte);
6149 insert_1_both (*str, nchars, nbytes, 0, 0, 0); 6161 insert_1_both (*str, nchars, nbytes, 0, 0, 0);
6150 UNGCPRO; 6162 UNGCPRO;
6151 inhibit_pre_post_conversion = 1; 6163 inhibit_pre_post_conversion = 1;
6164 prev = current_buffer;
6152 args[0] = coding->pre_write_conversion; 6165 args[0] = coding->pre_write_conversion;
6153 args[1] = make_number (BEG); 6166 args[1] = make_number (BEG);
6154 args[2] = make_number (Z); 6167 args[2] = make_number (Z);
6155 safe_call (3, args); 6168 safe_call (3, args);
6156 inhibit_pre_post_conversion = 0; 6169 inhibit_pre_post_conversion = 0;
6166 if (BEG < GPT && GPT < Z) 6179 if (BEG < GPT && GPT < Z)
6167 move_gap (BEG); 6180 move_gap (BEG);
6168 bcopy (BEG_ADDR, *str, coding->produced); 6181 bcopy (BEG_ADDR, *str, coding->produced);
6169 coding->src_multibyte 6182 coding->src_multibyte
6170 = ! NILP (current_buffer->enable_multibyte_characters); 6183 = ! NILP (current_buffer->enable_multibyte_characters);
6184 if (prev != current_buffer)
6185 Fkill_buffer (Fcurrent_buffer ());
6171 set_buffer_internal (cur); 6186 set_buffer_internal (cur);
6172 if (! NILP (buffer_to_kill)) 6187 if (! NILP (buffer_to_kill))
6173 Fkill_buffer (buffer_to_kill); 6188 Fkill_buffer (buffer_to_kill);
6174 } 6189 }
6175 6190