From d70691fc4b7183f812e2e325b5196b5afe7854c8 Mon Sep 17 00:00:00 2001 From: Jim Meyering Date: Tue, 30 Nov 2004 14:24:40 +0000 Subject: [PATCH] (O_DIRECTORY): Define, if necessary. (memchrcspn): Tiny wrapper around memchr. (rpl_chdir): Use memchrcspn rather than strcspn. --- lib/chdir.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/lib/chdir.c b/lib/chdir.c index b531b10ecb..e8ce730d54 100644 --- a/lib/chdir.c +++ b/lib/chdir.c @@ -37,6 +37,10 @@ #include "mempcpy.h" #include "openat.h" +#ifndef O_DIRECTORY +# define O_DIRECTORY 0 +#endif + #ifndef MIN # define MIN(a, b) ((a) < (b) ? (a) : (b)) #endif @@ -71,6 +75,20 @@ struct cd_buf int fd; }; +/* Like memchr, but return the number of bytes from MEM + to the first occurrence of C thereafter. Search only + LEN bytes. Return LEN if C is not found. */ +static inline size_t +memchrcspn (char const *mem, int c, size_t len) +{ + char const *found = memchr (mem, c, len); + if (!found) + return len; + + len = found - mem; + return len; +} + static void cdb_init (struct cd_buf *cdb) { @@ -247,9 +265,8 @@ rpl_chdir (char const *dir) break; } - /* FIXME: if performance of strcspn is an issue, - use a little wrapper around memchr. */ - len = strcspn (start, "/"); + len = memchrcspn (start, '/', dir_end - start); + assert (len == strcspn (start, "/")); d = start + len; if (cdb_append (&cdb, start, len) != 0) goto Fail; -- 2.47.2