while ((box = fr_dlist_pop_head(list)) != NULL) {
MEM(node = xlat_exp_alloc_null(head));
node->type = XLAT_BOX;
- node->fmt = ""; /* @todo - fixme? */
+
fr_value_box_copy(node, &node->data, box);
talloc_free(box);
+ if (node->data.type == FR_TYPE_STRING) {
+ node->quote = T_SINGLE_QUOTED_STRING;
+ node->fmt = node->data.vb_strvalue;
+ } else {
+ node->quote = T_BARE_WORD;
+ node->fmt = ""; /* @todo - fixme? */
+ }
+
xlat_exp_insert_tail(head, node);
}
}
fr_dlist_talloc_free(&group->dlist);
node->type = XLAT_GROUP;
node->group = group;
- node->quote = T_BARE_WORD;
xlat_value_list_to_xlat(group, &list);
break;
node->flags.needs_async ? "need_async" : "",
node->flags.pure ? "pure" : "",
node->flags.can_purify ? "can_purify" : "");
+ if (node->quote != T_BARE_WORD) INFO_INDENT("quote = %c", fr_token_quote[node->quote]);
switch (node->type) {
case XLAT_BOX:
/*
* @todo - respect node->quote here, too. Which also means updating the parser.
*/
- FR_SBUFF_RETURN(fr_value_box_print, out, &node->data, e_rules);
+ if (node->quote == T_BARE_WORD) {
+ FR_SBUFF_RETURN(fr_value_box_print, out, &node->data, e_rules);
+ } else {
+ FR_SBUFF_IN_CHAR_RETURN(out, fr_token_quote[node->quote]);
+ FR_SBUFF_RETURN(fr_value_box_print, out, &node->data, fr_value_escape_by_quote[node->quote]);
+ FR_SBUFF_IN_CHAR_RETURN(out, fr_token_quote[node->quote]);
+ }
goto done;
case XLAT_TMPL:
# one value-box, and perhaps it isn't?
#
xlat_purify &Filter-Id == ("foo" + "bar")
-match (%{Filter-Id} == foobar)
+match (%{Filter-Id} == 'foobar')
xlat_purify !&User-Name
match !%{User-Name}