X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Ferror.c;h=571e6393340640107bb6773fd7a7f8bd79f1883d;hb=6a42f0b711d699333fda01a076b8a27275fc4492;hp=1065fbd7ed93e7f20aa4216bf1fa16d5cea75809;hpb=205ac3afa4c2b19c85819d8695abf3975bb11807;p=pspp diff --git a/src/error.c b/src/error.c index 1065fbd7ed..571e639334 100644 --- a/src/error.c +++ b/src/error.c @@ -14,8 +14,8 @@ You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - 02111-1307, USA. */ + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA + 02110-1301, USA. */ #include #include "error.h" @@ -26,6 +26,8 @@ #include "alloc.h" #include "command.h" #include "getline.h" +#include "glob.h" +#include "lexer.h" #include "main.h" #include "output.h" #include "settings.h" @@ -51,27 +53,16 @@ static int nfile_loc, mfile_loc; void tmsg (int class, const char *title, const char *format, ...) { - char buf[1024]; - - /* Format the message into BUF. */ - { - va_list args; + struct error e; + va_list args; - va_start (args, format); - vsnprintf (buf, 1024, format, args); - va_end (args); - } - - /* Output the message. */ - { - struct error e; + e.class = class; + err_location (&e.where); + e.title = title; - e.class = class; - err_location (&e.where); - e.title = title; - e.text = buf; - err_vmsg (&e); - } + va_start (args, format); + err_vmsg (&e, format, args); + va_end (args); } /* Writes error message in CLASS, with text FORMAT, formatted with @@ -79,31 +70,16 @@ tmsg (int class, const char *title, const char *format, ...) void msg (int class, const char *format, ...) { - struct string buf; - - ds_init (NULL, &buf, 1024); - - /* Format the message into BUF. */ - { - va_list args; - - va_start (args, format); - ds_vprintf (&buf, format, args); - va_end (args); - } - - /* Output the message. */ - { - struct error e; + struct error e; + va_list args; - e.class = class; - err_location (&e.where); - e.title = NULL; - e.text = buf.string; - err_vmsg (&e); - } + e.class = class; + err_location (&e.where); + e.title = NULL; - ds_destroy (&buf); + va_start (args, format); + err_vmsg (&e, format, args); + va_end (args); } /* Terminate due to fatal error in input. */ @@ -223,9 +199,15 @@ err_hcf (int success) { terminating = 1; + lex_done(); getl_uninitialize (); + free(file_loc); + file_loc = NULL; + nfile_loc = mfile_loc = 0; + outp_done (); + done_glob(); exit (success ? EXIT_SUCCESS : EXIT_FAILURE); } @@ -235,7 +217,7 @@ static void dump_message (char *errbuf, unsigned indent, void (*func) (const char *), unsigned width); void -err_vmsg (const struct error *e) +err_vmsg (const struct error *e, const char *format, va_list args) { /* Class flags. */ enum @@ -281,15 +263,15 @@ err_vmsg (const struct error *e) class &= ERR_CLASS_MASK; assert (class >= 0 && class < ERR_CLASS_COUNT); - assert (e->text != NULL); + assert (format != 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)); @@ -304,9 +286,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_vprintf (&msg, format, args); /* FIXME: Check set_messages and set_errors to determine where to send errors and messages. @@ -314,7 +296,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); @@ -500,11 +482,6 @@ dump_message (char *msg, unsigned indent, void (*func) (const char *), memset (buf, ' ', indent); memcpy (&buf[indent], cp, cp2 - cp); - if ( hard_break) - { - buf[indent + idx + cp2 - cp] = '\n'; - ++idx; - } buf[indent + idx + cp2 - cp] = '\0'; func (buf); cp = cp2; @@ -535,7 +512,9 @@ request_bug_report_and_abort(const char *msg ) "default_config_path: %s\n" "include_path: %s\n" "groff_font_path: %s\n" - "locale_dir: %s\n", + "locale_dir: %s\n" + "compiler version: %s\n" + , bare_version, version, @@ -545,7 +524,13 @@ request_bug_report_and_abort(const char *msg ) default_config_path, include_path, groff_font_path, - locale_dir); + locale_dir, +#ifdef __VERSION__ + __VERSION__ +#else + "Unknown" +#endif + ); if ( msg ) fprintf(stderr,"Diagnosis: %s\n",msg); @@ -559,7 +544,7 @@ request_bug_report_and_abort(const char *msg ) void err_assert_fail(const char *expr, const char *file, int line) { - const char msg[256]; + char msg[256]; snprintf(msg,256,"Assertion failed: %s:%d; (%s)",file,line,expr); request_bug_report_and_abort( msg ); }