use dynwind_begin and dynwind_end
[bpt/emacs.git] / src / composite.c
index 5e14ad0..b75ac99 100644 (file)
@@ -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);
 }