-/* 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
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
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));