23RCSID(
"$Id: e9ac32fb36cfcd151d798ac5dc662dd355cb2679 $")
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#define SKIP_MAX_DEPTH 64
127 char const *p = start;
134 while ((end && (p < end)) || *p) {
135 if (*p == end_quote) {
151 if (slen <= 0)
return slen - (p - start);
153 fr_assert((
size_t) slen <= (
size_t) (end - p));
161 if ((*p ==
'"') || (*p ==
'\'') || (*p ==
'`')) {
169 if ((p[0] ==
'$') || (p[0] ==
'%')) {
170 if (end && (p + 2) >= end)
break;
175 if ((p[0] ==
'%') && (p[1] ==
'%')) {
180 if ((p[1] ==
'{') || (p[1] ==
'(')) {
200 if (end && ((p + 2) >= end))
break;
205 if (p[1] <
' ')
break;
219 char const *p = start;
229 if (end && ((end - start) < 4)) {
234 if (!((memcmp(p,
"%{", 2) == 0) ||
235 (memcmp(p,
"${", 2) == 0) ||
236 (memcmp(p,
"$(", 2) == 0))) {
246 }
else if (*p ==
'{') {
256 while (isalnum((
int) *q) || (*q ==
'.') || (*q ==
'_') || (*q ==
'-')) {
270 if (slen <= 0)
return slen - (p - start);
271 return slen + (p - start);
319 char const *p = start;
320 bool was_regex =
false;
324 if (eol) *eol =
false;
329 while ((end && (p < end)) || *p) {
367 if ((*p ==
'$') || (*p ==
'%')) {
368 if (end && ((p + 2) >= end)) {
373 if ((p[1] ==
'{') || ((p[0] ==
'$') && (p[1] ==
'('))) {
377 if (slen <= 0)
return -(p - start) + slen;
394 if ((*p ==
'"') || (*p ==
'\'') || (*p ==
'`') || (was_regex && (*p ==
'/'))) {
408 if ((p[0] ==
'=') || (p[0] ==
'!')) {
409 if (end && ((p + 2) >= end)) {
446 if (end && ((p + 2) >= end))
break;
451 if (p[1] <
' ')
break;
458 if (eol) *eol = (
depth > 0);
460 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.
static ssize_t skip_xlat(char const *start, char const *end, unsigned int depth)
static ssize_t skip_brackets(char const *start, char const *end, char end_quote, unsigned int depth)
ssize_t fr_skip_xlat(char const *start, char const *end)
Skip an xlat expression.
#define fr_strerror_const(_msg)