fr_sbuff_parse_rules_t p_rules = { .escapes = &fr_value_unescape_double };
dec_len = xlat_tokenize(cc->tmp_ctx, &head, &FR_SBUFF_IN(in, input_len), &p_rules,
- &(tmpl_attr_rules_t) {
- .dict_def = cc->tmpl_rules.attr.dict_def ?
+ &(tmpl_rules_t) {
+ .attr = {
+ .dict_def = cc->tmpl_rules.attr.dict_def ?
cc->tmpl_rules.attr.dict_def : cc->config->dict,
- .allow_unresolved = cc->tmpl_rules.attr.allow_unresolved
+ .allow_unresolved = cc->tmpl_rules.attr.allow_unresolved
+ },
});
if (dec_len <= 0) {
fr_strerror_printf_push_head("ERROR offset %d", (int) -dec_len);
slen = xlat_tokenize_argv(cc->tmp_ctx, &head, &FR_SBUFF_IN(in, input_len),
NULL,
- &(tmpl_attr_rules_t) {
- .dict_def = cc->tmpl_rules.attr.dict_def ?
- cc->tmpl_rules.attr.dict_def : cc->config->dict,
- .allow_unresolved = cc->tmpl_rules.attr.allow_unresolved
+ &(tmpl_rules_t) {
+ .attr = {
+ .dict_def = cc->tmpl_rules.attr.dict_def ?
+ cc->tmpl_rules.attr.dict_def : cc->config->dict,
+ .allow_unresolved = cc->tmpl_rules.attr.allow_unresolved
+ },
});
if (slen <= 0) {
fr_strerror_printf_push_head("ERROR offset %d", (int) -slen);
vpt = tmpl_alloc_null(ctx);
if (!t_rules->at_runtime) {
- slen = xlat_tokenize(vpt, &head, &our_in, p_rules, &t_rules->attr);
+ slen = xlat_tokenize(vpt, &head, &our_in, p_rules, t_rules);
} else {
slen = xlat_tokenize_ephemeral(vpt, &head,
t_rules->xlat.runtime_el, &our_in,
vpt = tmpl_alloc_null(ctx);
if (!t_rules->at_runtime) {
- slen = xlat_tokenize(vpt, &head, &our_in, p_rules, &t_rules->attr);
+ slen = xlat_tokenize(vpt, &head, &our_in, p_rules, t_rules);
} else {
slen = xlat_tokenize_ephemeral(vpt, &head, t_rules->xlat.runtime_el,
&our_in, p_rules, t_rules);
* FIXME - We need an ephemeral version of this
* too.
*/
- slen = xlat_tokenize_argv(vpt, &head, &our_in, p_rules, &t_rules->attr);
+ slen = xlat_tokenize_argv(vpt, &head, &our_in, p_rules, t_rules);
if (slen < 0) {
fr_sbuff_advance(&our_in, slen * -1);
talloc_free(vpt);
vpt = tmpl_alloc_null(ctx);
- slen = xlat_tokenize(vpt, &head, &our_in, p_rules, &t_rules->attr);
+ slen = xlat_tokenize(vpt, &head, &our_in, p_rules, t_rules);
if (!head) return slen;
/*
#endif
static int xlat_tokenize_string(xlat_exp_head_t *head, fr_sbuff_t *in, bool brace,
- fr_sbuff_parse_rules_t const *p_rules, tmpl_attr_rules_t const *t_rules);
+ fr_sbuff_parse_rules_t const *p_rules, tmpl_rules_t const *t_rules);
static inline int xlat_tokenize_alternation(xlat_exp_head_t *head, fr_sbuff_t *in,
- tmpl_attr_rules_t const *t_rules, bool func_args)
+ tmpl_rules_t const *t_rules, bool func_args)
{
xlat_exp_t *node;
*/
static inline int xlat_tokenize_function_mono(xlat_exp_head_t *head,
fr_sbuff_t *in,
- tmpl_attr_rules_t const *rules)
+ tmpl_rules_t const *t_rules)
{
xlat_exp_t *node;
xlat_t *func;
MEM(node = xlat_exp_alloc(head, XLAT_FUNC, fr_sbuff_current(&m_s), fr_sbuff_behind(&m_s)));
MEM(node->call.args = xlat_exp_head_alloc(node));
if (!func) {
- if (!rules || !rules->allow_unresolved) {
+ if (!t_rules || !t_rules->attr.allow_unresolved) {
fr_strerror_const("Unresolved expansion functions are not allowed here");
goto bad_function;
}
* Now parse the child nodes that form the
* function's arguments.
*/
- if (xlat_tokenize_string(node->call.args, in, true, &xlat_expansion_rules, rules) < 0) {
+ if (xlat_tokenize_string(node->call.args, in, true, &xlat_expansion_rules, t_rules) < 0) {
goto error;
}
* - <0 on parse error.
*/
int xlat_tokenize_function_args(xlat_exp_head_t *head, fr_sbuff_t *in,
- tmpl_attr_rules_t const *rules)
+ tmpl_rules_t const *t_rules)
{
xlat_exp_t *node;
xlat_t *func;
*/
node = xlat_exp_alloc(head, XLAT_FUNC, fr_sbuff_current(&m_s), fr_sbuff_behind(&m_s));
if (!func) {
- if (!rules || !rules->allow_unresolved) {
+ if (!t_rules || !t_rules->attr.allow_unresolved) {
fr_strerror_const("Unresolved expansion functions are not allowed here");
goto bad_function;
}
* Now parse the child nodes that form the
* function's arguments.
*/
- if (xlat_tokenize_argv(node, &node->call.args, in, &xlat_multi_arg_rules, rules) < 0) {
+ if (xlat_tokenize_argv(node, &node->call.args, in, &xlat_multi_arg_rules, t_rules) < 0) {
goto error;
}
xlat_flags_merge(&node->flags, &node->call.args->flags);
*
*/
static inline int xlat_tokenize_attribute(xlat_exp_head_t *head, fr_sbuff_t *in,
- fr_sbuff_parse_rules_t const *p_rules, tmpl_attr_rules_t const *t_rules)
+ fr_sbuff_parse_rules_t const *p_rules, tmpl_rules_t const *t_rules)
{
ssize_t slen;
tmpl_attr_error_t err;
if (t_rules) {
memset(&our_t_rules, 0, sizeof(our_t_rules));
- our_t_rules.attr = *t_rules;
+ our_t_rules = *t_rules;
} else {
memset(&our_t_rules, 0, sizeof(our_t_rules));
}
*/
if ((tmpl_attr_count(vpt) == 1) && (xlat_resolve_virtual_attribute(node, vpt) == 0)) goto done;
- if (!t_rules || !t_rules->allow_unresolved) {
+ if (!t_rules || !t_rules->attr.allow_unresolved) {
talloc_free(vpt);
fr_strerror_const("Unresolved attributes not allowed in expansions here");
}
int xlat_tokenize_expansion(xlat_exp_head_t *head, fr_sbuff_t *in,
- tmpl_attr_rules_t const *t_rules)
+ tmpl_rules_t const *t_rules)
{
size_t len;
fr_sbuff_marker_t s_m;
*/
static int xlat_tokenize_string(xlat_exp_head_t *head,
fr_sbuff_t *in, bool brace,
- fr_sbuff_parse_rules_t const *p_rules, tmpl_attr_rules_t const *t_rules)
+ fr_sbuff_parse_rules_t const *p_rules, tmpl_rules_t const *t_rules)
{
xlat_exp_t *node = NULL;
fr_slen_t slen;
fr_strerror_clear(); /* Clear error buffer */
if (xlat_tokenize_string(head, &our_in,
- false, p_rules, &our_t_rules.attr) < 0) {
+ false, p_rules, &our_t_rules) < 0) {
talloc_free(head);
return -fr_sbuff_used(&our_in);
}
* - >0 on success which is the number of characters parsed.
*/
ssize_t xlat_tokenize_argv(TALLOC_CTX *ctx, xlat_exp_head_t **out, fr_sbuff_t *in,
- fr_sbuff_parse_rules_t const *p_rules, tmpl_attr_rules_t const *t_rules)
+ fr_sbuff_parse_rules_t const *p_rules, tmpl_rules_t const *t_rules)
{
fr_sbuff_t our_in = FR_SBUFF(in);
ssize_t slen;
xlat_exp_head_t *head;
MEM(head = xlat_exp_head_alloc(ctx));
- if (t_rules) head->dict = t_rules->dict_def;
+ if (t_rules) head->dict = t_rules->attr.dict_def;
if (p_rules && p_rules->terminals) {
tmp_p_rules = (fr_sbuff_parse_rules_t){ /* Stack allocated due to CL scope */
* - < 0 the negative offset of the parse failure.
*/
ssize_t xlat_tokenize(TALLOC_CTX *ctx, xlat_exp_head_t **out, fr_sbuff_t *in,
- fr_sbuff_parse_rules_t const *p_rules, tmpl_attr_rules_t const *t_rules)
+ fr_sbuff_parse_rules_t const *p_rules, tmpl_rules_t const *t_rules)
{
fr_sbuff_t our_in = FR_SBUFF(in);
xlat_exp_head_t *head;
MEM(head = xlat_exp_head_alloc(ctx));
- if (t_rules) head->dict = t_rules->dict_def;
+ if (t_rules) head->dict = t_rules->attr.dict_def;
fr_strerror_clear(); /* Clear error buffer */