diff options
author | Brian Pane <brianp@apache.org> | 2002-03-17 03:24:15 +0000 |
---|---|---|
committer | Brian Pane <brianp@apache.org> | 2002-03-17 03:24:15 +0000 |
commit | 1a6a447853cc731910249d40ea2190dcbabb7b4d (patch) | |
tree | 562c49f223940a0e67f875ce1ae32305518c521d /file_io/unix/filepath.c | |
parent | 8aa2c061f34ce9ef5d6b158e9d3dec234b0be8e0 (diff) | |
download | apr-1a6a447853cc731910249d40ea2190dcbabb7b4d.tar.gz apr-1a6a447853cc731910249d40ea2190dcbabb7b4d.zip |
Performance improvement for apr_filepath_merge()
git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@63145 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'file_io/unix/filepath.c')
-rw-r--r-- | file_io/unix/filepath.c | 23 |
1 files changed, 13 insertions, 10 deletions
diff --git a/file_io/unix/filepath.c b/file_io/unix/filepath.c index 4173dcaa4..d84c47694 100644 --- a/file_io/unix/filepath.c +++ b/file_io/unix/filepath.c @@ -234,10 +234,11 @@ APR_DECLARE(apr_status_t) apr_filepath_merge(char **newpath, { /* Parse each segment, find the closing '/' */ - seglen = 0; - while (addpath[seglen] && addpath[seglen] != '/') { - ++seglen; + const char *next = addpath; + while (*next && (*next != '/')) { + ++next; } + seglen = next - addpath; if (seglen == 0 || (seglen == 1 && addpath[0] == '.')) { /* noop segment (/ or ./) so skip it @@ -300,21 +301,23 @@ APR_DECLARE(apr_status_t) apr_filepath_merge(char **newpath, { /* An actual segment, append it to the destination path */ - apr_size_t i = (addpath[seglen] != '\0'); - if (pathlen + seglen + i >= maxlen) { + if (*next) { + seglen++; + } + if (pathlen + seglen >= maxlen) { return APR_ENAMETOOLONG; } - memcpy(path + pathlen, addpath, seglen + i); - pathlen += seglen + i; + memcpy(path + pathlen, addpath, seglen); + pathlen += seglen; } /* Skip over trailing slash to the next segment */ - if (addpath[seglen]) { - ++seglen; + if (*next) { + ++next; } - addpath += seglen; + addpath = next; } path[pathlen] = '\0'; |