]> code.delx.au - gnu-emacs/blobdiff - src/fns.c
(internal_equal): compare_window_configurations takes new arg.
[gnu-emacs] / src / fns.c
index 1f55a8f4262b4a0e5724c1d4aede931f4e51121b..6bdcff83e218d9fee12691af51e7cfefdaf54373 100644 (file)
--- a/src/fns.c
+++ b/src/fns.c
@@ -125,7 +125,9 @@ To get the number of characters, use `chars-in-string'")
   else if (VECTORP (sequence))
     XSETFASTINT (val, XVECTOR (sequence)->size);
   else if (CHAR_TABLE_P (sequence))
-    XSETFASTINT (val, CHAR_TABLE_ORDINARY_SLOTS);
+    XSETFASTINT (val, (MIN_CHAR_COMPOSITION
+                      + (CHAR_FIELD2_MASK | CHAR_FIELD3_MASK)
+                      - 1));
   else if (BOOL_VECTOR_P (sequence))
     XSETFASTINT (val, XBOOL_VECTOR (sequence)->size);
   else if (COMPILEDP (sequence))
@@ -179,6 +181,16 @@ which is at least the number of distinct elements.")
   return length;
 }
 
+DEFUN ("string-bytes", Fstring_bytes, Sstring_bytes, 1, 1, 0,
+  "Return the number of bytes in STRING.\n\
+If STRING is a multibyte string, this is greater than the length of STRING.")
+  (string)
+     Lisp_Object string;
+{
+  CHECK_STRING (string, 1);
+  return make_number (XSTRING (string)->size_byte);
+}
+
 DEFUN ("string-equal", Fstring_equal, Sstring_equal, 2, 2, 0,
   "Return t if two strings have identical contents.\n\
 Case is significant, but text properties are ignored.\n\
@@ -557,43 +569,51 @@ concat (nargs, args, target_type, last_special)
            if (NILP (this)) break;
            if (CONSP (this))
              elt = XCONS (this)->car, this = XCONS (this)->cdr;
-           else
+           else if (thisindex >= thisleni)
+             break;
+           else if (STRINGP (this))
              {
-               if (thisindex >= thisleni) break;
-               if (STRINGP (this))
+               if (STRING_MULTIBYTE (this))
                  {
-                   if (STRING_MULTIBYTE (this))
-                     {
-                       int c;
-                       FETCH_STRING_CHAR_ADVANCE (c, this,
-                                                  thisindex,
-                                                  thisindex_byte);
-                       XSETFASTINT (elt, c);
-                     }
-                   else
-                     {
-                       unsigned char c;
-                       XSETFASTINT (elt, XSTRING (this)->data[thisindex++]);
-                       if (some_multibyte)
-                         XSETINT (elt,
-                                  unibyte_char_to_multibyte (XINT (elt)));
-                     }
+                   int c;
+                   FETCH_STRING_CHAR_ADVANCE (c, this,
+                                              thisindex,
+                                              thisindex_byte);
+                   XSETFASTINT (elt, c);
                  }
-               else if (BOOL_VECTOR_P (this))
+               else
                  {
-                   int size_in_chars
-                     = ((XBOOL_VECTOR (this)->size + BITS_PER_CHAR - 1)
-                        / BITS_PER_CHAR);
-                   int byte;
-                   byte = XBOOL_VECTOR (val)->data[thisindex / BITS_PER_CHAR];
-                   if (byte & (1 << (thisindex % BITS_PER_CHAR)))
-                     elt = Qt;
-                   else
-                     elt = Qnil;
+                   unsigned char c;
+                   XSETFASTINT (elt, XSTRING (this)->data[thisindex++]);
+                   if (some_multibyte && XINT (elt) >= 0200
+                       && XINT (elt) < 0400)
+                     {
+                       c = XINT (elt);
+
+                       if (! NILP (Vnonascii_translate_table))
+                         c = XINT (Faref (Vnonascii_translate_table,
+                                          make_number (c)));
+                       else if (nonascii_insert_offset > 0)
+                         c += nonascii_insert_offset;
+                       else
+                         c += DEFAULT_NONASCII_INSERT_OFFSET;
+
+                       XSETINT (elt, c);
+                     }
                  }
+             }
+           else if (BOOL_VECTOR_P (this))
+             {
+               int byte;
+               byte = XBOOL_VECTOR (this)->data[thisindex / BITS_PER_CHAR];
+               if (byte & (1 << (thisindex % BITS_PER_CHAR)))
+                 elt = Qt;
                else
-                 elt = XVECTOR (this)->contents[thisindex++];
+                 elt = Qnil;
+               thisindex++;
              }
+           else
+             elt = XVECTOR (this)->contents[thisindex++];
 
            /* Store this element into the result.  */
            if (toindex < 0)
@@ -1554,7 +1574,7 @@ internal_equal (o1, o2, depth)
            return 1;
          }
        if (WINDOW_CONFIGURATIONP (o1))
-         return compare_window_configurations (o1, o2);
+         return compare_window_configurations (o1, o2, 0);
 
        /* Aside from them, only true vectors, char-tables, and compiled
           functions are sensible to compare, so eliminate the others now.  */
@@ -1834,7 +1854,7 @@ See also the documentation of make-char.")
   c = XINT (ch);
   SPLIT_NON_ASCII_CHAR (c, charset, code1, code2);
   if (! CHARSET_DEFINED_P (charset))
-    error ("Invalid character: %d", c);
+    invalid_character (c);
 
   if (charset == CHARSET_ASCII)
     return (XCHAR_TABLE (char_table)->defalt = value);
@@ -2041,6 +2061,20 @@ mapcar1 (leni, vals, fn, seq)
          vals[i] = call1 (fn, dummy);
        }
     }
+  else if (BOOL_VECTOR_P (seq))
+    {
+      for (i = 0; i < leni; i++)
+       {
+         int byte;
+         byte = XBOOL_VECTOR (seq)->data[i / BITS_PER_CHAR];
+         if (byte & (1 << (i % BITS_PER_CHAR)))
+           dummy = Qt;
+         else
+           dummy = Qnil;
+
+         vals[i] = call1 (fn, dummy);
+       }
+    }
   else if (STRINGP (seq) && ! STRING_MULTIBYTE (seq))
     {
       /* Single-byte string.  */
@@ -2082,7 +2116,8 @@ mapcar1 (leni, vals, fn, seq)
 DEFUN ("mapconcat", Fmapconcat, Smapconcat, 3, 3, 0,
   "Apply FUNCTION to each element of SEQUENCE, and concat the results as strings.\n\
 In between each pair of results, stick in SEPARATOR.  Thus, \" \" as\n\
-SEPARATOR results in spaces between the values returned by FUNCTION.")
+SEPARATOR results in spaces between the values returned by FUNCTION.\n\
+SEQUENCE may be a list, a vector, a bool-vector, or a string.")
   (function, sequence, separator)
      Lisp_Object function, sequence, separator;
 {
@@ -2116,7 +2151,7 @@ SEPARATOR results in spaces between the values returned by FUNCTION.")
 DEFUN ("mapcar", Fmapcar, Smapcar, 2, 2, 0,
   "Apply FUNCTION to each element of SEQUENCE, and make a list of the results.\n\
 The result is a list just as long as SEQUENCE.\n\
-SEQUENCE may be a list, a vector or a string.")
+SEQUENCE may be a list, a vector, a bool-vector, or a string.")
   (function, sequence)
      Lisp_Object function, sequence;
 {
@@ -2537,6 +2572,7 @@ invoked by mouse clicks and mouse menu items.");
   defsubr (&Srandom);
   defsubr (&Slength);
   defsubr (&Ssafe_length);
+  defsubr (&Sstring_bytes);
   defsubr (&Sstring_equal);
   defsubr (&Sstring_lessp);
   defsubr (&Sappend);