]> git.eshelyaron.com Git - emacs.git/commitdiff
(Fmemq, Fassq, Frassq, assq_no_quit, Fassoc)
authorGerd Moellmann <gerd@gnu.org>
Thu, 28 Oct 1999 12:12:47 +0000 (12:12 +0000)
committerGerd Moellmann <gerd@gnu.org>
Thu, 28 Oct 1999 12:12:47 +0000 (12:12 +0000)
(Frassoc): Rewritten.

src/fns.c

index e5c3a2be428986680813a848ecd65faff7122b42..148c03dca5fa4f33aff1eb38ea06763e460b1411 100644 (file)
--- a/src/fns.c
+++ b/src/fns.c
@@ -148,13 +148,17 @@ To get the number of bytes, use `string-bytes'")
     XSETFASTINT (val, XVECTOR (sequence)->size & PSEUDOVECTOR_SIZE_MASK);
   else if (CONSP (sequence))
     {
-      for (i = 0, tail = sequence; !NILP (tail); i++)
+      for (i = 0; CONSP (sequence); ++i)
        {
-         QUIT;
-         tail = Fcdr (tail);
+         if ((i & 0xff) == 0)
+           QUIT;
+         sequence = XCDR (sequence);
        }
 
-      XSETFASTINT (val, i);
+      if (!NILP (sequence))
+       wrong_type_argument (Qlistp, sequence);
+
+      val = make_number (i);
     }
   else if (NILP (sequence))
     XSETFASTINT (val, 0);
@@ -1314,21 +1318,33 @@ The value is actually the tail of LIST whose car is ELT.")
 }
 
 DEFUN ("memq", Fmemq, Smemq, 2, 2, 0,
-  "Return non-nil if ELT is an element of LIST.  Comparison done with EQ.\n\
-The value is actually the tail of LIST whose car is ELT.")
+  "Return non-nil if ELT is an element of LIST.\n\
+Comparison done with EQ.  The value is actually the tail of LIST\n\
+whose car is ELT.")
   (elt, list)
-     register Lisp_Object elt;
-     Lisp_Object list;
+     Lisp_Object elt, list;
 {
-  register Lisp_Object tail;
-  for (tail = list; !NILP (tail); tail = XCDR (tail))
+  while (1)
     {
-      register Lisp_Object tem;
-      tem = Fcar (tail);
-      if (EQ (elt, tem)) return tail;
+      if (!CONSP (list) || EQ (XCAR (list), elt))
+       break;
+      
+      list = XCDR (list);
+      if (!CONSP (list) || EQ (XCAR (list), elt))
+       break;
+
+      list = XCDR (list);
+      if (!CONSP (list) || EQ (XCAR (list), elt))
+       break;
+
+      list = XCDR (list);
       QUIT;
     }
-  return Qnil;
+
+  if (!CONSP (list) && !NILP (list))
+    list = wrong_type_argument (Qlistp, list);
+
+  return list;
 }
 
 DEFUN ("assq", Fassq, Sassq, 2, 2, 0,
@@ -1336,20 +1352,41 @@ DEFUN ("assq", Fassq, Sassq, 2, 2, 0,
 The value is actually the element of LIST whose car is KEY.\n\
 Elements of LIST that are not conses are ignored.")
   (key, list)
-     register Lisp_Object key;
-     Lisp_Object list;
+     Lisp_Object key, list;
 {
-  register Lisp_Object tail;
-  for (tail = list; !NILP (tail); tail = XCDR (tail))
+  Lisp_Object result;
+
+  while (1)
     {
-      register Lisp_Object elt, tem;
-      elt = Fcar (tail);
-      if (!CONSP (elt)) continue;
-      tem = XCAR (elt);
-      if (EQ (key, tem)) return elt;
+      if (!CONSP (list)
+         || (CONSP (XCAR (list))
+             && EQ (XCAR (XCAR (list)), key)))
+       break;
+      
+      list = XCDR (list);
+      if (!CONSP (list)
+         || (CONSP (XCAR (list))
+             && EQ (XCAR (XCAR (list)), key)))
+       break;
+      
+      list = XCDR (list);
+      if (!CONSP (list)
+         || (CONSP (XCAR (list))
+             && EQ (XCAR (XCAR (list)), key)))
+       break;
+      
+      list = XCDR (list);
       QUIT;
     }
-  return Qnil;
+
+  if (CONSP (list))
+    result = XCAR (list);
+  else if (NILP (list))
+    result = Qnil;
+  else
+    result = wrong_type_argument (Qlistp, list);
+
+  return result;
 }
 
 /* Like Fassq but never report an error and do not allow quits.
@@ -1357,79 +1394,144 @@ Elements of LIST that are not conses are ignored.")
 
 Lisp_Object
 assq_no_quit (key, list)
-     register Lisp_Object key;
-     Lisp_Object list;
+     Lisp_Object key, list;
 {
-  register Lisp_Object tail;
-  for (tail = list; CONSP (tail); tail = XCDR (tail))
-    {
-      register Lisp_Object elt, tem;
-      elt = Fcar (tail);
-      if (!CONSP (elt)) continue;
-      tem = XCAR (elt);
-      if (EQ (key, tem)) return elt;
-    }
-  return Qnil;
+  while (CONSP (list)
+        && (!CONSP (XCAR (list))
+            || !EQ (XCAR (XCAR (list)), key)))
+    list = XCDR (list);
+
+  return CONSP (list) ? XCAR (list) : Qnil;
 }
 
 DEFUN ("assoc", Fassoc, Sassoc, 2, 2, 0,
   "Return non-nil if KEY is `equal' to the car of an element of LIST.\n\
 The value is actually the element of LIST whose car equals KEY.")
   (key, list)
-     register Lisp_Object key;
-     Lisp_Object list;
+     Lisp_Object key, list;
 {
-  register Lisp_Object tail;
-  for (tail = list; !NILP (tail); tail = XCDR (tail))
+  Lisp_Object result, car;
+
+  while (1)
     {
-      register Lisp_Object elt, tem;
-      elt = Fcar (tail);
-      if (!CONSP (elt)) continue;
-      tem = Fequal (XCAR (elt), key);
-      if (!NILP (tem)) return elt;
+      if (!CONSP (list)
+         || (CONSP (XCAR (list))
+             && (car = XCAR (XCAR (list)),
+                 EQ (car, key) || !NILP (Fequal (car, key)))))
+       break;
+      
+      list = XCDR (list);
+      if (!CONSP (list)
+         || (CONSP (XCAR (list))
+             && (car = XCAR (XCAR (list)),
+                 EQ (car, key) || !NILP (Fequal (car, key)))))
+       break;
+      
+      list = XCDR (list);
+      if (!CONSP (list)
+         || (CONSP (XCAR (list))
+             && (car = XCAR (XCAR (list)),
+                 EQ (car, key) || !NILP (Fequal (car, key)))))
+       break;
+      
+      list = XCDR (list);
       QUIT;
     }
-  return Qnil;
+
+  if (CONSP (list))
+    result = XCAR (list);
+  else if (NILP (list))
+    result = Qnil;
+  else
+    result = wrong_type_argument (Qlistp, list);
+
+  return result;
 }
 
 DEFUN ("rassq", Frassq, Srassq, 2, 2, 0,
-  "Return non-nil if ELT is `eq' to the cdr of an element of LIST.\n\
-The value is actually the element of LIST whose cdr is ELT.")
+  "Return non-nil if KEY is `eq' to the cdr of an element of LIST.\n\
+The value is actually the element of LIST whose cdr is KEY.")
   (key, list)
      register Lisp_Object key;
      Lisp_Object list;
 {
-  register Lisp_Object tail;
-  for (tail = list; !NILP (tail); tail = XCDR (tail))
+  Lisp_Object result;
+
+  while (1)
     {
-      register Lisp_Object elt, tem;
-      elt = Fcar (tail);
-      if (!CONSP (elt)) continue;
-      tem = XCDR (elt);
-      if (EQ (key, tem)) return elt;
+      if (!CONSP (list)
+         || (CONSP (XCAR (list))
+             && EQ (XCDR (XCAR (list)), key)))
+       break;
+      
+      list = XCDR (list);
+      if (!CONSP (list)
+         || (CONSP (XCAR (list))
+             && EQ (XCDR (XCAR (list)), key)))
+       break;
+      
+      list = XCDR (list);
+      if (!CONSP (list)
+         || (CONSP (XCAR (list))
+             && EQ (XCDR (XCAR (list)), key)))
+       break;
+      
+      list = XCDR (list);
       QUIT;
     }
-  return Qnil;
+
+  if (NILP (list))
+    result = Qnil;
+  else if (CONSP (list))
+    result = XCAR (list);
+  else
+    result = wrong_type_argument (Qlistp, list);
+
+  return result;
 }
 
 DEFUN ("rassoc", Frassoc, Srassoc, 2, 2, 0,
   "Return non-nil if KEY is `equal' to the cdr of an element of LIST.\n\
 The value is actually the element of LIST whose cdr equals KEY.")
   (key, list)
-     register Lisp_Object key;
-     Lisp_Object list;
+     Lisp_Object key, list;
 {
-  register Lisp_Object tail;
-  for (tail = list; !NILP (tail); tail = XCDR (tail))
+  Lisp_Object result, cdr;
+
+  while (1)
     {
-      register Lisp_Object elt, tem;
-      elt = Fcar (tail);
-      if (!CONSP (elt)) continue;
-      tem = Fequal (XCDR (elt), key);
-      if (!NILP (tem)) return elt;
+      if (!CONSP (list)
+         || (CONSP (XCAR (list))
+             && (cdr = XCDR (XCAR (list)),
+                 EQ (cdr, key) || !NILP (Fequal (cdr, key)))))
+       break;
+      
+      list = XCDR (list);
+      if (!CONSP (list)
+         || (CONSP (XCAR (list))
+             && (cdr = XCDR (XCAR (list)),
+                 EQ (cdr, key) || !NILP (Fequal (cdr, key)))))
+       break;
+      
+      list = XCDR (list);
+      if (!CONSP (list)
+         || (CONSP (XCAR (list))
+             && (cdr = XCDR (XCAR (list)),
+                 EQ (cdr, key) || !NILP (Fequal (cdr, key)))))
+       break;
+      
+      list = XCDR (list);
       QUIT;
     }
-  return Qnil;
+
+  if (CONSP (list))
+    result = XCAR (list);
+  else if (NILP (list))
+    result = Qnil;
+  else
+    result = wrong_type_argument (Qlistp, list);
+
+  return result;
 }
 \f
 DEFUN ("delq", Fdelq, Sdelq, 2, 2, 0,