}
slen = tmpl_afrom_substr(cp, &vpt, &sbuff, cp->rhs_quote,
- tmpl_parse_rules_unquoted[cp->rhs_quote],
+ value_parse_rules_unquoted[cp->rhs_quote],
&rules);
if (!vpt) goto tmpl_error;
#ifdef HAVE_REGEX
case T_SOLIDUS_QUOTED_STRING:
#endif
- p_rules = tmpl_parse_rules_quoted[type];
+ p_rules = value_parse_rules_quoted[type];
break;
#ifndef HAVE_REGEX
case T_SOLIDUS_QUOTED_STRING:
slen = tmpl_afrom_substr(ctx, &map->lhs,
&FR_SBUFF_IN(attr, talloc_array_length(attr) - 1),
type,
- tmpl_parse_rules_unquoted[type], /* We're not searching for quotes */
+ value_parse_rules_unquoted[type], /* We're not searching for quotes */
lhs_rules);
if (slen <= 0) {
char *spaces, *text;
slen = tmpl_afrom_substr(map, &map->rhs,
&FR_SBUFF_IN(value, strlen(value)),
type,
- tmpl_parse_rules_unquoted[type], /* We're not searching for quotes */
+ value_parse_rules_unquoted[type], /* We're not searching for quotes */
rhs_rules);
if (slen < 0) {
marker_subject = value;
fr_sbuff_parse_rules_t const *map_parse_rules_quoted[T_TOKEN_LAST] = {
[T_BARE_WORD] = &map_parse_rules_bareword_quoted,
- [T_DOUBLE_QUOTED_STRING] = &tmpl_parse_rules_double_quoted,
- [T_SINGLE_QUOTED_STRING] = &tmpl_parse_rules_single_quoted,
- [T_SOLIDUS_QUOTED_STRING] = &tmpl_parse_rules_solidus_quoted,
- [T_BACK_QUOTED_STRING] = &tmpl_parse_rules_backtick_quoted
+ [T_DOUBLE_QUOTED_STRING] = &value_parse_rules_double_quoted,
+ [T_SINGLE_QUOTED_STRING] = &value_parse_rules_single_quoted,
+ [T_SOLIDUS_QUOTED_STRING] = &value_parse_rules_solidus_quoted,
+ [T_BACK_QUOTED_STRING] = &value_parse_rules_backtick_quoted
};
/** Parse sbuff into (which may contain refs) to map_t.
case T_BACK_QUOTED_STRING:
case T_SINGLE_QUOTED_STRING:
slen = tmpl_afrom_substr(map, &map->lhs, &our_in, token,
- tmpl_parse_rules_quoted[token], lhs_rules);
+ value_parse_rules_quoted[token], lhs_rules);
break;
default:
case T_BACK_QUOTED_STRING:
case T_SINGLE_QUOTED_STRING:
slen = tmpl_afrom_substr(map, &map->rhs, &our_in, token,
- tmpl_parse_rules_quoted[token], rhs_rules);
+ value_parse_rules_quoted[token], rhs_rules);
break;
default:
- if (!p_rules) p_rules = &tmpl_parse_rules_bareword_quoted;
+ if (!p_rules) p_rules = &value_parse_rules_bareword_quoted;
/*
* Use the RHS termination rules ONLY for bare
///< ars referenced.
} tmpl_attr_extent_t;
-extern fr_sbuff_parse_rules_t const tmpl_parse_rules_bareword_unquoted;
-extern fr_sbuff_parse_rules_t const tmpl_parse_rules_double_unquoted;
-extern fr_sbuff_parse_rules_t const tmpl_parse_rules_single_unquoted;
-extern fr_sbuff_parse_rules_t const tmpl_parse_rules_solidus_unquoted;
-extern fr_sbuff_parse_rules_t const tmpl_parse_rules_backtick_unquoted;
-extern fr_sbuff_parse_rules_t const *tmpl_parse_rules_unquoted[T_TOKEN_LAST];
-
-extern fr_sbuff_parse_rules_t const tmpl_parse_rules_bareword_quoted;
-extern fr_sbuff_parse_rules_t const tmpl_parse_rules_double_quoted;
-extern fr_sbuff_parse_rules_t const tmpl_parse_rules_single_quoted;
-extern fr_sbuff_parse_rules_t const tmpl_parse_rules_solidus_quoted;
-extern fr_sbuff_parse_rules_t const tmpl_parse_rules_backtick_quoted;
-extern fr_sbuff_parse_rules_t const *tmpl_parse_rules_quoted[T_TOKEN_LAST];
-
/** Convenience macro for printing a meaningful assert message when we get a bad tmpl type
*/
#define tmpl_assert_type(_cond) \
#include <ctype.h>
+/** Default parser rules
+ *
+ * Because this is getting to be a ridiculous number of parsing rules
+ * to pass in via arguments.
+ *
+ * Defaults are used if a NULL rules pointer is passed to the parsing function.
+ */
+static tmpl_rules_t const default_attr_rules = {
+ .request_def = REQUEST_CURRENT,
+ .list_def = PAIR_LIST_REQUEST
+};
+
/* clang-format off */
/** Map #tmpl_type_t values to descriptive strings
*/
}
/** @} */
-/** @name Produce a #tmpl_t from a string or substring
- *
- * @{
- */
-
-/* clang-format off */
-/** Default parser rules
- *
- * Because this is getting to be a ridiculous number of parsing rules
- * to pass in via arguments.
- *
- * Defaults are used if a NULL rules pointer is passed to the parsing function.
- */
-static tmpl_rules_t const default_attr_rules = {
- .request_def = REQUEST_CURRENT,
- .list_def = PAIR_LIST_REQUEST
-};
-
-/** Default formatting rules
- *
- * Control token termination, escaping and how the tmpl is printed.
- */
-fr_sbuff_parse_rules_t const tmpl_parse_rules_bareword_unquoted = {
-
-};
-
-fr_sbuff_parse_rules_t const tmpl_parse_rules_double_unquoted = {
- .escapes = &fr_value_unescape_double
-};
-
-fr_sbuff_parse_rules_t const tmpl_parse_rules_single_unquoted = {
- .escapes = &fr_value_unescape_single
-};
-
-fr_sbuff_parse_rules_t const tmpl_parse_rules_solidus_unquoted = {
- .escapes = &fr_value_unescape_solidus
-};
-
-fr_sbuff_parse_rules_t const tmpl_parse_rules_backtick_unquoted = {
- .escapes = &fr_value_unescape_backtick
-};
-
-/** Parse rules for non-quoted strings
- *
- * These parse rules should be used for processing escape sequences in
- * data from external data sources like SQL databases and REST APIs.
- *
- * They do not include terminals to stop parsing as it assumes the values
- * are discreet, and not wrapped in quotes.
- */
-fr_sbuff_parse_rules_t const *tmpl_parse_rules_unquoted[T_TOKEN_LAST] = {
- [T_BARE_WORD] = &tmpl_parse_rules_bareword_unquoted,
- [T_DOUBLE_QUOTED_STRING] = &tmpl_parse_rules_double_unquoted,
- [T_SINGLE_QUOTED_STRING] = &tmpl_parse_rules_single_unquoted,
- [T_SOLIDUS_QUOTED_STRING] = &tmpl_parse_rules_solidus_unquoted,
- [T_BACK_QUOTED_STRING] = &tmpl_parse_rules_backtick_unquoted
-};
-
-fr_sbuff_parse_rules_t const tmpl_parse_rules_bareword_quoted = {
- .escapes = &(fr_sbuff_unescape_rules_t){
- .chr = '\\',
- /*
- * Allow barewords to contain whitespace
- * if they're escaped.
- */
- .subs = {
- ['\t'] = '\t',
- ['\n'] = '\n',
- [' '] = ' '
- },
- .do_hex = false,
- .do_oct = false
- },
- .terminals = &FR_SBUFF_TERMS(
- L("\t"),
- L("\n"),
- L(" ")
- )
-};
-
-fr_sbuff_parse_rules_t const tmpl_parse_rules_double_quoted = {
- .escapes = &fr_value_unescape_double,
- .terminals = &FR_SBUFF_TERM("\"")
-};
-
-fr_sbuff_parse_rules_t const tmpl_parse_rules_single_quoted = {
- .escapes = &fr_value_unescape_single,
- .terminals = &FR_SBUFF_TERM("'")
-};
-
-fr_sbuff_parse_rules_t const tmpl_parse_rules_solidus_quoted = {
- .escapes = &fr_value_unescape_solidus,
- .terminals = &FR_SBUFF_TERM("/")
-};
-
-fr_sbuff_parse_rules_t const tmpl_parse_rules_backtick_quoted = {
- .escapes = &fr_value_unescape_backtick,
- .terminals = &FR_SBUFF_TERM("`")
-};
-
-/** Parse rules for quoted strings
- *
- * These parse rules should be used for internal parsing functions that
- * are working with configuration files.
- *
- * They include appropriate quote terminals to force functions parsing
- * quoted strings to return when they reach a quote character.
- */
-fr_sbuff_parse_rules_t const *tmpl_parse_rules_quoted[T_TOKEN_LAST] = {
- [T_BARE_WORD] = &tmpl_parse_rules_bareword_quoted,
- [T_DOUBLE_QUOTED_STRING] = &tmpl_parse_rules_double_quoted,
- [T_SINGLE_QUOTED_STRING] = &tmpl_parse_rules_single_quoted,
- [T_SOLIDUS_QUOTED_STRING] = &tmpl_parse_rules_solidus_quoted,
- [T_BACK_QUOTED_STRING] = &tmpl_parse_rules_backtick_quoted
-};
-/* clang-format on */
-
/** Verify, after skipping whitespace, that a substring ends in a terminal char, or ends without further chars
*
* @param[in] in the sbuff to check.
if (p_rules && p_rules->terminals) {
tmp_p_rules = (fr_sbuff_parse_rules_t){ /* Stack allocated due to CL scope */
.terminals = fr_sbuff_terminals_amerge(NULL, p_rules->terminals,
- tmpl_parse_rules_bareword_quoted.terminals),
- .escapes = (p_rules->escapes ? p_rules->escapes : tmpl_parse_rules_bareword_quoted.escapes)
+ value_parse_rules_bareword_quoted.terminals),
+ .escapes = (p_rules->escapes ? p_rules->escapes : value_parse_rules_bareword_quoted.escapes)
};
our_p_rules = &tmp_p_rules;
} else {
- our_p_rules = &tmpl_parse_rules_bareword_quoted;
+ our_p_rules = &value_parse_rules_bareword_quoted;
}
/*
if (xlat_tokenize_literal(node, &node->child, &node->flags, &our_in,
false, our_p_rules, t_rules) < 0) {
error:
- if (our_p_rules != &tmpl_parse_rules_bareword_quoted) {
+ if (our_p_rules != &value_parse_rules_bareword_quoted) {
talloc_const_free(our_p_rules->terminals);
}
talloc_free(node);
*/
case T_DOUBLE_QUOTED_STRING:
if (xlat_tokenize_literal(node, &node->child, &node->flags, &our_in,
- false, &tmpl_parse_rules_double_quoted, t_rules) < 0) goto error;
+ false, &value_parse_rules_double_quoted, t_rules) < 0) goto error;
xlat_flags_merge(flags, &node->flags);
break;
node->flags.needs_async = false; /* Literals are always needs_async */
slen = fr_sbuff_out_aunescape_until(node->child, &str, &our_in, SIZE_MAX,
- tmpl_parse_rules_single_quoted.terminals,
- tmpl_parse_rules_single_quoted.escapes);
+ value_parse_rules_single_quoted.terminals,
+ value_parse_rules_single_quoted.escapes);
if (slen < 0) goto error;
xlat_exp_set_name_buffer_shallow(node->child, str);
xlat_flags_merge(flags, &node->flags);
}
}
- if (our_p_rules != &tmpl_parse_rules_bareword_quoted) talloc_const_free(our_p_rules->terminals);
+ if (our_p_rules != &value_parse_rules_bareword_quoted) talloc_const_free(our_p_rules->terminals);
return fr_sbuff_set(in, &our_in);
}
#include <freeradius-devel/util/ascend.h>
#include <freeradius-devel/util/dcursor.h>
#include <freeradius-devel/util/base16.h>
-
+#include <freeradius-devel/util/atexit.h>
/** Sanity checks
*
.do_oct = true
};
+
+/** @name Produce a #tmpl_t from a string or substring
+ *
+ * @{
+ */
+
+/* clang-format off */
+/** Default formatting rules
+ *
+ * Control token termination, escaping and how the tmpl is printed.
+ */
+fr_sbuff_parse_rules_t const value_parse_rules_bareword_unquoted = {
+
+};
+
+fr_sbuff_parse_rules_t const value_parse_rules_double_unquoted = {
+ .escapes = &fr_value_unescape_double
+};
+
+fr_sbuff_parse_rules_t const value_parse_rules_single_unquoted = {
+ .escapes = &fr_value_unescape_single
+};
+
+fr_sbuff_parse_rules_t const value_parse_rules_solidus_unquoted = {
+ .escapes = &fr_value_unescape_solidus
+};
+
+fr_sbuff_parse_rules_t const value_parse_rules_backtick_unquoted = {
+ .escapes = &fr_value_unescape_backtick
+};
+
+/** Parse rules for non-quoted strings
+ *
+ * These parse rules should be used for processing escape sequences in
+ * data from external data sources like SQL databases and REST APIs.
+ *
+ * They do not include terminals to stop parsing as it assumes the values
+ * are discreet, and not wrapped in quotes.
+ */
+fr_sbuff_parse_rules_t const *value_parse_rules_unquoted[T_TOKEN_LAST] = {
+ [T_BARE_WORD] = &value_parse_rules_bareword_unquoted,
+ [T_DOUBLE_QUOTED_STRING] = &value_parse_rules_double_unquoted,
+ [T_SINGLE_QUOTED_STRING] = &value_parse_rules_single_unquoted,
+ [T_SOLIDUS_QUOTED_STRING] = &value_parse_rules_solidus_unquoted,
+ [T_BACK_QUOTED_STRING] = &value_parse_rules_backtick_unquoted
+};
+
+fr_sbuff_parse_rules_t const *value_parse_rules_unquoted_char[UINT8_MAX] = {
+ ['\0'] = &value_parse_rules_bareword_unquoted,
+ ['"'] = &value_parse_rules_double_unquoted,
+ ['\''] = &value_parse_rules_single_unquoted,
+ ['/'] = &value_parse_rules_solidus_unquoted,
+ ['`'] = &value_parse_rules_backtick_unquoted
+};
+
+fr_sbuff_parse_rules_t const value_parse_rules_bareword_quoted = {
+ .escapes = &(fr_sbuff_unescape_rules_t){
+ .chr = '\\',
+ /*
+ * Allow barewords to contain whitespace
+ * if they're escaped.
+ */
+ .subs = {
+ ['\t'] = '\t',
+ ['\n'] = '\n',
+ [' '] = ' '
+ },
+ .do_hex = false,
+ .do_oct = false
+ },
+ .terminals = &FR_SBUFF_TERMS(
+ L("\t"),
+ L("\n"),
+ L(" ")
+ )
+};
+
+fr_sbuff_parse_rules_t const value_parse_rules_double_quoted = {
+ .escapes = &fr_value_unescape_double,
+ .terminals = &FR_SBUFF_TERM("\"")
+};
+
+fr_sbuff_parse_rules_t const value_parse_rules_single_quoted = {
+ .escapes = &fr_value_unescape_single,
+ .terminals = &FR_SBUFF_TERM("'")
+};
+
+fr_sbuff_parse_rules_t const value_parse_rules_solidus_quoted = {
+ .escapes = &fr_value_unescape_solidus,
+ .terminals = &FR_SBUFF_TERM("/")
+};
+
+fr_sbuff_parse_rules_t const value_parse_rules_backtick_quoted = {
+ .escapes = &fr_value_unescape_backtick,
+ .terminals = &FR_SBUFF_TERM("`")
+};
+
+/** Parse rules for quoted strings
+ *
+ * These parse rules should be used for internal parsing functions that
+ * are working with configuration files.
+ *
+ * They include appropriate quote terminals to force functions parsing
+ * quoted strings to return when they reach a quote character.
+ */
+fr_sbuff_parse_rules_t const *value_parse_rules_quoted[T_TOKEN_LAST] = {
+ [T_BARE_WORD] = &value_parse_rules_bareword_quoted,
+ [T_DOUBLE_QUOTED_STRING] = &value_parse_rules_double_quoted,
+ [T_SINGLE_QUOTED_STRING] = &value_parse_rules_single_quoted,
+ [T_SOLIDUS_QUOTED_STRING] = &value_parse_rules_solidus_quoted,
+ [T_BACK_QUOTED_STRING] = &value_parse_rules_backtick_quoted
+};
+
+fr_sbuff_parse_rules_t const *value_parse_rules_quoted_char[UINT8_MAX] = {
+ ['\0'] = &value_parse_rules_bareword_quoted,
+ ['"'] = &value_parse_rules_double_quoted,
+ ['\''] = &value_parse_rules_single_quoted,
+ ['/'] = &value_parse_rules_solidus_quoted,
+ ['`'] = &value_parse_rules_backtick_quoted
+};
+/* clang-format on */
+/** @} */
+
/** Copy flags and type data from one value box to another
*
* @param[in] dst to copy flags to
#define fr_box_is_non_value(_x) fr_type_is_non_value((_x)->type)
/** @} */
+/** @name Parsing rules for various types of string
+ *
+ * @{
+ */
+extern fr_sbuff_parse_rules_t const value_parse_rules_bareword_unquoted;
+extern fr_sbuff_parse_rules_t const value_parse_rules_double_unquoted;
+extern fr_sbuff_parse_rules_t const value_parse_rules_single_unquoted;
+extern fr_sbuff_parse_rules_t const value_parse_rules_solidus_unquoted;
+extern fr_sbuff_parse_rules_t const value_parse_rules_backtick_unquoted;
+extern fr_sbuff_parse_rules_t const *value_parse_rules_unquoted[T_TOKEN_LAST];
+extern fr_sbuff_parse_rules_t const *value_parse_rules_unquoted_char[UINT8_MAX];
+
+extern fr_sbuff_parse_rules_t const value_parse_rules_bareword_quoted;
+extern fr_sbuff_parse_rules_t const value_parse_rules_double_quoted;
+extern fr_sbuff_parse_rules_t const value_parse_rules_single_quoted;
+extern fr_sbuff_parse_rules_t const value_parse_rules_solidus_quoted;
+extern fr_sbuff_parse_rules_t const value_parse_rules_backtick_quoted;
+extern fr_sbuff_parse_rules_t const *value_parse_rules_quoted[T_TOKEN_LAST];
+extern fr_sbuff_parse_rules_t const *value_parse_rules_quoted_char[UINT8_MAX];
+/** @} */
+
/** @name Convenience functions
*
* These macros and inline functions simplify working
slen = tmpl_afrom_substr(cp, &vpt, &FR_SBUFF_IN(cf_pair_value(cp), strlen(cf_pair_value(cp))),
cf_pair_value_quote(cp),
- tmpl_parse_rules_unquoted[cf_pair_value_quote(cp)],
+ value_parse_rules_unquoted[cf_pair_value_quote(cp)],
&rules);
/* There was an error */