On some architectures (e.g., ARM, or even some -flto setups on Intel) C++ exceptions to not traverse the C functions. So even if the C++ main() has a try/catch, it will not catch the exception thrown by C++ code called from the argp module (which is compiled in C). * bin/common_setup.cc, bin/common_setup.hh: Define some macros and function to factorize exception handling. * bin/autcross.cc, bin/autfilt.cc, bin/common_aoutput.cc, bin/common_color.cc, bin/common_finput.cc, bin/common_hoaread.cc, bin/common_output.cc, bin/common_post.cc, bin/common_trans.cc, bin/dstar2tgba.cc, bin/genaut.cc, bin/genltl.cc, bin/ltl2tgba.cc, bin/ltl2tgta.cc, bin/ltlcross.cc, bin/ltldo.cc, bin/ltlfilt.cc, bin/ltlgrind.cc, bin/ltlsynt.cc, bin/randaut.cc, bin/randltl.cc: Protect all parse_opt() functions, even those where there is currently no exception risk.
102 lines
2.7 KiB
C++
102 lines
2.7 KiB
C++
// -*- coding: utf-8 -*-
|
|
// Copyright (C) 2017, 2019 Laboratoire de Recherche et Développement
|
|
// de l'Epita (LRDE).
|
|
//
|
|
// This file is part of Spot, a model checking library.
|
|
//
|
|
// Spot is free software; you can redistribute it and/or modify it
|
|
// under the terms of the GNU General Public License as published by
|
|
// the Free Software Foundation; either version 3 of the License, or
|
|
// (at your option) any later version.
|
|
//
|
|
// Spot is distributed in the hope that it will be useful, but WITHOUT
|
|
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
// or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
|
// License for more details.
|
|
//
|
|
// You should have received a copy of the GNU General Public License
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
#include "common_sys.hh"
|
|
#include "common_color.hh"
|
|
#include "common_setup.hh"
|
|
|
|
#include <argp.h>
|
|
#include <unistd.h>
|
|
|
|
#include "argmatch.h"
|
|
|
|
static char const *const color_args[] =
|
|
{
|
|
"always", "yes", "force",
|
|
"never", "no", "none",
|
|
"auto", "tty", "if-tty", nullptr
|
|
};
|
|
static color_type const color_types[] =
|
|
{
|
|
color_always, color_always, color_always,
|
|
color_never, color_never, color_never,
|
|
color_if_tty, color_if_tty, color_if_tty
|
|
};
|
|
ARGMATCH_VERIFY(color_args, color_types);
|
|
|
|
color_type color_opt = color_if_tty;
|
|
const char* bright_red = "\033[1;31m";
|
|
const char* bold = "\033[1m";
|
|
const char* bold_std = "\033[0;1m";
|
|
const char* reset_color = "\033[m";
|
|
|
|
|
|
void setup_color()
|
|
{
|
|
if (color_opt == color_if_tty)
|
|
color_opt = isatty(STDERR_FILENO) ? color_always : color_never;
|
|
|
|
if (color_opt == color_never)
|
|
{
|
|
bright_red = "";
|
|
bold = "";
|
|
bold_std = "";
|
|
reset_color = "";
|
|
}
|
|
}
|
|
|
|
enum {
|
|
OPT_COLOR = 256,
|
|
};
|
|
|
|
static const argp_option options_color[] =
|
|
{
|
|
{ "color", OPT_COLOR, "WHEN", OPTION_ARG_OPTIONAL,
|
|
"colorize output; WHEN can be 'never', 'always' (the default if "
|
|
"--color is used without argument), or "
|
|
"'auto' (the default if --color is not used)", -15 },
|
|
{ nullptr, 0, nullptr, 0, nullptr, 0 }
|
|
};
|
|
|
|
|
|
static int
|
|
parse_opt_color(int key, char* arg, struct argp_state*)
|
|
{
|
|
// Called from C code, so should not raise any exception.
|
|
BEGIN_EXCEPTION_PROTECT;
|
|
// This switch is alphabetically-ordered.
|
|
switch (key)
|
|
{
|
|
case OPT_COLOR:
|
|
{
|
|
if (arg)
|
|
color_opt = XARGMATCH("--color", arg, color_args, color_types);
|
|
else
|
|
color_opt = color_always;
|
|
break;
|
|
}
|
|
default:
|
|
return ARGP_ERR_UNKNOWN;
|
|
}
|
|
END_EXCEPTION_PROTECT;
|
|
return 0;
|
|
}
|
|
|
|
const struct argp color_argp = { options_color, parse_opt_color,
|
|
nullptr, nullptr, nullptr, nullptr, nullptr };
|