Optimize scm_ilength and 'length+'.
authorMark H Weaver <mhw@netris.org>
Thu, 5 Jun 2014 00:42:21 +0000 (20:42 -0400)
committerMark H Weaver <mhw@netris.org>
Thu, 5 Jun 2014 00:42:21 +0000 (20:42 -0400)
* libguile/list.c (scm_ilength): Test for SCM_NULL_OR_NIL_P only after
  testing scm_is_pair.  Conform to GNU coding standards.

* libguile/srfi-1.c (scm_srfi1_length_plus): Ditto.

libguile/list.c
libguile/srfi-1.c

index 01f23c0..669f566 100644 (file)
@@ -1,5 +1,5 @@
-/* Copyright (C) 1995,1996,1997,2000,2001,2003,2004,2008,2009,2010,2011
- * Free Software Foundation, Inc.
+/* Copyright (C) 1995-1997, 2000, 2001, 2003, 2004, 2008-2011,
+ *   2014 Free Software Foundation, Inc.
  * 
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public License
@@ -179,24 +179,25 @@ SCM_DEFINE (scm_list_p, "list?", 1, 0, 0,
    long" lists (i.e. lists with cycles in their cdrs), and returns -1
    if it does find one.  */
 long
-scm_ilength(SCM sx)
+scm_ilength (SCM sx)
 {
   long i = 0;
   SCM tortoise = sx;
   SCM hare = sx;
 
-  do {
-    if (SCM_NULL_OR_NIL_P(hare)) return i;
-    if (!scm_is_pair (hare)) return -1;
-    hare = SCM_CDR(hare);
-    i++;
-    if (SCM_NULL_OR_NIL_P(hare)) return i;
-    if (!scm_is_pair (hare)) return -1;
-    hare = SCM_CDR(hare);
-    i++;
-    /* For every two steps the hare takes, the tortoise takes one.  */
-    tortoise = SCM_CDR(tortoise);
-  }
+  do
+    {
+      if (!scm_is_pair (hare))
+        return SCM_NULL_OR_NIL_P (hare) ? i : -1;
+      hare = SCM_CDR (hare);
+      i++;
+      if (!scm_is_pair (hare))
+        return SCM_NULL_OR_NIL_P (hare) ? i : -1;
+      hare = SCM_CDR (hare);
+      i++;
+      /* For every two steps the hare takes, the tortoise takes one.  */
+      tortoise = SCM_CDR (tortoise);
+    }
   while (!scm_is_eq (hare, tortoise));
 
   /* If the tortoise ever catches the hare, then the list must contain
index fcbf806..c0b7035 100644 (file)
@@ -620,20 +620,28 @@ SCM_DEFINE (scm_srfi1_length_plus, "length+", 1, 0, 0,
 
   do
     {
-      if (SCM_NULL_OR_NIL_P (hare))
-        return scm_from_size_t (i);
       if (!scm_is_pair (hare))
-        scm_wrong_type_arg_msg (FUNC_NAME, 1, lst, "proper or circular list");
+        {
+          if (SCM_NULL_OR_NIL_P (hare))
+            return scm_from_size_t (i);
+          else
+            scm_wrong_type_arg_msg (FUNC_NAME, 1, lst,
+                                    "proper or circular list");
+        }
       hare = SCM_CDR (hare);
       i++;
-      if (SCM_NULL_OR_NIL_P (hare))
-        return scm_from_size_t (i);
       if (!scm_is_pair (hare))
-        scm_wrong_type_arg_msg (FUNC_NAME, 1, lst, "proper or circular list");
+        {
+          if (SCM_NULL_OR_NIL_P (hare))
+            return scm_from_size_t (i);
+          else
+            scm_wrong_type_arg_msg (FUNC_NAME, 1, lst,
+                                    "proper or circular list");
+        }
       hare = SCM_CDR (hare);
       i++;
       /* For every two steps the hare takes, the tortoise takes one.  */
-      tortoise = SCM_CDR(tortoise);
+      tortoise = SCM_CDR (tortoise);
     }
   while (!scm_is_eq (hare, tortoise));