Mercurial > emacs
comparison src/coding.c @ 107171:dfc03b454687
Fix the ccl decoder for the case that the output buffer is fullfilled.
| author | Kenichi Handa <handa@m17n.org> |
|---|---|
| date | Wed, 17 Feb 2010 15:47:32 +0900 |
| parents | d6e8fa5622b7 |
| children | e98bd64897e0 |
comparison
equal
deleted
inserted
replaced
| 107163:d0c70cf98fc8 | 107171:dfc03b454687 |
|---|---|
| 5218 const unsigned char *src_end = coding->source + coding->src_bytes; | 5218 const unsigned char *src_end = coding->source + coding->src_bytes; |
| 5219 int *charbuf = coding->charbuf + coding->charbuf_used; | 5219 int *charbuf = coding->charbuf + coding->charbuf_used; |
| 5220 int *charbuf_end = coding->charbuf + coding->charbuf_size; | 5220 int *charbuf_end = coding->charbuf + coding->charbuf_size; |
| 5221 int consumed_chars = 0; | 5221 int consumed_chars = 0; |
| 5222 int multibytep = coding->src_multibyte; | 5222 int multibytep = coding->src_multibyte; |
| 5223 struct ccl_program ccl; | 5223 struct ccl_program *ccl = &coding->spec.ccl->ccl; |
| 5224 int source_charbuf[1024]; | 5224 int source_charbuf[1024]; |
| 5225 int source_byteidx[1024]; | 5225 int source_byteidx[1024]; |
| 5226 Lisp_Object attrs, charset_list; | 5226 Lisp_Object attrs, charset_list; |
| 5227 | 5227 |
| 5228 CODING_GET_INFO (coding, attrs, charset_list); | 5228 CODING_GET_INFO (coding, attrs, charset_list); |
| 5229 setup_ccl_program (&ccl, CODING_CCL_DECODER (coding)); | 5229 |
| 5230 | 5230 while (1) |
| 5231 while (src < src_end) | |
| 5232 { | 5231 { |
| 5233 const unsigned char *p = src; | 5232 const unsigned char *p = src; |
| 5234 int *source, *source_end; | |
| 5235 int i = 0; | 5233 int i = 0; |
| 5236 | 5234 |
| 5237 if (multibytep) | 5235 if (multibytep) |
| 5238 while (i < 1024 && p < src_end) | 5236 while (i < 1024 && p < src_end) |
| 5239 { | 5237 { |
| 5243 else | 5241 else |
| 5244 while (i < 1024 && p < src_end) | 5242 while (i < 1024 && p < src_end) |
| 5245 source_charbuf[i++] = *p++; | 5243 source_charbuf[i++] = *p++; |
| 5246 | 5244 |
| 5247 if (p == src_end && coding->mode & CODING_MODE_LAST_BLOCK) | 5245 if (p == src_end && coding->mode & CODING_MODE_LAST_BLOCK) |
| 5248 ccl.last_block = 1; | 5246 ccl->last_block = 1; |
| 5249 | 5247 ccl_driver (ccl, source_charbuf, charbuf, i, charbuf_end - charbuf, |
| 5250 source = source_charbuf; | 5248 charset_list); |
| 5251 source_end = source + i; | 5249 charbuf += ccl->produced; |
| 5252 while (source < source_end) | 5250 if (multibytep && ccl->consumed < i) |
| 5253 { | 5251 src += source_byteidx[ccl->consumed]; |
| 5254 ccl_driver (&ccl, source, charbuf, | |
| 5255 source_end - source, charbuf_end - charbuf, | |
| 5256 charset_list); | |
| 5257 source += ccl.consumed; | |
| 5258 charbuf += ccl.produced; | |
| 5259 if (ccl.status != CCL_STAT_SUSPEND_BY_DST) | |
| 5260 break; | |
| 5261 } | |
| 5262 if (source < source_end) | |
| 5263 src += source_byteidx[source - source_charbuf]; | |
| 5264 else | 5252 else |
| 5265 src = p; | 5253 src += ccl->consumed; |
| 5266 consumed_chars += source - source_charbuf; | 5254 consumed_chars += ccl->consumed; |
| 5267 | 5255 if (p == src_end || ccl->status != CCL_STAT_SUSPEND_BY_SRC) |
| 5268 if (ccl.status != CCL_STAT_SUSPEND_BY_SRC | |
| 5269 && ccl.status != CODING_RESULT_INSUFFICIENT_SRC) | |
| 5270 break; | 5256 break; |
| 5271 } | 5257 } |
| 5272 | 5258 |
| 5273 switch (ccl.status) | 5259 switch (ccl->status) |
| 5274 { | 5260 { |
| 5275 case CCL_STAT_SUSPEND_BY_SRC: | 5261 case CCL_STAT_SUSPEND_BY_SRC: |
| 5276 record_conversion_result (coding, CODING_RESULT_INSUFFICIENT_SRC); | 5262 record_conversion_result (coding, CODING_RESULT_INSUFFICIENT_SRC); |
| 5277 break; | 5263 break; |
| 5278 case CCL_STAT_SUSPEND_BY_DST: | 5264 case CCL_STAT_SUSPEND_BY_DST: |
| 5265 record_conversion_result (coding, CODING_RESULT_INSUFFICIENT_DST); | |
| 5279 break; | 5266 break; |
| 5280 case CCL_STAT_QUIT: | 5267 case CCL_STAT_QUIT: |
| 5281 case CCL_STAT_INVALID_CMD: | 5268 case CCL_STAT_INVALID_CMD: |
| 5282 record_conversion_result (coding, CODING_RESULT_INTERRUPT); | 5269 record_conversion_result (coding, CODING_RESULT_INTERRUPT); |
| 5283 break; | 5270 break; |
| 7115 struct coding_system *coding; | 7102 struct coding_system *coding; |
| 7116 { | 7103 { |
| 7117 Lisp_Object attrs; | 7104 Lisp_Object attrs; |
| 7118 Lisp_Object undo_list; | 7105 Lisp_Object undo_list; |
| 7119 Lisp_Object translation_table; | 7106 Lisp_Object translation_table; |
| 7107 struct ccl_spec cclspec; | |
| 7120 int carryover; | 7108 int carryover; |
| 7121 int i; | 7109 int i; |
| 7122 | 7110 |
| 7123 if (BUFFERP (coding->src_object) | 7111 if (BUFFERP (coding->src_object) |
| 7124 && coding->src_pos > 0 | 7112 && coding->src_pos > 0 |
| 7147 | 7135 |
| 7148 attrs = CODING_ID_ATTRS (coding->id); | 7136 attrs = CODING_ID_ATTRS (coding->id); |
| 7149 translation_table = get_translation_table (attrs, 0, NULL); | 7137 translation_table = get_translation_table (attrs, 0, NULL); |
| 7150 | 7138 |
| 7151 carryover = 0; | 7139 carryover = 0; |
| 7140 if (coding->decoder == decode_coding_ccl) | |
| 7141 { | |
| 7142 coding->spec.ccl = &cclspec; | |
| 7143 setup_ccl_program (&cclspec.ccl, CODING_CCL_DECODER (coding)); | |
| 7144 } | |
| 7152 do | 7145 do |
| 7153 { | 7146 { |
| 7154 EMACS_INT pos = coding->dst_pos + coding->produced_char; | 7147 EMACS_INT pos = coding->dst_pos + coding->produced_char; |
| 7155 | 7148 |
| 7156 coding_set_source (coding); | 7149 coding_set_source (coding); |
| 7163 produce_annotation (coding, pos); | 7156 produce_annotation (coding, pos); |
| 7164 for (i = 0; i < carryover; i++) | 7157 for (i = 0; i < carryover; i++) |
| 7165 coding->charbuf[i] | 7158 coding->charbuf[i] |
| 7166 = coding->charbuf[coding->charbuf_used - carryover + i]; | 7159 = coding->charbuf[coding->charbuf_used - carryover + i]; |
| 7167 } | 7160 } |
| 7168 while (coding->consumed < coding->src_bytes | 7161 while (coding->result == CODING_RESULT_INSUFFICIENT_DST |
| 7169 && (coding->result == CODING_RESULT_SUCCESS | 7162 || (coding->consumed < coding->src_bytes |
| 7170 || coding->result == CODING_RESULT_INVALID_SRC)); | 7163 && (coding->result == CODING_RESULT_SUCCESS |
| 7164 || coding->result == CODING_RESULT_INVALID_SRC))); | |
| 7171 | 7165 |
| 7172 if (carryover > 0) | 7166 if (carryover > 0) |
| 7173 { | 7167 { |
| 7174 coding_set_destination (coding); | 7168 coding_set_destination (coding); |
| 7175 coding->charbuf_used = carryover; | 7169 coding->charbuf_used = carryover; |
