summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2002-11-13 13:35:00 +0000
committerSergey Poznyakoff <gray@gnu.org.ua>2002-11-13 13:35:00 +0000
commit91aa105c038a290f9fe4e1fe22a4a2c4b2c020a3 (patch)
tree1dc2e5380e7eb5588ba170fb0b698f6d160dadbd
parent5b62b3d3c8fb3238b37e8d7caf6893699d22eee2 (diff)
downloadmailutils-91aa105c038a290f9fe4e1fe22a4a2c4b2c020a3.tar.gz
mailutils-91aa105c038a290f9fe4e1fe22a4a2c4b2c020a3.tar.bz2
(sieve_code_command): Implemented implicit typecast from string to string-list.
-rw-r--r--libsieve/prog.c73
1 files changed, 45 insertions, 28 deletions
diff --git a/libsieve/prog.c b/libsieve/prog.c
index 1ecfdb60d..4571c9434 100644
--- a/libsieve/prog.c
+++ b/libsieve/prog.c
@@ -32,14 +32,14 @@ sieve_code (sieve_op_t *op)
sieve_op_t *newprog = sieve_prealloc (&sieve_machine->memory_pool,
sieve_machine->prog,
newsize *
sizeof sieve_machine->prog[0]);
if (!newprog)
{
- sieve_error ("%s:%d: out of memory!",
- sieve_filename, sieve_line_num);
+ sieve_compile_error (sieve_filename, sieve_line_num,
+ "out of memory!");
return 1;
}
sieve_machine->prog = newprog;
sieve_machine->progsize = newsize;
}
sieve_machine->prog[sieve_machine->pc++] = *op;
@@ -121,15 +121,15 @@ sieve_code_command (sieve_register_t *reg, list_t arglist)
if (arglist)
{
rc = iterator_create (&itr, arglist);
if (rc)
{
- sieve_error ("%s:%d: can't create iterator: %s",
- sieve_filename, sieve_line_num,
- mu_errstring (rc));
+ sieve_compile_error (sieve_filename, sieve_line_num,
+ "can't create iterator: %s",
+ mu_errstring (rc));
return 1;
}
for (iterator_first (itr); !iterator_is_done (itr); iterator_next (itr))
{
sieve_value_t *val;
@@ -139,24 +139,24 @@ sieve_code_command (sieve_register_t *reg, list_t arglist)
if (val->type == SVT_TAG)
{
sieve_tag_def_t *tag = find_tag (reg->tags, val->v.string);
if (!tag)
{
- sieve_error ("%s:%d: invalid tag name `%s' for `%s'",
- sieve_filename, sieve_line_num,
+ sieve_compile_error (sieve_filename, sieve_line_num,
+ "invalid tag name `%s' for `%s'",
val->v.string, reg->name);
err = 1;
break;
}
if (!tag_list && (rc = list_create (&tag_list)))
{
- sieve_error ("%s:%d: can't create tag list: %s",
- sieve_filename, sieve_line_num,
- mu_errstring (rc));
+ sieve_compile_error (sieve_filename, sieve_line_num,
+ "%s:%d: can't create tag list: %s",
+ mu_errstring (rc));
err = 1;
break;
}
tagrec.tag = tag->num;
if (tag->argtype != SVT_VOID)
@@ -171,34 +171,51 @@ sieve_code_command (sieve_register_t *reg, list_t arglist)
sizeof (*tagptr));
*tagptr = tagrec;
list_append (tag_list, tagptr);
}
else if (*exp_arg == SVT_VOID)
{
- sieve_error ("%s:%d: too many arguments in call to `%s'",
- sieve_filename, sieve_line_num,
- reg->name);
- err = 1;
- break;
- }
- else if (*exp_arg != val->type)
- {
- sieve_error ("%s:%d: type mismatch in argument %d to `%s'",
- sieve_filename, sieve_line_num,
- exp_arg - reg->req_args + 1,
- reg->name);
+ sieve_compile_error (sieve_filename, sieve_line_num,
+ "too many arguments in call to `%s'",
+ reg->name);
err = 1;
break;
}
else
{
+ if (*exp_arg != val->type)
+ {
+ if (*exp_arg == SVT_STRING_LIST && val->type == SVT_STRING)
+ {
+ list_t list;
+
+ list_create (&list);
+ list_append (list, val->v.string);
+ sieve_pfree (&sieve_machine->memory_pool, val);
+ val = sieve_value_create (SVT_STRING_LIST, list);
+ }
+ else
+ {
+ sieve_compile_error (sieve_filename, sieve_line_num,
+ "type mismatch in argument %d to `%s'",
+ exp_arg - reg->req_args + 1,
+ reg->name);
+ sieve_compile_error (sieve_filename, sieve_line_num,
+ "Expected %s but passed %s",
+ sieve_type_str (*exp_arg),
+ sieve_type_str (val->type));
+ err = 1;
+ break;
+ }
+ }
+
if (!arg_list && (rc = list_create (&arg_list)))
{
- sieve_error ("%s:%d: can't create arg list: %s",
- sieve_filename, sieve_line_num,
- mu_errstring (rc));
+ sieve_compile_error (sieve_filename, sieve_line_num,
+ "can't create arg list: %s",
+ mu_errstring (rc));
err = 1;
break;
}
list_append (arg_list, val);
exp_arg++;
@@ -208,15 +225,15 @@ sieve_code_command (sieve_register_t *reg, list_t arglist)
}
if (!err)
{
if (*exp_arg != SVT_VOID)
{
- sieve_error ("%s:%d: too few arguments in call to `%s'",
- sieve_filename, sieve_line_num,
- reg->name);
+ sieve_compile_error (sieve_filename, sieve_line_num,
+ "too few arguments in call to `%s'",
+ reg->name);
err = 1;
}
}
if (!err)
err = sieve_code_list (arg_list)

Return to:

Send suggestions and report system problems to the System administrator.