23RCSID(
"$Id: c6102ea34d90bbe0ef8f3ea6118a402f3ceb6546 $")
25#include <freeradius-devel/util/misc.h>
26#include <freeradius-devel/util/skip.h>
27#include <freeradius-devel/util/strerror.h>
39 char const *p = start;
44 while ((end && (p < end)) || *p) {
61 if (end && ((p + 2) >= end)) {
70 if (p[1] <
' ')
goto fail;
89 if (end && ((p + 4) >= end))
goto fail;
94 if ((quote ==
'\'') && isxdigit((
uint8_t) p[1]) && isxdigit((
uint8_t) p[2])) {
120 char const *p = start;
122 while ((end && (p < end)) || *p) {
123 if (*p == end_quote) {
137 if (slen <= 0)
return slen - (p - start);
140 fr_assert((
size_t) slen <= (
size_t) (end - p));
148 if ((*p ==
'"') || (*p ==
'\'') || (*p ==
'`')) {
156 if ((p[0] ==
'$') || (p[0] ==
'%')) {
157 if (end && (p + 2) >= end)
break;
162 if ((p[0] ==
'%') && (p[1] ==
'%')) {
167 if ((p[1] ==
'{') || (p[1] ==
'(')) {
187 if (end && ((p + 2) >= end))
break;
192 if (p[1] <
' ')
break;
220 char const *p = start;
225 if (end && ((end - start) < 4)) {
230 if (!((memcmp(p,
"%{", 2) == 0) ||
231 (memcmp(p,
"${", 2) == 0) ||
232 (memcmp(p,
"$(", 2) == 0))) {
242 }
else if (*p ==
'{') {
252 while (isalnum((
int) *q) || (*q ==
'.') || (*q ==
'_') || (*q ==
'-')) {
266 if (slen <= 0)
return slen - (p - start);
267 return slen + (p - start);
288 char const *p = start;
289 bool was_regex =
false;
293 if (eol) *eol =
false;
298 while ((end && (p < end)) || *p) {
336 if ((*p ==
'$') || (*p ==
'%')) {
337 if (end && ((p + 2) >= end)) {
342 if ((p[1] ==
'{') || ((p[0] ==
'$') && (p[1] ==
'('))) {
346 if (slen <= 0)
return -(p - start) + slen;
363 if ((*p ==
'"') || (*p ==
'\'') || (*p ==
'`') || (was_regex && (*p ==
'/'))) {
377 if ((p[0] ==
'=') || (p[0] ==
'!')) {
378 if (end && ((p + 2) >= end)) {
415 if (end && ((p + 2) >= end))
break;
420 if (p[1] <
' ')
break;
427 if (eol) *eol = (
depth > 0);
429 if (terminal[(
uint8_t) *p])
return p - start;
static uint8_t depth(fr_minmax_heap_index_t i)
ssize_t fr_skip_condition(char const *start, char const *end, bool const terminal[static UINT8_MAX+1], bool *eol)
Skip a conditional expression.
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_xlat(char const *start, char const *end)
Skip an xlat expression.
#define fr_strerror_const(_msg)