- Fix signal handling in bc/dc. Now Ctrl-C terminates the execution.
Requested by: gk (via private mail) Approved by: delphij (mentor)
This commit is contained in:
parent
31dadaf609
commit
85bf7ec797
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=208868
@ -23,7 +23,6 @@ __FBSDID("$FreeBSD$");
|
||||
#include <err.h>
|
||||
#include <errno.h>
|
||||
#include <histedit.h>
|
||||
#include <signal.h>
|
||||
#include <stdbool.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
@ -235,22 +234,6 @@ add_str(const char *str)
|
||||
strlcat(strbuf, str, strbuf_sz);
|
||||
}
|
||||
|
||||
/* ARGSUSED */
|
||||
void
|
||||
abort_line(int sig)
|
||||
{
|
||||
static const char str[] = "[\n]P\n";
|
||||
int save_errno;
|
||||
|
||||
switch (sig) {
|
||||
default:
|
||||
save_errno = errno;
|
||||
YY_FLUSH_BUFFER; /* XXX signal race? */
|
||||
write(STDOUT_FILENO, str, sizeof(str) - 1);
|
||||
errno = save_errno;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
yywrap(void)
|
||||
{
|
||||
@ -288,8 +271,6 @@ yywrap(void)
|
||||
} else if (fileindex == sargc) {
|
||||
fileindex++;
|
||||
yyin = stdin;
|
||||
if (interactive)
|
||||
signal(SIGINT, abort_line);
|
||||
lineno = 1;
|
||||
filename = "stdin";
|
||||
return (0);
|
||||
|
@ -44,7 +44,6 @@ struct bmachine {
|
||||
struct source *readstack;
|
||||
struct stack *reg;
|
||||
struct stack stack;
|
||||
volatile sig_atomic_t interrupted;
|
||||
u_int scale;
|
||||
u_int obase;
|
||||
u_int ibase;
|
||||
@ -55,7 +54,7 @@ struct bmachine {
|
||||
};
|
||||
|
||||
static struct bmachine bmachine;
|
||||
static void sighandler(int);
|
||||
static void got_sigint(int);
|
||||
|
||||
static __inline int readch(void);
|
||||
static __inline void unreadch(void);
|
||||
@ -223,14 +222,11 @@ static const struct jump_entry jump_table_data[] = {
|
||||
(sizeof(jump_table_data)/sizeof(jump_table_data[0]))
|
||||
|
||||
static void
|
||||
sighandler(int ignored)
|
||||
got_sigint(int ignored __unused)
|
||||
{
|
||||
|
||||
switch (ignored)
|
||||
{
|
||||
default:
|
||||
bmachine.interrupted = true;
|
||||
}
|
||||
putchar('\n');
|
||||
exit(0);
|
||||
}
|
||||
|
||||
void
|
||||
@ -265,7 +261,7 @@ init_bmachine(bool extended_registers)
|
||||
bmachine.obase = bmachine.ibase = 10;
|
||||
BN_init(&zero);
|
||||
bn_check(BN_zero(&zero));
|
||||
signal(SIGINT, sighandler);
|
||||
signal(SIGINT, got_sigint);
|
||||
}
|
||||
|
||||
/* Reset the things needed before processing a (new) file */
|
||||
@ -1746,14 +1742,6 @@ eval(void)
|
||||
bmachine.readsp--;
|
||||
continue;
|
||||
}
|
||||
if (bmachine.interrupted) {
|
||||
if (bmachine.readsp > 0) {
|
||||
src_free();
|
||||
bmachine.readsp--;
|
||||
continue;
|
||||
} else
|
||||
bmachine.interrupted = false;
|
||||
}
|
||||
#ifdef DEBUGGING
|
||||
fprintf(stderr, "# %c\n", ch);
|
||||
stack_print(stderr, &bmachine.stack, "* ",
|
||||
|
Loading…
Reference in New Issue
Block a user