X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Ferror.c;h=e062f5ccf428febb1f24d5a993b0264dbe8d675d;hb=b2f22a54346df45ab24d83e1228700649f62d63c;hp=3dadab42464d624bb9a429f54ef47b6c027045fe;hpb=def7e6026513a3ee7c2b38416b30a2e890e34311;p=pspp diff --git a/src/error.c b/src/error.c index 3dadab4246..e062f5ccf4 100644 --- a/src/error.c +++ b/src/error.c @@ -18,7 +18,6 @@ 02111-1307, USA. */ #include -#include #include "error.h" #include #include @@ -32,6 +31,7 @@ #include "settings.h" #include "str.h" #include "var.h" +#include "version.h" int err_error_count; int err_warning_count; @@ -81,7 +81,7 @@ msg (int class, const char *format, ...) { struct string buf; - ds_init (NULL, &buf, 1024); + ds_init (&buf, 1024); /* Format the message into BUF. */ { @@ -102,6 +102,8 @@ msg (int class, const char *format, ...) e.text = buf.string; err_vmsg (&e); } + + ds_destroy (&buf); } /* Terminate due to fatal error in input. */ @@ -221,9 +223,13 @@ err_hcf (int success) { terminating = 1; + lex_done(); getl_uninitialize (); + free(file_loc); outp_done (); + done_glob(); + exit (success ? EXIT_SUCCESS : EXIT_FAILURE); } @@ -281,13 +287,13 @@ err_vmsg (const struct error *e) assert (class >= 0 && class < ERR_CLASS_COUNT); assert (e->text != NULL); - ds_init (NULL, &msg, 64); + ds_init (&msg, 64); if (e->where.filename && (error_classes[class].flags & ERR_WITH_FILE)) { ds_printf (&msg, "%s:", e->where.filename); if (e->where.line_number != -1) ds_printf (&msg, "%d:", e->where.line_number); - ds_putchar (&msg, ' '); + ds_putc (&msg, ' '); } ds_printf (&msg, "%s: ", gettext (error_classes[class].banner)); @@ -302,9 +308,9 @@ err_vmsg (const struct error *e) ds_printf (&msg, "%s: ", cur_proc); if (e->title) - ds_concat (&msg, e->title); + ds_puts (&msg, e->title); - ds_concat (&msg, e->text); + ds_puts (&msg, e->text); /* FIXME: Check set_messages and set_errors to determine where to send errors and messages. @@ -312,7 +318,7 @@ err_vmsg (const struct error *e) Please note that this is not trivial. We have to avoid an infinite loop in reporting errors that originate in the output section. */ - dump_message (ds_value (&msg), 8, puts_stdout, get_viewwidth()); + dump_message (ds_c_str (&msg), 8, puts_stdout, get_viewwidth()); ds_destroy (&msg); @@ -510,3 +516,54 @@ dump_message (char *msg, unsigned indent, void (*func) (const char *), local_free (buf); } + + +void +request_bug_report_and_abort(const char *msg ) +{ + fprintf(stderr, + "******************************************************************\n" + "You have discovered a bug in PSPP.\n\n" + " Please report this, by sending " + "an email to " PACKAGE_BUGREPORT ",\n" + "explaining what you were doing when this happened, and including\n" + "a sample of your input file which caused it.\n"); + + fprintf(stderr, + "Also, please copy the following lines into your bug report:\n\n" + "bare_version: %s\n" + "version: %s\n" + "stat_version: %s\n" + "host_system: %s\n" + "build_system: %s\n" + "default_config_path: %s\n" + "include_path: %s\n" + "groff_font_path: %s\n" + "locale_dir: %s\n", + + bare_version, + version, + stat_version, + host_system, + build_system, + default_config_path, + include_path, + groff_font_path, + locale_dir); + + if ( msg ) + fprintf(stderr,"Diagnosis: %s\n",msg); + + fprintf(stderr, + "******************************************************************\n"); + + abort(); +} + +void +err_assert_fail(const char *expr, const char *file, int line) +{ + char msg[256]; + snprintf(msg,256,"Assertion failed: %s:%d; (%s)",file,line,expr); + request_bug_report_and_abort( msg ); +}