23RCSID(
"$Id: 7e2f81dec3dcfa838f99e3e0ec186d62e0c92736 $")
25#include <freeradius-devel/util/misc.h>
26#include <freeradius-devel/util/skip.h>
38 char const *p = start;
43 while ((end && (p < end)) || *p) {
60 if (end && ((p + 2) >= end)) {
69 if (p[1] <
' ')
goto fail;
88 if (end && ((p + 4) >= end))
goto fail;
93 if ((quote ==
'\'') && isxdigit((
uint8_t) p[1]) && isxdigit((
uint8_t) p[2])) {
119 char const *p = start;
121 while ((end && (p < end)) || *p) {
122 if (*p == end_quote) {
136 if (slen <= 0)
return slen - (p - start);
139 fr_assert((
size_t) slen <= (
size_t) (end - p));
147 if ((*p ==
'"') || (*p ==
'\'') || (*p ==
'`')) {
155 if ((p[0] ==
'$') || (p[0] ==
'%')) {
156 if (end && (p + 2) >= end)
break;
161 if ((p[0] ==
'%') && (p[1] ==
'%')) {
166 if ((p[1] ==
'{') || (p[1] ==
'(')) {
186 if (end && ((p + 2) >= end))
break;
191 if (p[1] <
' ')
break;
219 char const *p = start;
224 if (end && ((end - start) < 4)) {
229 if (!((memcmp(p,
"%{", 2) == 0) ||
230 (memcmp(p,
"${", 2) == 0) ||
231 (memcmp(p,
"$(", 2) == 0))) {
241 }
else if (*p ==
'{') {
251 while (isalnum((
int) *q) || (*q ==
'.') || (*q ==
'_') || (*q ==
'-')) {
265 if (slen <= 0)
return slen - (p - start);
266 return slen + (p - start);
287 char const *p = start;
288 bool was_regex =
false;
292 if (eol) *eol =
false;
297 while ((end && (p < end)) || *p) {
335 if ((*p ==
'$') || (*p ==
'%')) {
336 if (end && ((p + 2) >= end)) {
341 if ((p[1] ==
'{') || ((p[0] ==
'$') && (p[1] ==
'('))) {
345 if (slen <= 0)
return -(p - start) + slen;
362 if ((*p ==
'"') || (*p ==
'\'') || (*p ==
'`') || (was_regex && (*p ==
'/'))) {
376 if ((p[0] ==
'=') || (p[0] ==
'!')) {
377 if (end && ((p + 2) >= end)) {
414 if (end && ((p + 2) >= end))
break;
419 if (p[1] <
' ')
break;
426 if (eol) *eol = (
depth > 0);
428 if (terminal[(
uint8_t) *p])
return p - start;
static uint8_t depth(fr_minmax_heap_index_t i)
ssize_t fr_skip_brackets(char const *start, char const *end, char end_quote)
Skip a generic {...} or (...) arguments.
ssize_t fr_skip_string(char const *start, char const *end)
Skip a quoted string.
ssize_t fr_skip_condition(char const *start, char const *end, bool const terminal[static SBUFF_CHAR_CLASS], bool *eol)
Skip a conditional expression.
ssize_t fr_skip_xlat(char const *start, char const *end)
Skip an xlat expression.
#define fr_strerror_const(_msg)