bc: if ^C handling is not selected, there is no interactive mode

function                                             old     new   delta
packed_usage                                       33023   33076     +53
bc_num_s                                             252     246      -6
bc_vm_run                                           1859    1850      -9
bc_error_fmt                                          36      20     -16
bc_posix_error_fmt                                    58      41     -17
bc_read_line                                         202     168     -34
------------------------------------------------------------------------------
(add/remove: 0/0 grow/shrink: 1/5 up/down: 53/-82)            Total: -29 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko 2018-12-06 09:20:32 +01:00
parent 54214c38db
commit 1a6a482d19

View File

@ -116,7 +116,7 @@
//See www.gnu.org/software/bc/manual/bc.html //See www.gnu.org/software/bc/manual/bc.html
//usage:#define bc_trivial_usage //usage:#define bc_trivial_usage
//usage: "[-sqli] FILE..." //usage: "[-sqliw] FILE..."
//usage: //usage:
//usage:#define bc_full_usage "\n" //usage:#define bc_full_usage "\n"
//usage: "\nArbitrary precision calculator" //usage: "\nArbitrary precision calculator"
@ -127,6 +127,7 @@
//usage: "\n -q Quiet" //usage: "\n -q Quiet"
//usage: "\n -w Warn if extensions are used" //usage: "\n -w Warn if extensions are used"
///////: "\n -v Version" ///////: "\n -v Version"
//usage: "\n$BC_LINE_LENGTH changes output width"
//usage: //usage:
//usage:#define bc_example_usage //usage:#define bc_example_usage
//usage: "3 + 4.129\n" //usage: "3 + 4.129\n"
@ -734,7 +735,7 @@ static void bc_program_reset(void);
#define BC_MAX_VARS ((unsigned long) SIZE_MAX - 1) #define BC_MAX_VARS ((unsigned long) SIZE_MAX - 1)
struct globals { struct globals {
smallint ttyin; IF_FEATURE_BC_SIGNALS(smallint ttyin;)
smallint eof; smallint eof;
char sbgn; char sbgn;
char send; char send;
@ -761,7 +762,11 @@ struct globals {
#define G_warn (ENABLE_BC && (option_mask32 & BC_FLAG_W)) #define G_warn (ENABLE_BC && (option_mask32 & BC_FLAG_W))
#define G_exreg (ENABLE_DC && (option_mask32 & BC_FLAG_X)) #define G_exreg (ENABLE_DC && (option_mask32 & BC_FLAG_X))
#define G_interrupt (ENABLE_FEATURE_BC_SIGNALS ? bb_got_signal : 0) #define G_interrupt (ENABLE_FEATURE_BC_SIGNALS ? bb_got_signal : 0)
#if ENABLE_FEATURE_BC_SIGNALS
# define G_ttyin G.ttyin
#else
# define G_ttyin 0
#endif
#define IS_BC (ENABLE_BC && (!ENABLE_DC || applet_name[0] == 'b')) #define IS_BC (ENABLE_BC && (!ENABLE_DC || applet_name[0] == 'b'))
#if ENABLE_BC #if ENABLE_BC
@ -904,7 +909,7 @@ static void fflush_and_check(void)
#if ENABLE_FEATURE_CLEAN_UP #if ENABLE_FEATURE_CLEAN_UP
#define quit_or_return_for_exit() \ #define quit_or_return_for_exit() \
do { \ do { \
G.ttyin = 0; /* do not loop in main loop anymore */ \ IF_FEATURE_BC_SIGNALS(G_ttyin = 0;) /* do not loop in main loop anymore */ \
return BC_STATUS_FAILURE; \ return BC_STATUS_FAILURE; \
} while (0) } while (0)
#else #else
@ -942,7 +947,7 @@ static NOINLINE int bc_error_fmt(const char *fmt, ...)
bc_verror_msg(fmt, p); bc_verror_msg(fmt, p);
va_end(p); va_end(p);
if (!ENABLE_FEATURE_CLEAN_UP && !G.ttyin) if (!ENABLE_FEATURE_CLEAN_UP && !G_ttyin)
exit(1); exit(1);
return BC_STATUS_FAILURE; return BC_STATUS_FAILURE;
} }
@ -962,7 +967,7 @@ static NOINLINE int bc_posix_error_fmt(const char *fmt, ...)
// Do we treat non-POSIX constructs as errors? // Do we treat non-POSIX constructs as errors?
if (!(option_mask32 & BC_FLAG_S)) if (!(option_mask32 & BC_FLAG_S))
return BC_STATUS_SUCCESS; // no, it's a warning return BC_STATUS_SUCCESS; // no, it's a warning
if (!ENABLE_FEATURE_CLEAN_UP && !G.ttyin) if (!ENABLE_FEATURE_CLEAN_UP && !G_ttyin)
exit(1); exit(1);
return BC_STATUS_FAILURE; return BC_STATUS_FAILURE;
} }
@ -1211,7 +1216,7 @@ static BcStatus bc_read_line(BcVec *vec, const char *prompt)
, stderr); , stderr);
} }
#endif #endif
if (G.ttyin && !G_posix) if (G_ttyin && !G_posix)
fputs(prompt, stderr); fputs(prompt, stderr);
#if ENABLE_FEATURE_BC_SIGNALS #if ENABLE_FEATURE_BC_SIGNALS
@ -7034,7 +7039,7 @@ static BcStatus bc_vm_stdin(void)
bc_vec_concat(&buffer, buf.v); bc_vec_concat(&buffer, buf.v);
s = bc_vm_process(buffer.v); s = bc_vm_process(buffer.v);
if (s) { if (s) {
if (ENABLE_FEATURE_CLEAN_UP && !G.ttyin) { if (ENABLE_FEATURE_CLEAN_UP && !G_ttyin) {
// Debug config, non-interactive mode: // Debug config, non-interactive mode:
// return all the way back to main. // return all the way back to main.
// Non-debug builds do not come here, they exit. // Non-debug builds do not come here, they exit.
@ -7263,7 +7268,7 @@ static BcStatus bc_vm_exec(void)
for (i = 0; !s && i < G.files.len; ++i) for (i = 0; !s && i < G.files.len; ++i)
s = bc_vm_file(*((char **) bc_vec_item(&G.files, i))); s = bc_vm_file(*((char **) bc_vec_item(&G.files, i)));
if (s) { if (s) {
if (ENABLE_FEATURE_CLEAN_UP && !G.ttyin) { if (ENABLE_FEATURE_CLEAN_UP && !G_ttyin) {
// Debug config, non-interactive mode: // Debug config, non-interactive mode:
// return all the way back to main. // return all the way back to main.
// Non-debug builds do not come here, they exit. // Non-debug builds do not come here, they exit.
@ -7391,9 +7396,9 @@ static BcStatus bc_vm_run(char **argv, const char *env_len)
bc_vm_init(); bc_vm_init();
bc_args(argv); bc_args(argv);
G.ttyin = isatty(0); if (isatty(0)) {
if (G.ttyin) {
#if ENABLE_FEATURE_BC_SIGNALS #if ENABLE_FEATURE_BC_SIGNALS
G_ttyin = 1;
// With SA_RESTART, most system calls will restart // With SA_RESTART, most system calls will restart
// (IOW: they won't fail with EINTR). // (IOW: they won't fail with EINTR).
// In particular, this means ^C won't cause // In particular, this means ^C won't cause