{
char *first, *second, *result;
- first = xlat_fmt_aprint(NULL, node->child);
- second = xlat_fmt_aprint(NULL, node->alternate);
+ first = xlat_fmt_aprint(NULL, node->alternate[0]);
+ second = xlat_fmt_aprint(NULL, node->alternate[1]);
result = talloc_asprintf(ctx, "%%{%s:-%s}", first, second);
talloc_free(first);
talloc_free(second);
}
XLAT_DEBUG("** [%i] %s(alt-first) - string empty, evaluating alternate: %s",
- unlang_interpret_stack_depth(request), __FUNCTION__, (*in)->alternate->fmt);
- *child = (*in)->alternate;
+ unlang_interpret_stack_depth(request), __FUNCTION__, (*in)->alternate[1]->fmt);
+ *child = (*in)->alternate[1];
*alternate = true;
return XLAT_ACTION_PUSH_CHILD;
case XLAT_ALTERNATE:
XLAT_DEBUG("** [%i] %s(alternate) - %%{%%{%s}:-%%{%s}}", unlang_interpret_stack_depth(request),
- __FUNCTION__, node->child->fmt, node->alternate->fmt);
- fr_assert(node->child != NULL);
- fr_assert(node->alternate != NULL);
+ __FUNCTION__, node->alternate[0]->fmt, node->alternate[1]->fmt);
+ fr_assert(node->child == NULL);
+ fr_assert(node->alternate[0] != NULL);
+ fr_assert(node->alternate[1] != NULL);
- *child = node->child;
+ *child = node->alternate[0];
xa = XLAT_ACTION_PUSH_CHILD;
goto finish;
/*
* Evaluate the first child
*/
- ret = xlat_eval_walk(node->child, walker, type, uctx);
+ ret = xlat_eval_walk(node->alternate[0], walker, type, uctx);
if (ret < 0) return ret;
/*
* Evaluate the alternate expansion path
*/
- ret = xlat_eval_walk(node->alternate, walker, type, uctx);
+ ret = xlat_eval_walk(node->alternate[1], walker, type, uctx);
if (ret < 0) return ret;
break;
xlat_exp_set_type(node, XLAT_ALTERNATE);
if (func_args) {
- if (xlat_tokenize_function_args(node, &node->child, &node->flags, in, t_rules) < 0) {
+ if (xlat_tokenize_function_args(node, &node->alternate[0], &node->flags, in, t_rules) < 0) {
error:
*head = NULL;
talloc_free(node);
return -1;
}
} else {
- if (xlat_tokenize_expansion(node, &node->child, &node->flags, in, t_rules) < 0) goto error;
+ if (xlat_tokenize_expansion(node, &node->alternate[0], &node->flags, in, t_rules) < 0) goto error;
}
if (!fr_sbuff_adv_past_str_literal(in, ":-")) {
* Allow the RHS to be empty as a special case.
*/
if (fr_sbuff_next_if_char(in, '}')) {
- node->alternate = xlat_exp_alloc(node, XLAT_BOX, "", 0);
- xlat_flags_merge(&node->flags, &node->child->flags);
+ node->alternate[1] = xlat_exp_alloc(node, XLAT_BOX, "", 0);
+ xlat_flags_merge(&node->flags, &node->alternate[1]->flags);
*head = node;
return 0;
}
/*
* Parse the alternate expansion.
*/
- if (xlat_tokenize_string(node, &node->alternate, &node->flags, in,
+ if (xlat_tokenize_string(node, &node->alternate[1], &node->flags, in,
true, &xlat_expansion_rules, t_rules) < 0) goto error;
- if (!node->alternate) {
+ if (!node->alternate[1]) {
talloc_free(node);
fr_strerror_const("Empty expansion is invalid");
goto error;
#endif
case XLAT_ALTERNATE:
+ fr_assert(node->child == NULL);
DEBUG("XLAT-IF {");
- _xlat_debug(node->child, depth + 1);
+ _xlat_debug(node->alternate[0], depth + 1);
DEBUG("}");
DEBUG("XLAT-ELSE {");
- _xlat_debug(node->alternate, depth + 1);
+ _xlat_debug(node->alternate[1], depth + 1);
DEBUG("}");
break;
break;
case XLAT_ALTERNATE:
- slen = xlat_print(out, node->child, &xlat_escape);
+ slen = xlat_print(out, node->alternate[0], &xlat_escape);
if (slen < 0) goto error;
FR_SBUFF_IN_STRCPY_LITERAL_RETURN(out, ":-");
- slen = xlat_print(out, node->alternate, &xlat_escape);
+ slen = xlat_print(out, node->alternate[1], &xlat_escape);
if (slen < 0) goto error;
break;
{
xlat_flags_t child_flags = node->flags, alt_flags = node->flags;
- if ((xlat_resolve(&node->child, &child_flags, xr_rules) < 0) ||
- (xlat_resolve(&node->alternate, &alt_flags, xr_rules) < 0)) return -1;
+ if ((xlat_resolve(&node->alternate[0], &child_flags, xr_rules) < 0) ||
+ (xlat_resolve(&node->alternate[1], &alt_flags, xr_rules) < 0)) return -1;
xlat_flags_merge(&child_flags, &alt_flags);
node->flags = child_flags;
#endif
case XLAT_ALTERNATE:
- if (unlikely(xlat_copy(node, &node->alternate, p->alternate) < 0)) goto error;
+ if (unlikely(xlat_copy(node, &node->alternate[0], p->alternate[0]) < 0)) goto error;
+ if (unlikely(xlat_copy(node, &node->alternate[1], p->alternate[1]) < 0)) goto error;
break;
case XLAT_GROUP: