struct list list; /* used for listing */
struct map_reference *ref; /* the reference used for unindexed entries */
struct sample_conv *conv; /* original converter descriptor */
- int (*parse)(const char *text, /* The function that can parse the output value */
- struct sample_storage *smp);
struct pattern_expr *pat; /* the pattern matching associated to the map */
int do_free; /* set if <pat> is the orignal pat and must be freed */
char *default_value; /* a copy of default value. This copy is
*/
struct pattern_expr {
int (*parse)(const char *text, struct pattern *pattern, char **err);
+ int (*parse_smp)(const char *text, struct sample_storage *smp);
int (*index)(struct pattern_expr *, struct pattern *, char **);
void (*delete)(struct pattern_expr *, struct pattern *);
struct sample_storage **(*find_smp)(struct pattern_expr *, struct pattern *);
stats_map_lookup_next(si)) {
smp = pattern_find_smp(args[3], appctx->ctx.map.desc->pat, NULL);
if (smp)
- appctx->ctx.map.desc->parse(value, *smp);
+ appctx->ctx.map.desc->pat->parse_smp(value, *smp);
}
/* The set is done, send message. */
* is canceled for this 'descriptor', but continue, for
* the other descriptors.
*/
- if (!appctx->ctx.map.desc->parse(ent->value, smp)) {
+ if (!appctx->ctx.map.desc->pat->parse_smp(ent->value, smp)) {
free(smp);
continue;
}
return 0;
/* first read and convert value */
- if (!desc->parse(ent->value, smp)) {
+ if (!desc->pat->parse_smp(ent->value, smp)) {
memprintf(err, "parse value failed at line %d of file <%s>",
ent->line, desc->ref->reference);
return 0;
/* check the output parse method */
switch (desc->conv->out_type) {
- case SMP_T_STR: desc->parse = map_parse_str; break;
- case SMP_T_UINT: desc->parse = map_parse_int; break;
- case SMP_T_IPV4: desc->parse = map_parse_ip; break;
- case SMP_T_IPV6: desc->parse = map_parse_ip6; break;
+ case SMP_T_STR: desc->pat->parse_smp = map_parse_str; break;
+ case SMP_T_UINT: desc->pat->parse_smp = map_parse_int; break;
+ case SMP_T_IPV4: desc->pat->parse_smp = map_parse_ip; break;
+ case SMP_T_IPV6: desc->pat->parse_smp = map_parse_ip6; break;
default:
memprintf(err, "map: internal haproxy error: no default parse case for the input type <%d>.",
conv->out_type);
memprintf(err, "out of memory");
return 0;
}
- if (!desc->parse(desc->default_value, desc->def)) {
+ if (!desc->pat->parse_smp(desc->default_value, desc->def)) {
memprintf(err, "Cannot parse default value");
return 0;
}