fix status of lbtt's subtree. Apparently it was messed up during the cvsimport
This commit is contained in:
parent
17f76e371f
commit
91df6cab77
77 changed files with 16272 additions and 6019 deletions
434
lbtt/src/main.cc
434
lbtt/src/main.cc
|
|
@ -1,6 +1,6 @@
|
|||
/*
|
||||
* Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004
|
||||
* Heikki Tauriainen <Heikki.Tauriainen@hut.fi>
|
||||
* Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005
|
||||
* Heikki Tauriainen <Heikki.Tauriainen@tkk.fi>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License
|
||||
|
|
@ -21,6 +21,9 @@
|
|||
#include <csignal>
|
||||
#include <cstdlib>
|
||||
#include <ctime>
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif /* HAVE_SYS_TYPES_H */
|
||||
#include <iostream>
|
||||
#include <vector>
|
||||
#ifdef HAVE_READLINE
|
||||
|
|
@ -28,6 +31,11 @@
|
|||
#include <readline/readline.h>
|
||||
#include <readline/history.h>
|
||||
#endif /* HAVE_READLINE */
|
||||
#ifdef HAVE_ISATTY
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif /* HAVE_UNISTD_H */
|
||||
#endif /* HAVE_ISATTY */
|
||||
#include "LbttAlloc.h"
|
||||
#include "Configuration.h"
|
||||
#include "DispUtil.h"
|
||||
|
|
@ -36,6 +44,7 @@
|
|||
#include "Random.h"
|
||||
#include "SharedTestData.h"
|
||||
#include "StatDisplay.h"
|
||||
#include "TempFsysName.h"
|
||||
#include "TestOperations.h"
|
||||
#include "TestRoundInfo.h"
|
||||
#include "TestStatistics.h"
|
||||
|
|
@ -43,17 +52,6 @@
|
|||
|
||||
using namespace std;
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* Handler for the SIGINT signal.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
RETSIGTYPE breakHandler(int)
|
||||
{
|
||||
user_break = true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
|
|
@ -92,12 +90,12 @@ TestRoundInfo round_info; /* Data structure for
|
|||
* round.
|
||||
*/
|
||||
|
||||
vector<AlgorithmTestResults, /* Test results for each */
|
||||
ALLOC(AlgorithmTestResults) > /* individual algorithm. */
|
||||
test_results;
|
||||
vector<AlgorithmTestResults> test_results; /* Test results for each
|
||||
* individual algorithm.
|
||||
*/
|
||||
|
||||
vector<TestStatistics, ALLOC(TestStatistics) > /* Overall test */
|
||||
final_statistics; /* statistics for each
|
||||
vector<TestStatistics> final_statistics; /* Overall test
|
||||
* statistics for each
|
||||
* algorithm.
|
||||
*/
|
||||
|
||||
|
|
@ -105,13 +103,124 @@ vector<TestStatistics, ALLOC(TestStatistics) > /* Overall test */
|
|||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* Functions for allocating and deallocating temporary file names.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
static void allocateTempFilenames()
|
||||
{
|
||||
using SharedTestData::round_info;
|
||||
round_info.formula_file_name[0] = new TempFsysName;
|
||||
round_info.formula_file_name[0]->allocate("lbtt");
|
||||
round_info.formula_file_name[1] = new TempFsysName;
|
||||
round_info.formula_file_name[1]->allocate("lbtt");
|
||||
round_info.automaton_file_name = new TempFsysName;
|
||||
round_info.automaton_file_name->allocate("lbtt");
|
||||
round_info.cout_capture_file = new TempFsysName;
|
||||
round_info.cout_capture_file->allocate("lbtt");
|
||||
round_info.cerr_capture_file = new TempFsysName;
|
||||
round_info.cerr_capture_file->allocate("lbtt");
|
||||
}
|
||||
|
||||
static void deallocateTempFilenames()
|
||||
{
|
||||
using SharedTestData::round_info;
|
||||
if (round_info.formula_file_name[0] != 0)
|
||||
{
|
||||
delete round_info.formula_file_name[0];
|
||||
round_info.formula_file_name[0] = 0;
|
||||
}
|
||||
if (round_info.formula_file_name[1] != 0)
|
||||
{
|
||||
delete round_info.formula_file_name[1];
|
||||
round_info.formula_file_name[1] = 0;
|
||||
}
|
||||
if (round_info.automaton_file_name != 0)
|
||||
{
|
||||
delete round_info.automaton_file_name;
|
||||
round_info.automaton_file_name = 0;
|
||||
}
|
||||
if (round_info.cout_capture_file != 0)
|
||||
{
|
||||
delete round_info.cout_capture_file;
|
||||
round_info.cout_capture_file = 0;
|
||||
}
|
||||
if (round_info.cerr_capture_file != 0)
|
||||
{
|
||||
delete round_info.cerr_capture_file;
|
||||
round_info.cerr_capture_file = 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* Handler for the SIGINT signal.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
static void breakHandler(int)
|
||||
{
|
||||
user_break = true;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* Default handler for signals that terminate the process.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
pid_t translator_process = 0; /* Process group for translator process */
|
||||
|
||||
static void abortHandler(int signum)
|
||||
{
|
||||
deallocateTempFilenames();
|
||||
if (translator_process != 0 && kill(translator_process, 0) == 0)
|
||||
kill(-translator_process, SIGTERM);
|
||||
struct sigaction s;
|
||||
s.sa_handler = SIG_DFL;
|
||||
sigemptyset(&s.sa_mask);
|
||||
s.sa_flags = 0;
|
||||
sigaction(signum, &s, static_cast<struct sigaction*>(0));
|
||||
raise(signum);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* Function for installing signal handlers.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
static void installSignalHandler(int signum, void (*handler)(int))
|
||||
{
|
||||
struct sigaction s;
|
||||
sigaction(signum, static_cast<struct sigaction*>(0), &s);
|
||||
|
||||
if (s.sa_handler != SIG_IGN)
|
||||
{
|
||||
s.sa_handler = handler;
|
||||
sigemptyset(&s.sa_mask);
|
||||
s.sa_flags = 0;
|
||||
sigaction(signum, &s, static_cast<struct sigaction*>(0));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/******************************************************************************
|
||||
*
|
||||
* Test loop.
|
||||
*
|
||||
*****************************************************************************/
|
||||
|
||||
int testLoop()
|
||||
bool testLoop()
|
||||
{
|
||||
using namespace DispUtil;
|
||||
using namespace SharedTestData;
|
||||
|
|
@ -119,9 +228,6 @@ int testLoop()
|
|||
using namespace StringUtil;
|
||||
using namespace TestOperations;
|
||||
|
||||
/* Return code. Will be set to 1 if any of the test fails. */
|
||||
int exit_status = 0;
|
||||
|
||||
const Configuration::GlobalConfiguration& global_options
|
||||
= configuration.global_options;
|
||||
|
||||
|
|
@ -139,13 +245,6 @@ int testLoop()
|
|||
? round_info.next_round_to_run
|
||||
: global_options.number_of_rounds + 1);
|
||||
|
||||
if (tmpnam(round_info.formula_file_name[0]) == 0
|
||||
|| tmpnam(round_info.formula_file_name[1]) == 0
|
||||
|| tmpnam(round_info.automaton_file_name) == 0
|
||||
|| tmpnam(round_info.cout_capture_file) == 0
|
||||
|| tmpnam(round_info.cerr_capture_file) == 0)
|
||||
throw Exception("unable to allocate names for temporary files");
|
||||
|
||||
/*
|
||||
* If a name for the error log file was given in the configuration, create
|
||||
* the file.
|
||||
|
|
@ -173,9 +272,9 @@ int testLoop()
|
|||
try
|
||||
{
|
||||
round_info.transcript_file << "lbtt " PACKAGE_VERSION
|
||||
" error log file, created on "
|
||||
+ string(ctime(¤t_time))
|
||||
+ '\n';
|
||||
" error log file, created on "
|
||||
+ string(ctime(¤t_time))
|
||||
+ '\n';
|
||||
|
||||
configuration.print(round_info.transcript_file);
|
||||
}
|
||||
|
|
@ -187,16 +286,24 @@ int testLoop()
|
|||
|
||||
/*
|
||||
* If a formula file name was given in the configuration, open the file for
|
||||
* reading.
|
||||
* reading. The special filename "-" refers to the standard input.
|
||||
*/
|
||||
|
||||
try
|
||||
{
|
||||
if (!global_options.formula_input_filename.empty())
|
||||
openFile(global_options.formula_input_filename.c_str(),
|
||||
round_info.formula_input_file,
|
||||
ios::in,
|
||||
0);
|
||||
{
|
||||
if (global_options.formula_input_filename == "-")
|
||||
round_info.formula_input_stream = &cin;
|
||||
else
|
||||
{
|
||||
openFile(global_options.formula_input_filename.c_str(),
|
||||
round_info.formula_input_file,
|
||||
ios::in,
|
||||
0);
|
||||
round_info.formula_input_stream = &round_info.formula_input_file;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (const FileOpenException& e)
|
||||
{
|
||||
|
|
@ -224,19 +331,6 @@ int testLoop()
|
|||
formula_random_state[i] = static_cast<short int>(LRAND(0, LONG_MAX));
|
||||
#endif /* HAVE_RAND48 */
|
||||
|
||||
/*
|
||||
* If using paths as state spaces, include the internal model checking
|
||||
* algorithm in the set of algorithms.
|
||||
*/
|
||||
|
||||
if (global_options.statespace_generation_mode & Configuration::PATH)
|
||||
{
|
||||
Configuration::AlgorithmInformation lbtt_info
|
||||
= {new string("lbtt"), new string(), new string(), true};
|
||||
|
||||
configuration.algorithms.push_back(lbtt_info);
|
||||
}
|
||||
|
||||
/*
|
||||
* Intialize the vector for storing the test results for each
|
||||
* implementation and the vector for collecting overall test statistics for
|
||||
|
|
@ -265,30 +359,18 @@ int testLoop()
|
|||
|
||||
for (round_info.current_round = 1;
|
||||
!round_info.abort
|
||||
&& round_info.current_round <= global_options.number_of_rounds;
|
||||
&& round_info.current_round <= global_options.number_of_rounds;
|
||||
++round_info.current_round)
|
||||
{
|
||||
user_break = false;
|
||||
round_info.error = false;
|
||||
round_info.skip
|
||||
= (round_info.current_round < round_info.next_round_to_run);
|
||||
|
||||
|
||||
if (!round_info.skip)
|
||||
{
|
||||
if (!printText(string("Round ") + toString(round_info.current_round)
|
||||
+ " of " + toString(global_options.number_of_rounds)
|
||||
+ "\n\n",
|
||||
2))
|
||||
{
|
||||
if (global_options.verbosity == 1)
|
||||
{
|
||||
if (round_info.current_round > 1)
|
||||
round_info.cout << ' ';
|
||||
round_info.cout << round_info.current_round;
|
||||
round_info.cout.flush();
|
||||
}
|
||||
}
|
||||
}
|
||||
printText(string("Round ") + toString(round_info.current_round)
|
||||
+ " of " + toString(global_options.number_of_rounds) + "\n\n",
|
||||
2);
|
||||
|
||||
try
|
||||
{
|
||||
|
|
@ -299,7 +381,7 @@ int testLoop()
|
|||
round_info.fresh_statespace
|
||||
= ((global_options.do_comp_test || global_options.do_cons_test)
|
||||
&& round_info.next_round_to_change_statespace
|
||||
== round_info.current_round);
|
||||
== round_info.current_round);
|
||||
|
||||
if (round_info.fresh_statespace)
|
||||
{
|
||||
|
|
@ -307,13 +389,13 @@ int testLoop()
|
|||
seed48(statespace_random_state);
|
||||
for (int i = 0; i < 3; i++)
|
||||
statespace_random_state[i] = static_cast<short int>
|
||||
(LRAND(0, LONG_MAX));
|
||||
(LRAND(0, LONG_MAX));
|
||||
#else
|
||||
SRAND(global_options.statespace_random_seed);
|
||||
configuration.global_options.statespace_random_seed
|
||||
= LRAND(0, RAND_MAX);
|
||||
#endif /* HAVE_RAND48 */
|
||||
|
||||
|
||||
if (global_options.statespace_change_interval == 0)
|
||||
round_info.next_round_to_change_statespace
|
||||
= global_options.number_of_rounds + 1;
|
||||
|
|
@ -321,8 +403,7 @@ int testLoop()
|
|||
round_info.next_round_to_change_statespace
|
||||
+= global_options.statespace_change_interval;
|
||||
|
||||
for (vector<AlgorithmTestResults, ALLOC(AlgorithmTestResults) >
|
||||
::iterator it = test_results.begin();
|
||||
for (vector<AlgorithmTestResults>::iterator it = test_results.begin();
|
||||
it != test_results.end();
|
||||
++it)
|
||||
it->emptinessReset();
|
||||
|
|
@ -352,7 +433,7 @@ int testLoop()
|
|||
*/
|
||||
|
||||
round_info.fresh_formula
|
||||
= (round_info.next_round_to_change_formula
|
||||
= (round_info.next_round_to_change_formula
|
||||
== round_info.current_round);
|
||||
|
||||
if (round_info.fresh_formula)
|
||||
|
|
@ -375,8 +456,7 @@ int testLoop()
|
|||
|
||||
round_info.formula_in_file[0] = round_info.formula_in_file[1] = false;
|
||||
|
||||
for (vector<AlgorithmTestResults, ALLOC(AlgorithmTestResults) >
|
||||
::iterator it = test_results.begin();
|
||||
for (vector<AlgorithmTestResults>::iterator it = test_results.begin();
|
||||
it != test_results.end();
|
||||
++it)
|
||||
it->fullReset();
|
||||
|
|
@ -387,8 +467,8 @@ int testLoop()
|
|||
{
|
||||
try
|
||||
{
|
||||
generateFormulae(round_info.formula_input_file.is_open()
|
||||
? &round_info.formula_input_file
|
||||
generateFormulae(!global_options.formula_input_filename.empty()
|
||||
? round_info.formula_input_stream
|
||||
: 0);
|
||||
}
|
||||
catch (const FormulaGenerationException&)
|
||||
|
|
@ -402,7 +482,7 @@ int testLoop()
|
|||
|
||||
if (user_break)
|
||||
{
|
||||
printText("[User break]\n\n", 2, 4);
|
||||
printText("[User break]\n\n", 1, 4);
|
||||
throw UserBreakException();
|
||||
}
|
||||
|
||||
|
|
@ -417,12 +497,17 @@ int testLoop()
|
|||
|
||||
if (global_options.statespace_generation_mode & Configuration::PATH
|
||||
&& (global_options.do_cons_test || global_options.do_comp_test)
|
||||
&& (!test_results[round_info.number_of_translators].
|
||||
automaton_stats[0].emptiness_check_performed))
|
||||
&& (!test_results[round_info.number_of_translators - 1].
|
||||
automaton_stats[0].emptiness_check_performed)
|
||||
&& configuration.algorithms[round_info.number_of_translators - 1].
|
||||
enabled)
|
||||
verifyFormulaOnPath();
|
||||
|
||||
if (!round_info.error)
|
||||
{
|
||||
{
|
||||
if (global_options.verbosity == 2)
|
||||
::StatDisplay::printStatTableHeader(round_info.cout, 4);
|
||||
|
||||
unsigned long int num_enabled_implementations = 0;
|
||||
|
||||
for (unsigned long int algorithm_id = 0;
|
||||
|
|
@ -434,81 +519,61 @@ int testLoop()
|
|||
|
||||
num_enabled_implementations++;
|
||||
|
||||
if (configuration.isInternalAlgorithm(algorithm_id))
|
||||
continue;
|
||||
|
||||
printText(configuration.algorithmString(algorithm_id) + '\n',
|
||||
2, 4);
|
||||
3, 4);
|
||||
|
||||
for (int counter = 0; counter < 2; counter++)
|
||||
{
|
||||
if (user_break)
|
||||
{
|
||||
printText("[User break]\n\n", 2, 4);
|
||||
printText("[User break]\n\n", 1, 4);
|
||||
throw UserBreakException();
|
||||
}
|
||||
|
||||
printText(string(counter == 1 ? "Negated" : "Positive")
|
||||
+ " formula:\n",
|
||||
2,
|
||||
6);
|
||||
if (global_options.verbosity == 1
|
||||
|| global_options.verbosity == 2)
|
||||
{
|
||||
if (counter == 1)
|
||||
round_info.cout << '\n';
|
||||
if (global_options.verbosity == 1)
|
||||
round_info.cout << round_info.current_round << ' ';
|
||||
else
|
||||
round_info.cout << string(4, ' ');
|
||||
changeStreamFormatting(cout, 2, 0, ios::right);
|
||||
round_info.cout << algorithm_id << ' ';
|
||||
restoreStreamFormatting(cout);
|
||||
round_info.cout << (counter == 0 ? '+' : '-') << ' ';
|
||||
round_info.cout.flush();
|
||||
}
|
||||
else
|
||||
printText(string(counter == 1 ? "Negated" : "Positive")
|
||||
+ " formula:\n",
|
||||
3,
|
||||
6);
|
||||
|
||||
try
|
||||
{
|
||||
try
|
||||
{
|
||||
round_info.product_automaton = 0;
|
||||
/*
|
||||
* Generate a Büchi automaton using the current algorithm.
|
||||
* `counter' determines the formula which is to be
|
||||
* translated into an automaton; 0 denotes the positive and
|
||||
* 1 the negated formula.
|
||||
*/
|
||||
|
||||
generateBuchiAutomaton(counter, algorithm_id);
|
||||
|
||||
if (global_options.do_cons_test || global_options.do_comp_test)
|
||||
{
|
||||
/*
|
||||
* Generate a Büchi automaton using the current algorithm.
|
||||
* `counter' determines the formula which is to be
|
||||
* translated into an automaton; 0 denotes the positive and
|
||||
* 1 the negated formula.
|
||||
* Find the system states from which an accepting
|
||||
* execution cycle can be reached by checking the product
|
||||
* automaton for emptiness.
|
||||
*/
|
||||
|
||||
generateBuchiAutomaton(counter, algorithm_id);
|
||||
|
||||
if (global_options.do_cons_test
|
||||
|| global_options.do_comp_test)
|
||||
{
|
||||
/*
|
||||
* Compute the product of the Büchi automaton with the
|
||||
* state space.
|
||||
*/
|
||||
|
||||
generateProductAutomaton(counter, algorithm_id);
|
||||
|
||||
/*
|
||||
* Find the system states from which an accepting
|
||||
* execution cycle can be reached by checking the product
|
||||
* automaton for emptiness.
|
||||
*/
|
||||
|
||||
performEmptinessCheck(counter, algorithm_id);
|
||||
|
||||
/*
|
||||
* If a product automaton was computed in this test round
|
||||
* (it might have not if the emptiness checking result was
|
||||
* already available), release the memory allocated for
|
||||
* the product automaton.
|
||||
*/
|
||||
|
||||
if (round_info.product_automaton != 0)
|
||||
{
|
||||
printText("<deallocating memory>", 4, 8);
|
||||
|
||||
delete round_info.product_automaton;
|
||||
round_info.product_automaton = 0;
|
||||
|
||||
printText(" ok\n", 4);
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (...)
|
||||
{
|
||||
if (round_info.product_automaton != 0)
|
||||
{
|
||||
delete round_info.product_automaton;
|
||||
round_info.product_automaton = 0;
|
||||
}
|
||||
throw;
|
||||
performEmptinessCheck(counter, algorithm_id);
|
||||
}
|
||||
}
|
||||
catch (const BuchiAutomatonGenerationException&)
|
||||
|
|
@ -544,7 +609,13 @@ int testLoop()
|
|||
emptiness_check_performed)
|
||||
performConsistencyCheck(algorithm_id);
|
||||
|
||||
printText("\n", 2);
|
||||
printText("\n", 1);
|
||||
}
|
||||
|
||||
if (global_options.verbosity == 2)
|
||||
{
|
||||
round_info.cout << '\n';
|
||||
round_info.cout.flush();
|
||||
}
|
||||
|
||||
if (num_enabled_implementations > 0)
|
||||
|
|
@ -556,10 +627,7 @@ int testLoop()
|
|||
* results obtained using the different algorithms.
|
||||
*/
|
||||
|
||||
if (num_enabled_implementations >= 2
|
||||
|| (num_enabled_implementations == 1
|
||||
&& global_options.statespace_generation_mode
|
||||
& Configuration::PATH))
|
||||
if (num_enabled_implementations >= 2)
|
||||
compareResults();
|
||||
}
|
||||
|
||||
|
|
@ -590,33 +658,22 @@ int testLoop()
|
|||
round_info.next_round_to_stop = round_info.current_round;
|
||||
}
|
||||
|
||||
if (round_info.error)
|
||||
exit_status = 1;
|
||||
|
||||
/*
|
||||
* Determine from the program configuration and the error status whether
|
||||
* the testing should be paused to wait for user commands.
|
||||
*/
|
||||
|
||||
if (round_info.error)
|
||||
round_info.all_tests_successful = false;
|
||||
|
||||
if (round_info.error
|
||||
&& global_options.interactive == Configuration::ONERROR)
|
||||
round_info.next_round_to_stop = round_info.current_round;
|
||||
|
||||
if (round_info.next_round_to_stop == round_info.current_round)
|
||||
{
|
||||
if (global_options.verbosity == 1)
|
||||
{
|
||||
round_info.cout << '\n';
|
||||
round_info.cout.flush();
|
||||
}
|
||||
|
||||
::UserCommandInterface::executeUserCommands();
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < 2; i++)
|
||||
removeFile(round_info.formula_file_name[i], 2);
|
||||
|
||||
if (round_info.path_iterator != 0)
|
||||
delete round_info.path_iterator;
|
||||
else if (round_info.statespace != 0)
|
||||
|
|
@ -628,8 +685,7 @@ int testLoop()
|
|||
::Ltl::LtlFormula::destruct(round_info.formulae[f]);
|
||||
}
|
||||
|
||||
for (vector<AlgorithmTestResults, ALLOC(AlgorithmTestResults) >
|
||||
::iterator it = test_results.begin();
|
||||
for (vector<AlgorithmTestResults>::iterator it = test_results.begin();
|
||||
it != test_results.end();
|
||||
++it)
|
||||
it->fullReset();
|
||||
|
|
@ -661,19 +717,19 @@ int testLoop()
|
|||
time(¤t_time);
|
||||
|
||||
round_info.transcript_file << "lbtt error log closed on "
|
||||
+ string(ctime(¤t_time))
|
||||
+ string(ctime(¤t_time))
|
||||
<< endl;
|
||||
|
||||
round_info.transcript_file.close();
|
||||
}
|
||||
|
||||
if (global_options.verbosity >= 1)
|
||||
if (global_options.verbosity >= 2)
|
||||
printCollectiveStats(cout, 0);
|
||||
|
||||
if (round_info.formula_input_file.is_open())
|
||||
round_info.formula_input_file.close();
|
||||
|
||||
return exit_status;
|
||||
return round_info.all_tests_successful;
|
||||
}
|
||||
|
||||
|
||||
|
|
@ -686,7 +742,7 @@ int testLoop()
|
|||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
try
|
||||
try
|
||||
{
|
||||
configuration.read(argc, argv);
|
||||
}
|
||||
|
|
@ -697,15 +753,35 @@ int main(int argc, char* argv[])
|
|||
cerr << ":" << configuration.global_options.cfg_filename << ":"
|
||||
<< e.line_info;
|
||||
cerr << ": " << e.what() << endl;
|
||||
exit(-1);
|
||||
exit(2);
|
||||
}
|
||||
|
||||
#ifdef HAVE_ISATTY
|
||||
if (configuration.global_options.formula_input_filename == "-"
|
||||
&& !isatty(STDIN_FILENO))
|
||||
{
|
||||
configuration.global_options.interactive = Configuration::NEVER;
|
||||
configuration.global_options.handle_breaks = false;
|
||||
}
|
||||
#endif /* HAVE_ISATTY */
|
||||
|
||||
if (configuration.global_options.verbosity >= 3)
|
||||
configuration.print(cout);
|
||||
|
||||
user_break = false;
|
||||
if (configuration.global_options.interactive != Configuration::NEVER)
|
||||
signal(SIGINT, breakHandler);
|
||||
|
||||
installSignalHandler(SIGHUP, abortHandler);
|
||||
installSignalHandler(SIGINT,
|
||||
configuration.global_options.handle_breaks
|
||||
? breakHandler
|
||||
: abortHandler);
|
||||
installSignalHandler(SIGQUIT, abortHandler);
|
||||
installSignalHandler(SIGABRT, abortHandler);
|
||||
installSignalHandler(SIGPIPE, abortHandler);
|
||||
installSignalHandler(SIGALRM, abortHandler);
|
||||
installSignalHandler(SIGTERM, abortHandler);
|
||||
installSignalHandler(SIGUSR1, abortHandler);
|
||||
installSignalHandler(SIGUSR2, abortHandler);
|
||||
|
||||
#ifdef HAVE_OBSTACK_H
|
||||
obstack_alloc_failed_handler = &ObstackAllocator::failure;
|
||||
|
|
@ -715,18 +791,28 @@ int main(int argc, char* argv[])
|
|||
using_history();
|
||||
#endif /* HAVE_READLINE */
|
||||
|
||||
try
|
||||
try
|
||||
{
|
||||
return testLoop();
|
||||
allocateTempFilenames();
|
||||
if (!testLoop())
|
||||
{
|
||||
deallocateTempFilenames();
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
catch (const Exception& e)
|
||||
{
|
||||
cerr << argv[0] << ": " << e.what() << endl;
|
||||
exit(-1);
|
||||
deallocateTempFilenames();
|
||||
cerr << endl << argv[0] << ": " << e.what() << endl;
|
||||
exit(3);
|
||||
}
|
||||
catch (const bad_alloc&)
|
||||
{
|
||||
cerr << argv[0] << ": out of memory" << endl;
|
||||
exit(-1);
|
||||
deallocateTempFilenames();
|
||||
cerr << endl << argv[0] << ": out of memory" << endl;
|
||||
exit(3);
|
||||
}
|
||||
|
||||
deallocateTempFilenames();
|
||||
return 0;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue