* Returns a pointer on allocated sample expression structure.
* The caller must have set al->ctx.
*/
-struct sample_expr *sample_parse_expr(char **str, int *idx, char *err, int err_size, struct arg_list *al)
+struct sample_expr *sample_parse_expr(char **str, int *idx, char **err_msg, struct arg_list *al)
{
const char *begw; /* beginning of word */
const char *endw; /* end of word */
char *fkw = NULL;
char *ckw = NULL;
- /* prepare a generic message if any further snprintf() fails */
- snprintf(err, err_size, "memory error.");
-
begw = str[*idx];
for (endw = begw; *endw && *endw != '(' && *endw != ','; endw++);
if (endw == begw) {
- snprintf(err, err_size, "missing fetch method");
+ memprintf(err_msg, "missing fetch method");
goto out_error;
}
fetch = find_sample_fetch(begw, endw - begw);
if (!fetch) {
- snprintf(err, err_size, "unknown fetch method '%s'", fkw);
+ memprintf(err_msg, "unknown fetch method '%s'", fkw);
goto out_error;
}
while (*endt && *endt != ')')
endt++;
if (*endt != ')') {
- snprintf(err, err_size, "syntax error: missing ')' after fetch keyword '%s'", fkw);
+ memprintf(err_msg, "missing closing ')' after arguments to fetch keyword '%s'", fkw);
goto out_error;
}
}
*/
if (fetch->out_type >= SMP_TYPES) {
- snprintf(err, err_size, "returns type of fetch method '%s' is unknown", fkw);
+ memprintf(err_msg, "returns type of fetch method '%s' is unknown", fkw);
goto out_error;
}
prev_type = fetch->out_type;
expr->arg_p = empty_arg_list;
if (endt != endw) {
- char *err_msg = NULL;
int err_arg;
if (!fetch->arg_mask) {
- snprintf(err, err_size, "fetch method '%s' does not support any args", fkw);
+ memprintf(err_msg, "fetch method '%s' does not support any args", fkw);
goto out_error;
}
al->kw = expr->fetch->kw;
al->conv = NULL;
- if (make_arg_list(endw + 1, endt - endw - 1, fetch->arg_mask, &expr->arg_p, &err_msg, NULL, &err_arg, al) < 0) {
- snprintf(err, err_size, "invalid arg %d in fetch method '%s' : %s", err_arg+1, fkw, err_msg);
- free(err_msg);
+ if (make_arg_list(endw + 1, endt - endw - 1, fetch->arg_mask, &expr->arg_p, err_msg, NULL, &err_arg, al) < 0) {
+ memprintf(err_msg, "invalid arg %d in fetch method '%s' : %s", err_arg+1, fkw, *err_msg);
goto out_error;
}
if (!expr->arg_p)
expr->arg_p = empty_arg_list;
- if (fetch->val_args && !fetch->val_args(expr->arg_p, &err_msg)) {
- snprintf(err, err_size, "invalid args in fetch method '%s' : %s", fkw, err_msg);
- free(err_msg);
+ if (fetch->val_args && !fetch->val_args(expr->arg_p, err_msg)) {
+ memprintf(err_msg, "invalid args in fetch method '%s' : %s", fkw, *err_msg);
goto out_error;
}
}
else if (ARGM(fetch->arg_mask)) {
- snprintf(err, err_size, "missing args for fetch method '%s'", fkw);
+ memprintf(err_msg, "missing args for fetch method '%s'", fkw);
goto out_error;
}
if (*endt && *endt != ',') {
if (ckw)
- snprintf(err, err_size, "missing comma after conv keyword '%s'", ckw);
+ memprintf(err_msg, "missing comma after conv keyword '%s'", ckw);
else
- snprintf(err, err_size, "missing comma after fetch keyword '%s'", fkw);
+ memprintf(err_msg, "missing comma after fetch keyword '%s'", fkw);
goto out_error;
}
/* we found an isolated keyword that we don't know, it's not ours */
if (begw == str[*idx])
break;
- snprintf(err, err_size, "unknown conv method '%s'", ckw);
+ memprintf(err_msg, "unknown conv method '%s'", ckw);
goto out_error;
}
while (*endt && *endt != ')')
endt++;
if (*endt != ')') {
- snprintf(err, err_size, "syntax error: missing ')' after conv keyword '%s'", ckw);
+ memprintf(err_msg, "syntax error: missing ')' after conv keyword '%s'", ckw);
goto out_error;
}
}
if (conv->in_type >= SMP_TYPES || conv->out_type >= SMP_TYPES) {
- snprintf(err, err_size, "returns type of conv method '%s' is unknown", ckw);
+ memprintf(err_msg, "returns type of conv method '%s' is unknown", ckw);
goto out_error;
}
/* If impossible type conversion */
if (!sample_casts[prev_type][conv->in_type]) {
- snprintf(err, err_size, "conv method '%s' cannot be applied", ckw);
+ memprintf(err_msg, "conv method '%s' cannot be applied", ckw);
goto out_error;
}
conv_expr->conv = conv;
if (endt != endw) {
- char *err_msg = NULL;
int err_arg;
if (!conv->arg_mask) {
- snprintf(err, err_size, "conv method '%s' does not support any args", ckw);
+ memprintf(err_msg, "conv method '%s' does not support any args", ckw);
goto out_error;
}
al->kw = expr->fetch->kw;
al->conv = conv_expr->conv->kw;
- if (make_arg_list(endw + 1, endt - endw - 1, conv->arg_mask, &conv_expr->arg_p, &err_msg, NULL, &err_arg, al) < 0) {
- snprintf(err, err_size, "invalid arg %d in conv method '%s' : %s", err_arg+1, ckw, err_msg);
- free(err_msg);
+ if (make_arg_list(endw + 1, endt - endw - 1, conv->arg_mask, &conv_expr->arg_p, err_msg, NULL, &err_arg, al) < 0) {
+ memprintf(err_msg, "invalid arg %d in conv method '%s' : %s", err_arg+1, ckw, *err_msg);
goto out_error;
}
if (!conv_expr->arg_p)
conv_expr->arg_p = empty_arg_list;
- if (conv->val_args && !conv->val_args(conv_expr->arg_p, conv, &err_msg)) {
- snprintf(err, err_size, "invalid args in conv method '%s' : %s", ckw, err_msg);
- free(err_msg);
+ if (conv->val_args && !conv->val_args(conv_expr->arg_p, conv, err_msg)) {
+ memprintf(err_msg, "invalid args in conv method '%s' : %s", ckw, *err_msg);
goto out_error;
}
}
else if (ARGM(conv->arg_mask)) {
- snprintf(err, err_size, "missing args for conv method '%s'", ckw);
+ memprintf(err_msg, "missing args for conv method '%s'", ckw);
goto out_error;
}
}