Hi,

On Thu, Feb 5, 2015 at 9:33 PM,  <rj...@apache.org> wrote:
> Author: rjung
> Date: Thu Feb  5 20:33:59 2015
> New Revision: 1657685
>
> URL: http://svn.apache.org/r1657685
[...]
>
> Modified:
>     httpd/httpd/trunk/server/util_expr_eval.c
>
> Modified: httpd/httpd/trunk/server/util_expr_eval.c
> URL: 
> http://svn.apache.org/viewvc/httpd/httpd/trunk/server/util_expr_eval.c?rev=1657685&r1=1657684&r2=1657685&view=diff
> ==============================================================================
> --- httpd/httpd/trunk/server/util_expr_eval.c (original)
> +++ httpd/httpd/trunk/server/util_expr_eval.c Thu Feb  5 20:33:59 2015
[...]
> @@ -113,6 +114,30 @@ static const char *ap_expr_eval_word(ap_
>              else
>                  result = apr_pstrcat(ctx->p, s1, s2, NULL);
>          }
> +        else if (((ap_expr_t *)node->node_arg1)->node_op == op_Concat) {
> +            const ap_expr_t *nodep = node;
> +            int n;
> +            int i = 1;
> +            struct iovec *vec;
> +            do {
> +                nodep = nodep->node_arg1;
> +                i++;
> +            } while (nodep->node_op == op_Concat);
> +            vec = apr_palloc(ctx->p, i * sizeof(struct iovec));
> +            n = i;
> +            nodep = node;
> +            i--;
> +            do {
> +                vec[i].iov_base = (void *)ap_expr_eval_word(ctx,
> +                                                            
> nodep->node_arg2);
> +                vec[i].iov_len = strlen(vec[i].iov_base);
> +                i--;
> +                nodep = nodep->node_arg1;
> +            } while (nodep->node_op == op_Concat);
> +            vec[i].iov_base = (void *)ap_expr_eval_word(ctx, nodep);
> +            vec[i].iov_len = strlen(vec[i].iov_base);
> +            result = apr_pstrcatv(ctx->p, vec, n, NULL);
> +        }
>          else {

Why concatenating in reverse order here?

Actually, I cannot manage to test this because I'm not able to find an
expression that produces node_arg1->node_op == op_Concat.
Due to the %right association of T_OP_CONCAT in the parser/yacc, "'x'
. 'y' . 'z'" gives "concat( 'x', concat ('y, 'z'))", which is
node_arg1->node_op == op_String and node_arg2->node_op == op_Concat...

Can you please share an expression for the new branch to be taken?

Regards,
Yann.

Reply via email to