summaryrefslogtreecommitdiff
path: root/strings
diff options
context:
space:
mode:
authorianh <ianh@13f79535-47bb-0310-9956-ffa450edef68>2001-09-28 03:43:05 +0000
committerianh <ianh@13f79535-47bb-0310-9956-ffa450edef68>2001-09-28 03:43:05 +0000
commit11af4af8266fd8f5b4bf1b6ef32405041a20a1e2 (patch)
tree32b7d2049cde5ca7ee5a9879d1d2b981ff58a600 /strings
parentb8ba9ee2d1166383df60434a0ddb53b06c436c25 (diff)
downloadlibapr-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.c19
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;
}