diff options
-rw-r--r-- | libsieve/require.c | 9 | ||||
-rw-r--r-- | libsieve/sieve.l | 23 | ||||
-rw-r--r-- | libsieve/util.c | 32 |
3 files changed, 41 insertions, 23 deletions
diff --git a/libsieve/require.c b/libsieve/require.c index 4512eb74c..44a192dbd 100644 --- a/libsieve/require.c +++ b/libsieve/require.c @@ -34,8 +34,8 @@ sieve_require (list_t slist) status = iterator_create (&itr, slist); if (status) { - sieve_error ("%s:%d: cannot create iterator: %s", - sieve_filename, sieve_line_num, + sieve_compile_error (sieve_filename, sieve_line_num, + "cannot create iterator: %s", mu_errstring (status)); return; } @@ -51,8 +51,9 @@ sieve_require (list_t slist) reg = sieve_action_lookup (s); if (!reg) { - sieve_error ("%s:%d: source for the required action %s is not available", - sieve_filename, sieve_line_num, s); + sieve_compile_error (sieve_filename, sieve_line_num, + "source for the required action %s is not available", + s); break; } reg->required = 1; diff --git a/libsieve/sieve.l b/libsieve/sieve.l index 65bd2997d..a541a1c5f 100644 --- a/libsieve/sieve.l +++ b/libsieve/sieve.l @@ -117,7 +117,7 @@ lex_set_buffer (FILE *fp) if (!buf) { - sieve_error ("not enough memory"); + sieve_compile_error (sieve_filename, sieve_line_num, "not enough memory"); abort (); } @@ -218,8 +218,8 @@ push_source (const char *name) if (stat (name, &st)) { - sieve_error ("can't stat `%s': %s", name, strerror (errno)); - yyerror ("can't include file"); + sieve_compile_error (sieve_filename, sieve_line_num, + "can't stat `%s': %s", name, strerror (errno)); return 1; } @@ -232,19 +232,21 @@ push_source (const char *name) { yyerror ("recursive inclusion"); if (ctx->prev) - sieve_error ("%s:%d: `%s' already included here", - ctx->prev->filename, ctx->prev->line, name); + sieve_compile_error (ctx->prev->filename, ctx->prev->line, + "`%s' already included here", + name); else - sieve_error ("`%s' already included at top level", - name); + sieve_compile_error (sieve_filename, sieve_line_num, + "`%s' already included at top level", + name); return 1; } fp = fopen (name, "r"); if (!fp) { - sieve_error ("can't open `%s': %s", name, strerror (errno)); - yyerror ("can't include file"); + sieve_compile_error (sieve_filename, sieve_line_num, + "can't open `%s': %s", name, strerror (errno)); return 1; } @@ -470,7 +472,8 @@ multiline_begin () status = list_create (&string_list); if (status) { - sieve_error ("list_create: %s", mu_errstring (status)); + sieve_compile_error (sieve_filename, sieve_line_num, + "list_create: %s", mu_errstring (status)); exit (1); } } diff --git a/libsieve/util.c b/libsieve/util.c index 2fadeeb55..b8b23a55c 100644 --- a/libsieve/util.c +++ b/libsieve/util.c @@ -144,20 +144,31 @@ sieve_value_create (sieve_data_type type, void *data) break; default: - sieve_error ("Invalid data type"); + sieve_compile_error (sieve_filename, sieve_line_num, "Invalid data type"); abort (); } return val; } void -sieve_error (const char *fmt, ...) +sieve_compile_error (const char *filename, int linenum, const char *fmt, ...) { va_list ap; va_start (ap, fmt); sieve_error_count++; - sieve_machine->error_printer (sieve_machine->data, fmt, ap); + sieve_machine->parse_error_printer (sieve_machine->data, filename, linenum, + fmt, ap); + va_end (ap); +} + +void +sieve_error (sieve_machine_t *mach, const char *fmt, ...) +{ + va_list ap; + + va_start (ap, fmt); + mach->error_printer (mach->data, fmt, ap); va_end (ap); } @@ -187,6 +198,15 @@ _sieve_default_error_printer (void *unused, const char *fmt, va_list ap) return mu_verror (fmt, ap); } +int +_sieve_default_parse_error (void *unused, const char *filename, int lineno, + const char *fmt, va_list ap) +{ + fprintf (stderr, "%s:%d: ", filename, lineno); + vfprintf (stderr, fmt, ap); + return 0; +} + char * sieve_type_str (sieve_data_type type) { @@ -304,10 +324,4 @@ sieve_print_tag_list (list_t list, sieve_printf_t printer, void *data) list_do (list, (list_action_t*) tag_printer, &dbg); } -void -sieve_set_debug (sieve_machine_t *mach, sieve_printf_t debug, int level) -{ - mach->debug_printer = debug; - mach->debug_level = level; -} |