X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/131a3a12c4b0171c71c122c3330f85fc19e9bb8f..HEAD:/src/coding.c diff --git a/src/coding.c b/src/coding.c index 16dc37a3f2..fc21795bdb 100644 --- a/src/coding.c +++ b/src/coding.c @@ -1549,8 +1549,8 @@ encode_coding_utf_8 (struct coding_system *coding) *dst++ = CHAR_TO_BYTE8 (c); else CHAR_STRING_ADVANCE_NO_UNIFY (c, dst); - produced_chars++; } + produced_chars = dst - (coding->destination + coding->produced); } record_conversion_result (coding, CODING_RESULT_SUCCESS); coding->produced_char += produced_chars; @@ -7265,13 +7265,16 @@ produce_charset (struct coding_system *coding, int *charbuf, ptrdiff_t pos) coding->dst_object); } +#define MAX_CHARBUF_SIZE 0x4000 +#define MIN_CHARBUF_SIZE 0x10 -#define CHARBUF_SIZE 0x4000 - -#define ALLOC_CONVERSION_WORK_AREA(coding) \ - do { \ - coding->charbuf = SAFE_ALLOCA (CHARBUF_SIZE * sizeof (int)); \ - coding->charbuf_size = CHARBUF_SIZE; \ +#define ALLOC_CONVERSION_WORK_AREA(coding, size) \ + do { \ + int units = ((size) > MAX_CHARBUF_SIZE ? MAX_CHARBUF_SIZE \ + : (size) < MIN_CHARBUF_SIZE ? MIN_CHARBUF_SIZE \ + : size); \ + coding->charbuf = SAFE_ALLOCA ((units) * sizeof (int)); \ + coding->charbuf_size = (units); \ } while (0) @@ -7373,7 +7376,7 @@ decode_coding (struct coding_system *coding) record_conversion_result (coding, CODING_RESULT_SUCCESS); coding->errors = 0; - ALLOC_CONVERSION_WORK_AREA (coding); + ALLOC_CONVERSION_WORK_AREA (coding, coding->src_bytes); attrs = CODING_ID_ATTRS (coding->id); translation_table = get_translation_table (attrs, 0, NULL); @@ -7769,7 +7772,7 @@ encode_coding (struct coding_system *coding) record_conversion_result (coding, CODING_RESULT_SUCCESS); coding->errors = 0; - ALLOC_CONVERSION_WORK_AREA (coding); + ALLOC_CONVERSION_WORK_AREA (coding, coding->src_chars); if (coding->encoder == encode_coding_ccl) { @@ -7876,7 +7879,7 @@ void decode_coding_gap (struct coding_system *coding, ptrdiff_t chars, ptrdiff_t bytes) { - ptrdiff_t count = SPECPDL_INDEX (); + dynwind_begin (); Lisp_Object attrs; coding->src_object = Fcurrent_buffer (); @@ -7970,6 +7973,7 @@ decode_coding_gap (struct coding_system *coding, coding->produced = bytes; coding->produced_char = chars; insert_from_gap (chars, bytes, 1); + dynwind_end (); return; } } @@ -7993,7 +7997,7 @@ decode_coding_gap (struct coding_system *coding, coding->produced += Z_BYTE - prev_Z_BYTE; } - unbind_to (count, Qnil); + dynwind_end (); } @@ -8033,7 +8037,7 @@ decode_coding_object (struct coding_system *coding, ptrdiff_t to, ptrdiff_t to_byte, Lisp_Object dst_object) { - ptrdiff_t count = SPECPDL_INDEX (); + dynwind_begin (); unsigned char *destination IF_LINT (= NULL); ptrdiff_t dst_bytes IF_LINT (= 0); ptrdiff_t chars = to - from; @@ -8206,7 +8210,7 @@ decode_coding_object (struct coding_system *coding, } Vdeactivate_mark = old_deactivate_mark; - unbind_to (count, coding->dst_object); + dynwind_end (); } @@ -8217,7 +8221,7 @@ encode_coding_object (struct coding_system *coding, ptrdiff_t to, ptrdiff_t to_byte, Lisp_Object dst_object) { - ptrdiff_t count = SPECPDL_INDEX (); + dynwind_begin (); ptrdiff_t chars = to - from; ptrdiff_t bytes = to_byte - from_byte; Lisp_Object attrs; @@ -8339,7 +8343,7 @@ encode_coding_object (struct coding_system *coding, { ptrdiff_t dst_bytes = max (1, coding->src_chars); coding->dst_object = Qnil; - coding->destination = xmalloc (dst_bytes); + coding->destination = xmalloc_atomic (dst_bytes); coding->dst_bytes = dst_bytes; coding->dst_multibyte = 0; } @@ -8415,7 +8419,7 @@ encode_coding_object (struct coding_system *coding, Fkill_buffer (coding->src_object); Vdeactivate_mark = old_deactivate_mark; - unbind_to (count, Qnil); + dynwind_end (); } @@ -8513,7 +8517,7 @@ are lower-case). */) (Lisp_Object prompt, Lisp_Object default_coding_system) { Lisp_Object val; - ptrdiff_t count = SPECPDL_INDEX (); + dynwind_begin (); if (SYMBOLP (default_coding_system)) default_coding_system = SYMBOL_NAME (default_coding_system); @@ -8521,7 +8525,7 @@ are lower-case). */) val = Fcompleting_read (prompt, Vcoding_system_alist, Qnil, Qt, Qnil, Qcoding_system_history, default_coding_system, Qnil); - unbind_to (count, Qnil); + dynwind_end (); return (SCHARS (val) == 0 ? Qnil : Fintern (val, Qnil)); } @@ -9091,8 +9095,7 @@ DEFUN ("find-coding-systems-region-internal", DEFUN ("unencodable-char-position", Funencodable_char_position, Sunencodable_char_position, 3, 5, 0, - doc: /* -Return position of first un-encodable character in a region. + doc: /* Return position of first un-encodable character in a region. START and END specify the region and CODING-SYSTEM specifies the encoding to check. Return nil if CODING-SYSTEM does encode the region. @@ -9102,8 +9105,9 @@ list of positions. If optional 5th argument STRING is non-nil, it is a string to search for un-encodable characters. In that case, START and END are indexes -to the string. */) - (Lisp_Object start, Lisp_Object end, Lisp_Object coding_system, Lisp_Object count, Lisp_Object string) +to the string and treated as in `substring'. */) + (Lisp_Object start, Lisp_Object end, Lisp_Object coding_system, + Lisp_Object count, Lisp_Object string) { EMACS_INT n; struct coding_system coding; @@ -9140,12 +9144,7 @@ to the string. */) else { CHECK_STRING (string); - CHECK_NATNUM (start); - CHECK_NATNUM (end); - if (! (XINT (start) <= XINT (end) && XINT (end) <= SCHARS (string))) - args_out_of_range_3 (string, start, end); - from = XINT (start); - to = XINT (end); + validate_subarray (string, start, end, SCHARS (string), &from, &to); if (! STRING_MULTIBYTE (string)) return Qnil; p = SDATA (string) + string_char_to_byte (string, from); @@ -10799,6 +10798,8 @@ init_coding_once (void) void syms_of_coding (void) { +#include "coding.x" + staticpro (&Vcoding_system_hash_table); { Lisp_Object args[2]; @@ -10960,39 +10961,6 @@ syms_of_coding (void) DEFSYM (Qinterrupted, "interrupted"); DEFSYM (Qcoding_system_define_form, "coding-system-define-form"); - defsubr (&Scoding_system_p); - defsubr (&Sread_coding_system); - defsubr (&Sread_non_nil_coding_system); - defsubr (&Scheck_coding_system); - defsubr (&Sdetect_coding_region); - defsubr (&Sdetect_coding_string); - defsubr (&Sfind_coding_systems_region_internal); - defsubr (&Sunencodable_char_position); - defsubr (&Scheck_coding_systems_region); - defsubr (&Sdecode_coding_region); - defsubr (&Sencode_coding_region); - defsubr (&Sdecode_coding_string); - defsubr (&Sencode_coding_string); - defsubr (&Sdecode_sjis_char); - defsubr (&Sencode_sjis_char); - defsubr (&Sdecode_big5_char); - defsubr (&Sencode_big5_char); - defsubr (&Sset_terminal_coding_system_internal); - defsubr (&Sset_safe_terminal_coding_system_internal); - defsubr (&Sterminal_coding_system); - defsubr (&Sset_keyboard_coding_system_internal); - defsubr (&Skeyboard_coding_system); - defsubr (&Sfind_operation_coding_system); - defsubr (&Sset_coding_system_priority); - defsubr (&Sdefine_coding_system_internal); - defsubr (&Sdefine_coding_system_alias); - defsubr (&Scoding_system_put); - defsubr (&Scoding_system_base); - defsubr (&Scoding_system_plist); - defsubr (&Scoding_system_aliases); - defsubr (&Scoding_system_eol_type); - defsubr (&Scoding_system_priority_list); - DEFVAR_LISP ("coding-system-list", Vcoding_system_list, doc: /* List of coding systems.