/* ignore the current line */
-int pat_parse_nothing(const char **text, struct pattern *pattern, enum pat_usage usage, int *opaque, char **err);
+int pat_parse_nothing(const char *text, struct pattern *pattern, enum pat_usage usage, char **err);
/* Parse an integer. It is put both in min and max. */
-int pat_parse_int(const char **text, struct pattern *pattern, enum pat_usage usage, int *opaque, char **err);
+int pat_parse_int(const char *text, struct pattern *pattern, enum pat_usage usage, char **err);
/* Parse len like an integer, but specify expected string type */
-int pat_parse_len(const char **text, struct pattern *pattern, enum pat_usage usage, int *opaque, char **err);
+int pat_parse_len(const char *text, struct pattern *pattern, enum pat_usage usage, char **err);
/* Parse an version. It is put both in min and max. */
-int pat_parse_dotted_ver(const char **text, struct pattern *pattern, enum pat_usage usage, int *opaque, char **err);
+int pat_parse_dotted_ver(const char *text, struct pattern *pattern, enum pat_usage usage, char **err);
/* Parse a range of integers delimited by either ':' or '-'. If only one
* integer is read, it is set as both min and max.
*/
-int pat_parse_range(const char **text, struct pattern *pattern, enum pat_usage usage, int *opaque, char **err);
+int pat_parse_range(const char *text, struct pattern *pattern, enum pat_usage usage, char **err);
/* Parse a string. It is allocated and duplicated. */
-int pat_parse_str(const char **text, struct pattern *pattern, enum pat_usage usage, int *opaque, char **err);
+int pat_parse_str(const char *text, struct pattern *pattern, enum pat_usage usage, char **err);
/* Parse a hexa binary definition. It is allocated and duplicated. */
-int pat_parse_bin(const char **text, struct pattern *pattern, enum pat_usage usage, int *opaque, char **err);
+int pat_parse_bin(const char *text, struct pattern *pattern, enum pat_usage usage, char **err);
/* Parse and concatenate strings into one. It is allocated and duplicated. */
-int pat_parse_strcat(const char **text, struct pattern *pattern, enum pat_usage usage, int *opaque, char **err);
+int pat_parse_strcat(const char *text, struct pattern *pattern, enum pat_usage usage, char **err);
/* Parse a regex. It is allocated. */
-int pat_parse_reg(const char **text, struct pattern *pattern, enum pat_usage usage, int *opaque, char **err);
+int pat_parse_reg(const char *text, struct pattern *pattern, enum pat_usage usage, char **err);
/* Parse an IP address and an optional mask in the form addr[/mask].
* The addr may either be an IPv4 address or a hostname. The mask
* may either be a dotted mask or a number of bits. Returns 1 if OK,
* otherwise 0.
*/
-int pat_parse_ip(const char **text, struct pattern *pattern, enum pat_usage usage, int *opaque, char **err);
+int pat_parse_ip(const char *text, struct pattern *pattern, enum pat_usage usage, char **err);
/* NB: For two strings to be identical, it is required that their lengths match */
enum pat_match_res pat_match_str(struct sample *smp, struct pattern *pattern);
[PAT_MATCH_REG] = "reg",
};
-int (*pat_parse_fcts[PAT_MATCH_NUM])(const char **, struct pattern *, enum pat_usage, int *, char **) = {
+int (*pat_parse_fcts[PAT_MATCH_NUM])(const char *, struct pattern *, enum pat_usage, char **) = {
[PAT_MATCH_FOUND] = pat_parse_nothing,
[PAT_MATCH_BOOL] = pat_parse_nothing,
[PAT_MATCH_INT] = pat_parse_int,
* These functions are exported and may be used by any other component.
*
* The following functions are used for parsing pattern matching
- * input value. The <text> contain a list of word. The last entry
- * must be one NULL character. the <text> contain the string to be
- * parsed. <pattern> must be a preallocated pattern. The pat_parse_*
- * functions fill this structure with the parsed value. <usage> can
- * be PAT_U_COMPILE or PAT_U_LOOKUP. If the value PAT_U_COMPILE is
- * used memory is allocated for filling the pattern. If the value
- * PAT_U_LOOKUP is set, the parser use "trash" or return pointers
- * to the input strings. In both cases, the caller must use the
- * value PAT_U_LOOKUP with caution. <opaque> is used to pass value
- * between two calls to the parser. the interger must ben initilized
- * to 0 (see note below). <err> is filled with an error message built
- * with memprintf() function.
+ * input value. The <text> contain the string to be parsed. <pattern>
+ * must be a preallocated pattern. The pat_parse_* functions fill this
+ * structure with the parsed value. <usage> can be PAT_U_COMPILE or
+ * PAT_U_LOOKUP. If the value PAT_U_COMPILE is used memory is allocated
+ * for filling the pattern. If the value PAT_U_LOOKUP is set, the parser
+ * use "trash" or return pointers to the input strings. In both cases,
+ * the caller must use the value PAT_U_LOOKUP with caution. <err> is
+ * filled with an error message built with memprintf() function.
*
- * In succes case, the pat_parse_* function return the number of
- * <text> eated. If the function fail, it returns 0 and <err> is
- * filled.
- *
- * NOTE: <opaque>iIt is used with integer range parser. The following
- * configuration line is processed with this method:
- *
- * acl ... -m int eq 10 20
- *
- * The first call to the parser eat 2 elements: "eq" and "10". The
- * pattern is filled with "eq 10" content. The <opaque> contain
- * coded value value that represent "eq".
- *
- * The second call to the parser just eat 1 element: "20". The opaque
- * contain the value of the operator. The parser returns pattern filled
- * with "eq 20".
+ * In succes case, the pat_parse_* function return 1. If the function
+ * fail, it returns 0 and <err> is filled.
*
*/
/* ignore the current line */
-int pat_parse_nothing(const char **text, struct pattern *pattern, enum pat_usage usage, int *opaque, char **err)
+int pat_parse_nothing(const char *text, struct pattern *pattern, enum pat_usage usage, char **err)
{
return 1;
}
/* Parse a string. It is allocated and duplicated. */
-int pat_parse_str(const char **text, struct pattern *pattern, enum pat_usage usage, int *opaque, char **err)
+int pat_parse_str(const char *text, struct pattern *pattern, enum pat_usage usage, char **err)
{
pattern->type = SMP_T_CSTR;
pattern->expect_type = SMP_T_CSTR;
if (usage == PAT_U_COMPILE) {
- pattern->ptr.str = strdup(*text);
+ pattern->ptr.str = strdup(text);
if (!pattern->ptr.str) {
memprintf(err, "out of memory while loading string pattern");
return 0;
}
}
else
- pattern->ptr.str = (char *)*text;
- pattern->len = strlen(*text);
+ pattern->ptr.str = (char *)text;
+ pattern->len = strlen(text);
return 1;
}
/* Parse a binary written in hexa. It is allocated. */
-int pat_parse_bin(const char **text, struct pattern *pattern, enum pat_usage usage, int *opaque, char **err)
+int pat_parse_bin(const char *text, struct pattern *pattern, enum pat_usage usage, char **err)
{
struct chunk *trash;
* if not fail. In succes case, this function eat always 1 elements.
* The double operator "!" converts the range "1-n" to "1".
*/
- return !!parse_binary(*text, &pattern->ptr.str, &pattern->len, err);
+ return !!parse_binary(text, &pattern->ptr.str, &pattern->len, err);
trash = get_trash_chunk();
pattern->len = trash->size;
pattern->ptr.str = trash->str;
- return !!parse_binary(*text, &pattern->ptr.str, &pattern->len, err);
+ return !!parse_binary(text, &pattern->ptr.str, &pattern->len, err);
}
/* Parse a regex. It is allocated. */
-int pat_parse_reg(const char **text, struct pattern *pattern, enum pat_usage usage, int *opaque, char **err)
+int pat_parse_reg(const char *text, struct pattern *pattern, enum pat_usage usage, char **err)
{
struct my_regex *preg;
struct chunk *trash;
return 0;
}
- if (!regex_comp(*text, preg, !(pattern->flags & PAT_F_IGNORE_CASE), 0, err)) {
+ if (!regex_comp(text, preg, !(pattern->flags & PAT_F_IGNORE_CASE), 0, err)) {
free(preg);
return 0;
}
}
preg = (struct my_regex *)trash->str;
- preg->regstr = (char *)*text;
+ preg->regstr = (char *)text;
pattern->freeptrbuf = NULL;
}
* non-zero on success.
*
*/
-int pat_parse_int(const char **text, struct pattern *pattern, enum pat_usage usage, int *opaque, char **err)
+int pat_parse_int(const char *text, struct pattern *pattern, enum pat_usage usage, char **err)
{
- const char *ptr = *text;
+ const char *ptr = text;
pattern->type = SMP_T_UINT;
pattern->expect_type = SMP_T_UINT;
/* Empty string is not valid */
- if (!**text)
+ if (!*text)
goto not_valid_range;
/* Search ':' or '-' separator. */
/* If separator not found. */
if (!*ptr) {
- if (strl2llrc(*text, ptr - *text, &pattern->val.range.min) != 0) {
- memprintf(err, "'%s' is not a number", *text);
+ if (strl2llrc(text, ptr - text, &pattern->val.range.min) != 0) {
+ memprintf(err, "'%s' is not a number", text);
return 0;
}
pattern->val.range.max = pattern->val.range.min;
}
/* If the separator is the first character. */
- if (ptr == *text && *(ptr + 1) != '\0') {
+ if (ptr == text && *(ptr + 1) != '\0') {
if (strl2llrc(ptr + 1, strlen(ptr + 1), &pattern->val.range.max) != 0)
goto not_valid_range;
/* If separator is the last character. */
if (*(ptr + 1) == '\0') {
- if (strl2llrc(*text, ptr - *text, &pattern->val.range.min) != 0)
+ if (strl2llrc(text, ptr - text, &pattern->val.range.min) != 0)
goto not_valid_range;
pattern->val.range.min_set = 1;
}
/* Else, parse two numbers. */
- if (strl2llrc(*text, ptr - *text, &pattern->val.range.min) != 0)
+ if (strl2llrc(text, ptr - text, &pattern->val.range.min) != 0)
goto not_valid_range;
if (strl2llrc(ptr + 1, strlen(ptr + 1), &pattern->val.range.max) != 0)
return 1;
not_valid_range:
- memprintf(err, "'%s' is not a valid number range", *text);
+ memprintf(err, "'%s' is not a valid number range", text);
return 0;
}
-int pat_parse_len(const char **text, struct pattern *pattern, enum pat_usage usage, int *opaque, char **err)
+int pat_parse_len(const char *text, struct pattern *pattern, enum pat_usage usage, char **err)
{
int ret;
- ret = pat_parse_int(text, pattern, usage, opaque, err);
+ ret = pat_parse_int(text, pattern, usage, err);
pattern->expect_type = SMP_T_CSTR;
return ret;
}
* acl valid_ssl ssl_req_proto 3.0-3.1
*
*/
-int pat_parse_dotted_ver(const char **text, struct pattern *pattern, enum pat_usage usage, int *opaque, char **err)
+int pat_parse_dotted_ver(const char *text, struct pattern *pattern, enum pat_usage usage, char **err)
{
- const char *ptr = *text;
+ const char *ptr = text;
pattern->type = SMP_T_UINT;
pattern->expect_type = SMP_T_UINT;
ptr++;
/* If separator not found. */
- if (*ptr == '\0' && ptr > *text) {
- if (strl2llrc_dotted(*text, ptr-*text, &pattern->val.range.min) != 0) {
- memprintf(err, "'%s' is not a dotted number", *text);
+ if (*ptr == '\0' && ptr > text) {
+ if (strl2llrc_dotted(text, ptr-text, &pattern->val.range.min) != 0) {
+ memprintf(err, "'%s' is not a dotted number", text);
return 0;
}
pattern->val.range.max = pattern->val.range.min;
}
/* If the separator is the first character. */
- if (ptr == *text && *(ptr+1) != '\0') {
+ if (ptr == text && *(ptr+1) != '\0') {
if (strl2llrc_dotted(ptr+1, strlen(ptr+1), &pattern->val.range.max) != 0) {
- memprintf(err, "'%s' is not a valid dotted number range", *text);
+ memprintf(err, "'%s' is not a valid dotted number range", text);
return 0;
}
pattern->val.range.min_set = 0;
}
/* If separator is the last character. */
- if (ptr == &(*text)[strlen(*text)-1]) {
- if (strl2llrc_dotted(*text, ptr-*text, &pattern->val.range.min) != 0) {
- memprintf(err, "'%s' is not a valid dotted number range", *text);
+ if (ptr == &text[strlen(text)-1]) {
+ if (strl2llrc_dotted(text, ptr-text, &pattern->val.range.min) != 0) {
+ memprintf(err, "'%s' is not a valid dotted number range", text);
return 0;
}
pattern->val.range.min_set = 1;
}
/* Else, parse two numbers. */
- if (strl2llrc_dotted(*text, ptr-*text, &pattern->val.range.min) != 0) {
- memprintf(err, "'%s' is not a valid dotted number range", *text);
+ if (strl2llrc_dotted(text, ptr-text, &pattern->val.range.min) != 0) {
+ memprintf(err, "'%s' is not a valid dotted number range", text);
return 0;
}
if (strl2llrc_dotted(ptr+1, strlen(ptr+1), &pattern->val.range.max) != 0) {
- memprintf(err, "'%s' is not a valid dotted number range", *text);
+ memprintf(err, "'%s' is not a valid dotted number range", text);
return 0;
}
if (pattern->val.range.min > pattern->val.range.max) {
- memprintf(err, "'%s' is not a valid dotted number range", *text);
+ memprintf(err, "'%s' is not a valid dotted number range", text);
return 0;
}
pattern->val.range.min_set = 1;
* may either be a dotted mask or a number of bits. Returns 1 if OK,
* otherwise 0. NOTE: IP address patterns are typed (IPV4/IPV6).
*/
-int pat_parse_ip(const char **text, struct pattern *pattern, enum pat_usage usage, int *opaque, char **err)
+int pat_parse_ip(const char *text, struct pattern *pattern, enum pat_usage usage, char **err)
{
pattern->expect_type = SMP_T_ADDR;
- if (str2net(*text, &pattern->val.ipv4.addr, &pattern->val.ipv4.mask)) {
+ if (str2net(text, &pattern->val.ipv4.addr, &pattern->val.ipv4.mask)) {
pattern->type = SMP_T_IPV4;
return 1;
}
- else if (str62net(*text, &pattern->val.ipv6.addr, &pattern->val.ipv6.mask)) {
+ else if (str62net(text, &pattern->val.ipv6.addr, &pattern->val.ipv6.mask)) {
/* no tree support right now */
pattern->type = SMP_T_IPV6;
return 1;
}
else {
- memprintf(err, "'%s' is not a valid IPv4 or IPv6 address", *text);
+ memprintf(err, "'%s' is not a valid IPv4 or IPv6 address", text);
return 0;
}
}
struct pattern **pattern,
int patflags, char **err)
{
- int opaque = 0;
unsigned int mask = 0;
struct pat_idx_elt *node;
int len;
memset(*pattern, 0, sizeof(**pattern));
(*pattern)->flags = patflags;
- ret = expr->parse(args, *pattern, PAT_U_COMPILE, &opaque, err);
+ ret = expr->parse(args[0], *pattern, PAT_U_COMPILE, err);
if (!ret)
return 0;
struct pattern *pat;
struct ebmb_node *node;
struct pat_idx_elt *elt;
- const char *args[2];
- int opaque = 0;
unsigned int mask = 0;
/* no real pattern */
return 0;
/* build lookup pattern */
- args[0] = key;
- args[1] = "";
- if (!expr->parse(args, &pattern, PAT_U_LOOKUP, &opaque, NULL))
+ if (!expr->parse(key, &pattern, PAT_U_LOOKUP, NULL))
return 0;
pat = NULL;