(stuff_char) [PROTOTYPES]: Provide ISO C arglist.
[bpt/emacs.git] / src / composite.c
index 04836fb..56acce6 100644 (file)
@@ -1,6 +1,7 @@
 /* Composite sequence support.
    Copyright (C) 1999 Electrotechnical Laboratory, JAPAN.
    Licensed to the Free Software Foundation.
+   Copyright (C) 2001 Free Software Foundation, Inc.
 
 This file is part of GNU Emacs.
 
@@ -157,12 +158,6 @@ Lisp_Object composition_temp;
 #define CHAR_WIDTH(c) \
   (SINGLE_BYTE_CHAR_P (c) ? 1 : CHARSET_WIDTH (CHAR_CHARSET (c)))
 
-/* The following macros for hash table are copied from fns.c.  */
-/* Value is the key part of entry IDX in hash table H.  */
-#define HASH_KEY(H, IDX)   AREF ((H)->key_and_value, 2 * (IDX))
-/* Value is the value part of entry IDX in hash table H.  */
-#define HASH_VALUE(H, IDX) AREF ((H)->key_and_value, 2 * (IDX) + 1)
-
 /* Return COMPOSITION-ID of a composition at buffer position
    CHARPOS/BYTEPOS and length NCHARS.  The `composition' property of
    the sequence is PROP.  STRING, if non-nil, is a string that
@@ -248,8 +243,8 @@ get_composition_id (charpos, bytepos, nchars, prop, string)
         modify the cons cell of PROP because it is not shared.  */
       key = HASH_KEY (hash_table, hash_index);
       id = HASH_VALUE (hash_table, hash_index);
-      XCAR (prop) = id;
-      XCDR (prop) = Fcons (make_number (nchars), Fcons (key, XCDR (prop)));
+      XSETCAR (prop, id);
+      XSETCDR (prop, Fcons (make_number (nchars), Fcons (key, XCDR (prop))));
       return XINT (id);
     }
 
@@ -296,8 +291,8 @@ get_composition_id (charpos, bytepos, nchars, prop, string)
   /* Change PROP from Form-A above to Form-B.  We can directly modify
      the cons cell of PROP because it is not shared.  */
   XSETFASTINT (id, n_compositions);
-  XCAR (prop) = id;
-  XCDR (prop) = Fcons (make_number (nchars), Fcons (key, XCDR (prop)));
+  XSETCAR (prop, id);
+  XSETCDR (prop, Fcons (make_number (nchars), Fcons (key, XCDR (prop))));
 
   /* Register the composition in composition_hash_table.  */
   hash_index = hash_put (hash_table, key, id, hash_code);
@@ -467,7 +462,7 @@ run_composition_function (from, to, prop)
       && find_composition (to, -1, &start, &end, &prop, Qnil)
       && !COMPOSITION_VALID_P (start, end, prop))
     to = end;
-  if (!NILP (func))
+  if (!NILP (Ffboundp (func)))
     call2 (func, make_number (from), make_number (to));
   else if (!NILP (Ffboundp (Vcompose_chars_after_function)))
     call3 (Vcompose_chars_after_function,
@@ -483,11 +478,14 @@ run_composition_function (from, to, prop)
 
 void
 update_compositions (from, to, check_mask)
-     int from, to;
+     int from, to, check_mask;
 {
   Lisp_Object prop;
   int start, end;
 
+  if (inhibit_modification_hooks)
+    return;
+  
   /* If FROM and TO are not in a valid range, do nothing.  */
   if (! (BEGV <= from && from <= to && to <= ZV))
     return;
@@ -509,7 +507,7 @@ update_compositions (from, to, check_mask)
          run_composition_function (start, end, prop);
          from = end;
        }
-      else if (from < to
+      else if (from < ZV
               && find_composition (from, -1, &start, &from, &prop, Qnil))
        run_composition_function (start, from, prop);
     }
@@ -565,7 +563,7 @@ make_composition_value_copy (list)
        {
          if (EQ (XCAR (plist), Qcomposition)
              && (val = XCAR (XCDR (plist)), CONSP (val)))
-           XCAR (XCDR (plist)) = Fcons (XCAR (val), XCDR (val));
+           XSETCAR (XCDR (plist), Fcons (XCAR (val), XCDR (val)));
          plist = XCDR (XCDR (plist));
        }
     }
@@ -601,24 +599,24 @@ compose_chars_in_text (start, end, string)
      int start, end;
      Lisp_Object string;
 {
-  int count;
+  int count = 0;
   struct gcpro gcpro1;
   Lisp_Object tail, elt, val, to;
   /* Set to nonzero if we don't have to compose ASCII characters.  */
   int skip_ascii;
   int i, len, stop, c;
-  unsigned char *ptr, *pend;
+  const unsigned char *ptr, *pend;
 
   if (! CHAR_TABLE_P (Vcomposition_function_table))
     return;
 
   if (STRINGP (string))
     {
-      count = specpdl_ptr - specpdl;
+      count = SPECPDL_INDEX ();
       GCPRO1 (string);
       stop = end;
-      ptr = XSTRING (string)->data + string_char_to_byte (string, start);
-      pend = ptr + STRING_BYTES (XSTRING (string));
+      ptr = SDATA (string) + string_char_to_byte (string, start);
+      pend = ptr + SBYTES (string);
     }
   else
     {
@@ -652,7 +650,7 @@ compose_chars_in_text (start, end, string)
            break;
          stop = end;
          if (STRINGP (string))
-           ptr = XSTRING (string)->data + string_char_to_byte (string, start);
+           ptr = SDATA (string) + string_char_to_byte (string, start);
          else
            ptr = CHAR_POS_ADDR (start);
        }
@@ -682,7 +680,7 @@ compose_chars_in_text (start, end, string)
                    {
                      start += XINT (val);
                      if (STRINGP (string))
-                       ptr = XSTRING (string)->data + string_char_to_byte (string, start);
+                       ptr = SDATA (string) + string_char_to_byte (string, start);
                      else
                        ptr = CHAR_POS_ADDR (start);
                    }
@@ -713,12 +711,12 @@ compose_chars_in_text (start, end, string)
 
 DEFUN ("compose-region-internal", Fcompose_region_internal,
        Scompose_region_internal, 2, 4, 0,
-  "Internal use only.\n\
-\n\
-Compose text in the region between START and END.\n\
-Optional 3rd and 4th arguments are COMPONENTS and MODIFICATION-FUNC\n\
-for the composition.   See `compose-region' for more detial.")
-  (start, end, components, mod_func)
+       doc: /* Internal use only.
+
+Compose text in the region between START and END.
+Optional 3rd and 4th arguments are COMPONENTS and MODIFICATION-FUNC
+for the composition.  See `compose-region' for more detail.  */)
+     (start, end, components, mod_func)
      Lisp_Object start, end, components, mod_func;
 {
   validate_region (&start, &end);
@@ -726,7 +724,7 @@ for the composition.   See `compose-region' for more detial.")
       && !INTEGERP (components)
       && !CONSP (components)
       && !STRINGP (components))
-    CHECK_VECTOR (components, 2);
+    CHECK_VECTOR (components);
 
   compose_text (XINT (start), XINT (end), components, mod_func, Qnil);
   return Qnil;
@@ -734,21 +732,21 @@ for the composition.   See `compose-region' for more detial.")
 
 DEFUN ("compose-string-internal", Fcompose_string_internal,
        Scompose_string_internal, 3, 5, 0,
-  "Internal use only.\n\
-\n\
-Compose text between indices START and END of STRING.\n\
-Optional 4th and 5th arguments are COMPONENTS and MODIFICATION-FUNC\n\
-for the composition.   See `compose-string' for more detial.")
-  (string, start, end, components, mod_func)
+       doc: /* Internal use only.
+
+Compose text between indices START and END of STRING.
+Optional 4th and 5th arguments are COMPONENTS and MODIFICATION-FUNC
+for the composition.  See `compose-string' for more detail.  */)
+     (string, start, end, components, mod_func)
      Lisp_Object string, start, end, components, mod_func;
 {
-  CHECK_STRING (string, 0);
-  CHECK_NUMBER (start, 1);
-  CHECK_NUMBER (end, 2);
+  CHECK_STRING (string);
+  CHECK_NUMBER (start);
+  CHECK_NUMBER (end);
 
   if (XINT (start) < 0 ||
       XINT (start) > XINT (end)
-      || XINT (end) > XSTRING (string)->size)
+      || XINT (end) > SCHARS (string))
     args_out_of_range (start, end);
 
   compose_text (XINT (start), XINT (end), components, mod_func, string);
@@ -757,28 +755,38 @@ for the composition.   See `compose-string' for more detial.")
 
 DEFUN ("find-composition-internal", Ffind_composition_internal,
        Sfind_composition_internal, 4, 4, 0, 
-  "Internal use only.\n\
-\n\
-Return information about composition at or nearest to position POS.\n\
-See `find-composition' for more detail.")
-  (pos, limit, string, detail_p)
+       doc: /* Internal use only.
+
+Return information about composition at or nearest to position POS.
+See `find-composition' for more detail.  */)
+     (pos, limit, string, detail_p)
      Lisp_Object pos, limit, string, detail_p;
 {
   Lisp_Object prop, tail;
   int start, end;
   int id;
 
-  CHECK_NUMBER_COERCE_MARKER (pos, 0);
+  CHECK_NUMBER_COERCE_MARKER (pos);
   start = XINT (pos);
   if (!NILP (limit))
     {
-      CHECK_NUMBER_COERCE_MARKER (limit, 1);
+      CHECK_NUMBER_COERCE_MARKER (limit);
       end = XINT (limit);
     }
   else
     end = -1;
+  
   if (!NILP (string))
-    CHECK_STRING (string, 2);
+    {
+      CHECK_STRING (string);
+      if (XINT (pos) < 0 || XINT (pos) > SCHARS (string))
+       args_out_of_range (string, pos);
+    }
+  else
+    {
+      if (XINT (pos) < BEGV || XINT (pos) > ZV)
+       args_out_of_range (Fcurrent_buffer (), pos);
+    }
 
   if (!find_composition (start, end, &start, &end, &prop, string))
     return Qnil;
@@ -847,17 +855,17 @@ syms_of_composite ()
     = Fcons (Fcons (Qcomposition, Qt), Vtext_property_default_nonsticky);
 
   DEFVAR_LISP ("compose-chars-after-function", &Vcompose_chars_after_function,
-    "Function to adjust composition of buffer text.\n\
-\n\
-The function is called with three arguments FROM, TO, and OBJECT.\n\
-FROM and TO specify the range of text of which composition should be\n\
-adjusted.  OBJECT, if non-nil, is a string that contains the text.\n\
-\n\
-This function is called after a text with `composition' property is\n\
-inserted or deleted to keep `composition' property of buffer text\n\
-valid.\n\
-\n\
-The default value is the function `compose-chars-after'.");
+              doc: /* Function to adjust composition of buffer text.
+
+The function is called with three arguments FROM, TO, and OBJECT.
+FROM and TO specify the range of text of which composition should be
+adjusted.  OBJECT, if non-nil, is a string that contains the text.
+
+This function is called after a text with `composition' property is
+inserted or deleted to keep `composition' property of buffer text
+valid.
+
+The default value is the function `compose-chars-after'.  */);
   Vcompose_chars_after_function = intern ("compose-chars-after");
 
   Qcomposition_function_table = intern ("composition-function-table");
@@ -871,16 +879,16 @@ The default value is the function `compose-chars-after'.");
   Fput (Qcomposition_function_table, Qchar_table_extra_slots, make_number (0));
 
   DEFVAR_LISP ("composition-function-table", &Vcomposition_function_table,
-    "Char table of patterns and functions to make a composition.\n\
-\n\
-Each element is nil or an alist of PATTERNs vs FUNCs, where PATTERNs\n\
-are regular expressions and FUNCs are functions.  FUNC is responsible\n\
-for composing text matching the corresponding PATTERN.  FUNC is called\n\
-with three arguments FROM, TO, and PATTERN.  See the function\n\
-`compose-chars-after' for more detail.\n\
-\n\
-This table is looked up by the first character of a composition when\n\
-the composition gets invalid after a change in a buffer.");
+              doc: /* Char table of patterns and functions to make a composition.
+
+Each element is nil or an alist of PATTERNs vs FUNCs, where PATTERNs
+are regular expressions and FUNCs are functions.  FUNC is responsible
+for composing text matching the corresponding PATTERN.  FUNC is called
+with three arguments FROM, TO, and PATTERN.  See the function
+`compose-chars-after' for more detail.
+
+This table is looked up by the first character of a composition when
+the composition gets invalid after a change in a buffer.  */);
   Vcomposition_function_table
     = Fmake_char_table (Qcomposition_function_table, Qnil);