X-Git-Url: http://git.hcoop.net/bpt/emacs.git/blobdiff_plain/131a3a12c4b0171c71c122c3330f85fc19e9bb8f..2bfa3d3e1fb347ba76bddf77f3e288049635821d:/src/composite.c?ds=sidebyside diff --git a/src/composite.c b/src/composite.c index 5e14ad037a..b75ac99cfb 100644 --- a/src/composite.c +++ b/src/composite.c @@ -327,7 +327,7 @@ get_composition_id (ptrdiff_t charpos, ptrdiff_t bytepos, ptrdiff_t nchars, cmp->method = method; cmp->hash_index = hash_index; cmp->glyph_len = glyph_len; - cmp->offsets = xnmalloc (glyph_len, 2 * sizeof *cmp->offsets); + cmp->offsets = xnmalloc_atomic (glyph_len, 2 * sizeof *cmp->offsets); cmp->font = NULL; if (cmp->method != COMPOSITION_WITH_RULE_ALTCHARS) @@ -582,7 +582,7 @@ update_compositions (ptrdiff_t from, ptrdiff_t to, int check_mask) } if (min_pos < max_pos) { - ptrdiff_t count = SPECPDL_INDEX (); + dynwind_begin (); specbind (Qinhibit_read_only, Qt); specbind (Qinhibit_modification_hooks, Qt); @@ -590,7 +590,7 @@ update_compositions (ptrdiff_t from, ptrdiff_t to, int check_mask) Fremove_list_of_text_properties (make_number (min_pos), make_number (max_pos), list1 (Qauto_composed), Qnil); - unbind_to (count, Qnil); + dynwind_end (); } } @@ -869,7 +869,7 @@ autocmp_chars (Lisp_Object rule, ptrdiff_t charpos, ptrdiff_t bytepos, ptrdiff_t limit, struct window *win, struct face *face, Lisp_Object string) { - ptrdiff_t count = SPECPDL_INDEX (); + dynwind_begin (); struct frame *f = XFRAME (win->frame); Lisp_Object pos = make_number (charpos); ptrdiff_t to; @@ -881,8 +881,11 @@ autocmp_chars (Lisp_Object rule, ptrdiff_t charpos, ptrdiff_t bytepos, re = AREF (rule, 0); if (NILP (re)) len = 1; - else if (! STRINGP (re)) - return unbind_to (count, Qnil); + else if (! STRINGP (re)){ + + dynwind_end (); + return Qnil; + } else if ((len = fast_looking_at (re, charpos, bytepos, limit, -1, string)) > 0) { @@ -891,8 +894,11 @@ autocmp_chars (Lisp_Object rule, ptrdiff_t charpos, ptrdiff_t bytepos, else len = string_byte_to_char (string, bytepos + len) - charpos; } - if (len <= 0) - return unbind_to (count, Qnil); + if (len <= 0){ + + dynwind_end (); + return Qnil; + } to = limit = charpos + len; #ifdef HAVE_WINDOW_SYSTEM if (FRAME_WINDOW_P (f)) @@ -901,8 +907,11 @@ autocmp_chars (Lisp_Object rule, ptrdiff_t charpos, ptrdiff_t bytepos, if (! FONT_OBJECT_P (font_object) || (! NILP (re) && to < limit - && (fast_looking_at (re, charpos, bytepos, to, -1, string) <= 0))) - return unbind_to (count, Qnil); + && (fast_looking_at (re, charpos, bytepos, to, -1, string) <= 0))){ + + dynwind_end (); + return Qnil; + } } else #endif /* not HAVE_WINDOW_SYSTEM */ @@ -918,7 +927,8 @@ autocmp_chars (Lisp_Object rule, ptrdiff_t charpos, ptrdiff_t bytepos, lgstring = safe_call (6, Vauto_composition_function, AREF (rule, 2), pos, make_number (to), font_object, string); } - return unbind_to (count, lgstring); + dynwind_end (); + return lgstring; } /* 1 iff the character C is composable. Characters of general @@ -1684,9 +1694,10 @@ Otherwise (for terminal display), FONT-OBJECT must be a terminal ID, a frame, or nil for the selected frame's terminal device. If the optional 4th argument STRING is not nil, it is a string -containing the target characters between indices FROM and TO. -Otherwise FROM and TO are character positions in current buffer; -they can be in either order, and can be integers or markers. +containing the target characters between indices FROM and TO, +which are treated as in `substring'. Otherwise FROM and TO are +character positions in current buffer; they can be in either order, +and can be integers or markers. A glyph-string is a vector containing information about how to display a specific character sequence. The format is: @@ -1742,15 +1753,10 @@ should be ignored. */) } else { - CHECK_NATNUM (from); - CHECK_NATNUM (to); CHECK_STRING (string); + validate_subarray (string, from, to, SCHARS (string), &frompos, &topos); if (! STRING_MULTIBYTE (string)) error ("Attempt to shape unibyte text"); - if (! (XINT (from) <= XINT (to) && XINT (to) <= SCHARS (string))) - args_out_of_range_3 (string, from, to); - frompos = XFASTINT (from); - topos = XFASTINT (to); frombyte = string_char_to_byte (string, frompos); } @@ -1795,21 +1801,18 @@ DEFUN ("compose-string-internal", Fcompose_string_internal, Scompose_string_internal, 3, 5, 0, doc: /* Internal use only. -Compose text between indices START and END of STRING. -Optional 4th and 5th arguments are COMPONENTS and MODIFICATION-FUNC +Compose text between indices START and END of STRING, where +START and END are treated as in `substring'. Optional 4th +and 5th arguments are COMPONENTS and MODIFICATION-FUNC for the composition. See `compose-string' for more details. */) - (Lisp_Object string, Lisp_Object start, Lisp_Object end, Lisp_Object components, Lisp_Object modification_func) + (Lisp_Object string, Lisp_Object start, Lisp_Object end, + Lisp_Object components, Lisp_Object modification_func) { - CHECK_STRING (string); - CHECK_NUMBER (start); - CHECK_NUMBER (end); - - if (XINT (start) < 0 || - XINT (start) > XINT (end) - || XINT (end) > SCHARS (string)) - args_out_of_range (start, end); + ptrdiff_t from, to; - compose_text (XINT (start), XINT (end), components, modification_func, string); + CHECK_STRING (string); + validate_subarray (string, start, end, SCHARS (string), &from, &to); + compose_text (from, to, components, modification_func, string); return string; } @@ -1903,6 +1906,8 @@ syms_of_composite (void) { int i; +#include "composite.x" + DEFSYM (Qcomposition, "composition"); /* Make a hash table for static composition. */ @@ -2015,9 +2020,4 @@ GSTRING, or modify GSTRING itself and return it. See also the documentation of `auto-composition-mode'. */); Vcomposition_function_table = Fmake_char_table (Qnil, Qnil); - - defsubr (&Scompose_region_internal); - defsubr (&Scompose_string_internal); - defsubr (&Sfind_composition_internal); - defsubr (&Scomposition_get_gstring); }