diff options
author | ianh <ianh@13f79535-47bb-0310-9956-ffa450edef68> | 2001-09-28 03:43:05 +0000 |
---|---|---|
committer | ianh <ianh@13f79535-47bb-0310-9956-ffa450edef68> | 2001-09-28 03:43:05 +0000 |
commit | 11af4af8266fd8f5b4bf1b6ef32405041a20a1e2 (patch) | |
tree | 32b7d2049cde5ca7ee5a9879d1d2b981ff58a600 /strings | |
parent | b8ba9ee2d1166383df60434a0ddb53b06c436c25 (diff) | |
download | libapr-11af4af8266fd8f5b4bf1b6ef32405041a20a1e2.tar.gz |
optimize apr_pstrcat by storing the lengths of the first 6 strings
(changed const to #define as suggested, and so that it compiles on NT)
Submitted by: Brian Pane <bpane@pacbell.net>
Reviewed by: Ian Holsman
git-svn-id: http://svn.apache.org/repos/asf/apr/apr/trunk@62379 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'strings')
-rw-r--r-- | strings/apr_strings.c | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/strings/apr_strings.c b/strings/apr_strings.c index e8a1c2f26..a516cc06b 100644 --- a/strings/apr_strings.c +++ b/strings/apr_strings.c @@ -65,6 +65,9 @@ #include <stddef.h> /* NULL */ #endif +/** this is used to cache lengths in apr_pstrcat */ +#define MAX_SAVED_LENGTHS 6 + APR_DECLARE(char *) apr_pstrdup(apr_pool_t *a, const char *s) { char *res; @@ -110,6 +113,8 @@ APR_DECLARE(void *) apr_pmemdup(apr_pool_t *a, const void *m, apr_size_t n) APR_DECLARE_NONSTD(char *) apr_pstrcat(apr_pool_t *a, ...) { char *cp, *argp, *res; + apr_size_t saved_lengths[MAX_SAVED_LENGTHS]; + int nargs = 0; /* Pass one --- find length of required string */ @@ -119,7 +124,11 @@ APR_DECLARE_NONSTD(char *) apr_pstrcat(apr_pool_t *a, ...) va_start(adummy, a); while ((cp = va_arg(adummy, char *)) != NULL) { - len += strlen(cp); + apr_size_t cplen = strlen(cp); + if (nargs < MAX_SAVED_LENGTHS) { + saved_lengths[nargs++] = cplen; + } + len += cplen; } va_end(adummy); @@ -133,8 +142,16 @@ APR_DECLARE_NONSTD(char *) apr_pstrcat(apr_pool_t *a, ...) va_start(adummy, a); + nargs = 0; while ((argp = va_arg(adummy, char *)) != NULL) { len = strlen(argp); + if (nargs < MAX_SAVED_LENGTHS) { + len = saved_lengths[nargs++]; + } + else { + len = strlen(argp); + } + memcpy(cp, argp, len); cp += len; } |