From 5482606c3796446598fb5b0f2d5adab6780d25ed Mon Sep 17 00:00:00 2001 From: brectanus Date: Tue, 1 May 2007 15:55:35 +0000 Subject: [PATCH] Added t:trimLeft, t:trimRight, t:trim to remove whitespace from a value on the left, right or both. (see trac #117) --- CHANGES | 3 ++ apache2/re_tfns.c | 76 +++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+) diff --git a/CHANGES b/CHANGES index de9e3909..0fba223d 100644 --- a/CHANGES +++ b/CHANGES @@ -2,6 +2,9 @@ ?? ??? 2007 - trunk ------------------- + * Added t:trimLeft, t:trimRight, t:trim to remove whitespace + from a value on the left, right or both. + * Added SecAuditLog2 directive to allow redundent concurrent audit log index files. This will allow sending audit data to two consoles, etc. diff --git a/apache2/re_tfns.c b/apache2/re_tfns.c index eaaebc01..8a7a25b5 100644 --- a/apache2/re_tfns.c +++ b/apache2/re_tfns.c @@ -44,6 +44,64 @@ static int msre_fn_lowercase_execute(apr_pool_t *mptmp, unsigned char *input, return changed; } +/* trimLeft */ + +static int msre_fn_trimLeft_execute(apr_pool_t *mptmp, unsigned char *input, + long int input_len, char **rval, long int *rval_len) +{ + long int i; + + *rval = (char *)input; + for (i = 0; i < input_len; i++) { + if (isspace(**rval) == 0) { + break; + } + (*rval)++; + } + + *rval_len = input_len - i; + + return (*rval_len == input_len ? 0 : 1); +} + +/* trimRight */ + +static int msre_fn_trimRight_execute(apr_pool_t *mptmp, unsigned char *input, + long int input_len, char **rval, long int *rval_len) +{ + long int i; + + *rval = (char *)input; + for (i = input_len - 1; i >= 0; i--) { + if (isspace((*rval)[i]) == 0) { + break; + } + (*rval)[i] = '\0'; + } + + *rval_len = i + 1; + + return (*rval_len == input_len ? 0 : 1); +} + +/* trim */ + +static int msre_fn_trim_execute(apr_pool_t *mptmp, unsigned char *input, + long int input_len, char **rval, long int *rval_len) +{ + int rc = 0; + + rc = msre_fn_trimLeft_execute(mptmp, input, input_len, rval, rval_len); + if (rc == 1) { + rc = msre_fn_trimRight_execute(mptmp, (unsigned char *)*rval, *rval_len, rval, rval_len); + } + else { + rc = msre_fn_trimRight_execute(mptmp, input, input_len, rval, rval_len); + } + + return (*rval_len == input_len ? 0 : 1); +} + /* removeNulls */ static int msre_fn_removeNulls_execute(apr_pool_t *mptmp, unsigned char *input, @@ -492,6 +550,24 @@ void msre_engine_register_default_tfns(msre_engine *engine) { msre_fn_sha1_execute ); + /* trim */ + msre_engine_tfn_register(engine, + "trim", + msre_fn_trim_execute + ); + + /* trimLeft */ + msre_engine_tfn_register(engine, + "trimLeft", + msre_fn_trimLeft_execute + ); + + /* trimRight */ + msre_engine_tfn_register(engine, + "trimRight", + msre_fn_trimRight_execute + ); + /* urlDecode */ msre_engine_tfn_register(engine, "urlDecode",