aboutsummaryrefslogtreecommitdiff
path: root/file_io/unix/filepath.c
diff options
context:
space:
mode:
authorBrian Pane <brianp@apache.org>2002-03-17 03:24:15 +0000
committerBrian Pane <brianp@apache.org>2002-03-17 03:24:15 +0000
commit1a6a447853cc731910249d40ea2190dcbabb7b4d (patch)
tree562c49f223940a0e67f875ce1ae32305518c521d /file_io/unix/filepath.c
parent8aa2c061f34ce9ef5d6b158e9d3dec234b0be8e0 (diff)
downloadapr-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.c23
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';