diff options
author | Kenichi Handa <handa@m17n.org> | 2003-05-29 13:17:04 +0000 |
---|---|---|
committer | Kenichi Handa <handa@m17n.org> | 2003-05-29 13:17:04 +0000 |
commit | 5e5c78beb4172678f8318c6cfdced304fef94022 (patch) | |
tree | 58ab0aedeffee49eb23841f6bd58ab71d3ed1c83 | |
parent | 81f41166afbb0912a83aa05e11a194a832f44257 (diff) | |
download | emacs-5e5c78beb4172678f8318c6cfdced304fef94022.tar.gz emacs-5e5c78beb4172678f8318c6cfdced304fef94022.tar.bz2 emacs-5e5c78beb4172678f8318c6cfdced304fef94022.zip |
(setup_coding_system): If coding has
post-read-conversion or pre-write-conversion, set
CODING_REQUIRE_DECODING_MASK and CODING_REQUIRE_ENCODING_MASK
respectively.
(decode_coding_gap): Run post-read-conversion if any.
-rw-r--r-- | src/coding.c | 24 |
1 files changed, 23 insertions, 1 deletions
diff --git a/src/coding.c b/src/coding.c index 30c04ae0e3d..8e5efe82746 100644 --- a/src/coding.c +++ b/src/coding.c @@ -4823,6 +4823,10 @@ setup_coding_system (coding_system, coding) coding->head_ascii = -1; coding->common_flags = (VECTORP (eol_type) ? CODING_REQUIRE_DETECTION_MASK : 0); + if (! NILP (CODING_ATTR_POST_READ (attrs))) + coding->common_flags |= CODING_REQUIRE_DECODING_MASK; + if (! NILP (CODING_ATTR_PRE_WRITE (attrs))) + coding->common_flags |= CODING_REQUIRE_ENCODING_MASK; val = CODING_ATTR_SAFE_CHARSETS (attrs); coding->max_charset_id = XSTRING (val)->size - 1; @@ -6227,6 +6231,7 @@ decode_coding_gap (coding, chars, bytes) EMACS_INT chars, bytes; { int count = specpdl_ptr - specpdl; + Lisp_Object attrs; Lisp_Object buffer; buffer = Fcurrent_buffer (); @@ -6238,7 +6243,7 @@ decode_coding_gap (coding, chars, bytes) coding->src_pos = -chars; coding->src_pos_byte = -bytes; coding->src_multibyte = chars < bytes; - coding->dst_object = coding->src_object; + coding->dst_object = buffer; coding->dst_pos = PT; coding->dst_pos_byte = PT_BYTE; coding->dst_multibyte = ! NILP (current_buffer->enable_multibyte_characters); @@ -6249,6 +6254,23 @@ decode_coding_gap (coding, chars, bytes) decode_coding (coding); + attrs = CODING_ID_ATTRS (coding->id); + if (! NILP (CODING_ATTR_POST_READ (attrs))) + { + struct gcpro gcpro1; + EMACS_INT prev_Z = Z, prev_Z_BYTE = Z_BYTE; + Lisp_Object val; + + TEMP_SET_PT_BOTH (coding->dst_pos, coding->dst_pos_byte); + GCPRO1 (buffer); + val = call1 (CODING_ATTR_POST_READ (attrs), + make_number (coding->produced_char)); + UNGCPRO; + CHECK_NATNUM (val); + coding->produced_char += Z - prev_Z; + coding->produced += Z_BYTE - prev_Z_BYTE; + } + unbind_to (count, Qnil); return coding->result; } |