X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=src%2Fui%2Fterminal%2Fmain.c;h=d2336472bfb98a0b19d6bc10a8f8864dc38788a6;hb=510cc9dd9baf3108ba55cfb7893384517c9930b4;hp=6e573d5cca90bd770e0eac4e33a24ccc1a7cf530;hpb=b2b2b0a29f80de89d96bcceea90f117930ab47b9;p=pspp diff --git a/src/ui/terminal/main.c b/src/ui/terminal/main.c index 6e573d5cca..d2336472bf 100644 --- a/src/ui/terminal/main.c +++ b/src/ui/terminal/main.c @@ -1,5 +1,5 @@ /* PSPP - a program for statistical analysis. - Copyright (C) 1997-2000, 2006-2007, 2009-2013 Free Software Foundation, Inc. + Copyright (C) 1997-2000, 2006-2007, 2009-2014 Free Software Foundation, Inc. This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -33,7 +33,6 @@ #include "data/dataset.h" #include "data/dictionary.h" #include "data/file-handle-def.h" -#include "data/file-name.h" #include "data/session.h" #include "data/settings.h" #include "data/variable.h" @@ -48,11 +47,10 @@ #include "libpspp/version.h" #include "math/random.h" #include "output/driver.h" -#include "output/message-item.h" +#include "output/output-item.h" #include "ui/source-init-opts.h" #include "ui/terminal/terminal-opts.h" #include "ui/terminal/terminal-reader.h" -#include "ui/terminal/terminal.h" #include "gl/fatal-signal.h" #include "gl/progname.h" @@ -64,10 +62,10 @@ static struct session *the_session; static void add_syntax_reader (struct lexer *, const char *file_name, - const char *encoding, enum lex_syntax_mode); + const char *encoding, enum segmenter_mode); static void bug_handler(int sig); static void fpu_init (void); -static void output_msg (const struct msg *, void *); +static void output_msg (const struct msg *, struct lexer *); /* Program entry point. */ int @@ -75,13 +73,16 @@ main (int argc, char **argv) { struct terminal_opts *terminal_opts; struct argv_parser *parser; - enum lex_syntax_mode syntax_mode; + enum segmenter_mode syntax_mode; char *syntax_encoding; bool process_statrc; struct lexer *lexer; set_program_name (argv[0]); + prepare_fatal_error_message (); + prepare_diagnostic_information (); + signal (SIGABRT, bug_handler); signal (SIGSEGV, bug_handler); signal (SIGFPE, bug_handler); @@ -90,9 +91,9 @@ main (int argc, char **argv) fpu_init (); gsl_set_error_handler_off (); + output_engine_push (); fh_init (); settings_init (); - terminal_check_size (); random_init (); lexer = lex_create (); @@ -108,7 +109,7 @@ main (int argc, char **argv) terminal_opts_done (terminal_opts, argc, argv); argv_parser_destroy (parser); - msg_set_handler (output_msg, lexer); + lex_set_message_handler (lexer, output_msg); session_set_default_syntax_encoding (the_session, syntax_encoding); /* Add syntax files to source stream. */ @@ -117,7 +118,7 @@ main (int argc, char **argv) char *rc = include_path_search ("rc"); if (rc != NULL) { - add_syntax_reader (lexer, rc, "Auto", LEX_SYNTAX_AUTO); + add_syntax_reader (lexer, rc, "Auto", SEG_MODE_AUTO); free (rc); } } @@ -147,7 +148,7 @@ main (int argc, char **argv) lex_discard_noninteractive (lexer); } else if (result == CMD_CASCADING_FAILURE - && lex_get_error_mode (lexer) != LEX_ERROR_INTERACTIVE) + && lex_get_error_mode (lexer) != LEX_ERROR_TERMINAL) { msg (SE, _("Stopping syntax file processing here to avoid " "a cascade of dependent command failures.")); @@ -160,13 +161,13 @@ main (int argc, char **argv) } + output_engine_pop (); session_destroy (the_session); random_done (); settings_done (); fh_done (); lex_destroy (lexer); - output_close (); i18n_done (); return msg_ui_any_errors (); @@ -214,24 +215,35 @@ bug_handler(int sig) } static void -output_msg (const struct msg *m_, void *lexer_) +output_msg (const struct msg *m_, struct lexer *lexer) { - struct lexer *lexer = lexer_; - struct msg m = *m_; - - if (m.file_name == NULL) + struct msg_location *location = m_->location; + if (!location && lexer) { - m.file_name = CONST_CAST (char *, lex_get_file_name (lexer)); - m.first_line = lex_get_first_line_number (lexer, 0); - m.last_line = lex_get_last_line_number (lexer, 0); + location = lex_get_location (lexer, 0, 0); + msg_location_remove_columns (location); } - message_item_submit (message_item_create (&m)); + struct msg m = { + .category = m_->category, + .severity = m_->severity, + .stack = m_->stack, + .n_stack = m_->n_stack, + .location = location, + .command_name = output_get_uppercase_command_name (), + .text = m_->text, + }; + + output_item_submit (message_item_create (&m)); + + free (m.command_name); + if (m.location != m_->location) + msg_location_destroy (m.location); } static void add_syntax_reader (struct lexer *lexer, const char *file_name, - const char *encoding, enum lex_syntax_mode syntax_mode) + const char *encoding, enum segmenter_mode syntax_mode) { struct lex_reader *reader;