Index: fns.c =================================================================== RCS file: /cvsroot/emacs/emacs/src/fns.c,v retrieving revision 1.327 diff -u -r1.327 fns.c --- fns.c 6 Jan 2003 15:41:17 -0000 1.327 +++ fns.c 20 Jan 2003 06:53:38 -0000 @@ -2913,6 +2913,76 @@ return sequence; } + +#define FIND_IF_1(VARIABLE, PREDICATE, ELEMENT) \ + if (! NILP (call1 ((PREDICATE), (ELEMENT)))) \ + { \ + (VARIABLE) = (ELEMENT); \ + break; \ + } + +DEFUN ("find-if", Ffind_if, Sfind_if, 2, 2, 0, + doc: /* Return the first element for which PREDICATE returns non-nil. */) + (predicate, sequence) + Lisp_Object predicate, sequence; +{ + Lisp_Object elt = Qnil; + struct gcpro gcpro1, gcpro2; + + GCPRO2 (predicate, sequence); + + if (STRINGP (sequence)) + { + int nchars = SCHARS (sequence); + int cidx, bidx; + + for (cidx = bidx = 0; cidx < nchars;) + { + int c; + FETCH_STRING_CHAR_ADVANCE (c, sequence, cidx, bidx); + FIND_IF_1 (elt, predicate, (make_number (c))); + QUIT; + } + } + else if (BOOL_VECTOR_P (sequence)) + { + int i; + for (i = 0; i < XBOOL_VECTOR (sequence)->size; i++) + { + int byte = XBOOL_VECTOR (sequence)->data[i / BITS_PER_CHAR]; + if (byte & (1 << (i % BITS_PER_CHAR))) + { FIND_IF_1 (elt, predicate, Qt) } + else + { FIND_IF_1 (elt, predicate, Qnil) } + QUIT; + } + } + else if (VECTORP (sequence)) + { + int i; + int len = ASIZE (sequence); + + for (i = 0; i < len; i++) + FIND_IF_1 (elt, predicate, (AREF (sequence, i))); + QUIT; + } + else /* It ought to be a list. */ + { + while (! NILP (sequence)) + { + if (! (CONSP (sequence))) + return wrong_type_argument (Qsequencep, sequence); + else FIND_IF_1 (elt, predicate, (XCAR (sequence))); + sequence = XCDR (sequence); + QUIT; + } + } + UNGCPRO; + return elt; +} + + + /* Anything that calls this function must protect from GC! */ @@ -5580,6 +5650,7 @@ defsubr (&Snconc); defsubr (&Smapcar); defsubr (&Smapc); + defsubr (&Sfind_if); defsubr (&Smapconcat); defsubr (&Sy_or_n_p); defsubr (&Syes_or_no_p);