bc: make bc_vm_envArgs() NULL-terminate its argv, simplify bc_vm_envLen()

function                                             old     new   delta
bc_num_ulong                                          92     103     +11
static.nullptr                                         -       4      +4
bc_args                                              120     123      +3
static.bc_args_env_name                                4       -      -4
dc_main                                               49      41      -8
bc_main                                               49      41      -8
bc_vm_run                                           1917    1883     -34
------------------------------------------------------------------------------
(add/remove: 1/1 grow/shrink: 2/3 up/down: 18/-54)            Total: -36 bytes

Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
This commit is contained in:
Denys Vlasenko
2018-12-06 00:46:09 +01:00
parent e873ff9660
commit 1ff1c70944

View File

@ -1284,14 +1284,14 @@ static char* bc_read_file(const char *path)
return buf; return buf;
} }
static void bc_args(int argc, char **argv) static void bc_args(char **argv)
{ {
unsigned opts; unsigned opts;
int i; int i;
GETOPT_RESET(); GETOPT_RESET();
#if ENABLE_FEATURE_BC_LONG_OPTIONS #if ENABLE_FEATURE_BC_LONG_OPTIONS
opts = getopt32long(argv, "xwvsqli", opts = option_mask32 |= getopt32long(argv, "xwvsqli",
"extended-register\0" No_argument "x" "extended-register\0" No_argument "x"
"warn\0" No_argument "w" "warn\0" No_argument "w"
"version\0" No_argument "v" "version\0" No_argument "v"
@ -1301,16 +1301,15 @@ static void bc_args(int argc, char **argv)
"interactive\0" No_argument "i" "interactive\0" No_argument "i"
); );
#else #else
opts = getopt32(argv, "xwvsqli"); opts = option_mask32 |= getopt32(argv, "xwvsqli");
#endif #endif
if (getenv("POSIXLY_CORRECT")) if (getenv("POSIXLY_CORRECT"))
option_mask32 |= BC_FLAG_S; option_mask32 |= BC_FLAG_S;
///should be in bc_vm_run() instead??
if (opts & BC_FLAG_V) bc_vm_info(); if (opts & BC_FLAG_V) bc_vm_info();
// should not be necessary, getopt32() handles this??
//if (argv[optind] && !strcmp(argv[optind], "--")) ++optind;
for (i = optind; i < argc; ++i) for (i = optind; argv[i]; ++i)
bc_vec_push(&G.files, argv + i); bc_vec_push(&G.files, argv + i);
} }
@ -6870,10 +6869,11 @@ static BcStatus bc_program_exec(void)
#if ENABLE_BC #if ENABLE_BC
static void bc_vm_envArgs(void) static void bc_vm_envArgs(void)
{ {
static const char* const bc_args_env_name = "BC_ENV_ARGS"; static char *const nullptr = NULL;
BcVec v; BcVec v;
char *env_args = getenv(bc_args_env_name), *buf; char *env_args = getenv("BC_ENV_ARGS");
char *buf;
if (!env_args) return; if (!env_args) return;
@ -6881,40 +6881,34 @@ static void bc_vm_envArgs(void)
buf = G.env_args; buf = G.env_args;
bc_vec_init(&v, sizeof(char *), NULL); bc_vec_init(&v, sizeof(char *), NULL);
bc_vec_push(&v, &bc_args_env_name); bc_vec_push(&v, &nullptr);
while (*buf != 0) { while (*(buf = skip_whitespace(buf)) != '\0') {
if (!isspace(*buf)) { bc_vec_push(&v, &buf);
bc_vec_push(&v, &buf); buf = skip_non_whitespace(buf);
while (*buf != 0 && !isspace(*buf)) ++buf; if (!*buf)
if (*buf != 0) (*(buf++)) = '\0'; break;
} *buf++ = '\0';
else
++buf;
} }
bc_args((int) v.len, (char **) v.v); bc_vec_push(&v, &nullptr);
bc_args((char **) v.v);
bc_vec_free(&v); bc_vec_free(&v);
} }
#endif // ENABLE_BC #endif // ENABLE_BC
static size_t bc_vm_envLen(const char *var) static unsigned bc_vm_envLen(const char *var)
{ {
char *lenv = getenv(var); char *lenv;
size_t i, len = BC_NUM_PRINT_WIDTH; unsigned len;
int num;
lenv = getenv(var);
len = BC_NUM_PRINT_WIDTH;
if (!lenv) return len; if (!lenv) return len;
len = strlen(lenv); len = bb_strtou(lenv, NULL, 10) - 1;
if (errno || len < 2 || len >= INT_MAX)
for (num = 1, i = 0; num && i < len; ++i) num = isdigit(lenv[i]);
if (num) {
len = (size_t) atoi(lenv) - 1;
if (len < 2 || len >= INT32_MAX) len = BC_NUM_PRINT_WIDTH;
}
else
len = BC_NUM_PRINT_WIDTH; len = BC_NUM_PRINT_WIDTH;
return len; return len;
@ -7314,7 +7308,7 @@ static void bc_vm_free(void)
} }
#endif #endif
static void bc_program_init(size_t line_len) static void bc_program_init(void)
{ {
size_t idx; size_t idx;
BcInstPtr ip; BcInstPtr ip;
@ -7323,7 +7317,6 @@ static void bc_program_init(size_t line_len)
memset(&ip, 0, sizeof(BcInstPtr)); memset(&ip, 0, sizeof(BcInstPtr));
/* G.prog.nchars = G.prog.scale = 0; - already is */ /* G.prog.nchars = G.prog.scale = 0; - already is */
G.prog.len = line_len;
bc_num_init(&G.prog.ib, BC_NUM_DEF_SIZE); bc_num_init(&G.prog.ib, BC_NUM_DEF_SIZE);
bc_num_ten(&G.prog.ib); bc_num_ten(&G.prog.ib);
@ -7370,17 +7363,12 @@ static void bc_program_init(size_t line_len)
bc_vec_push(&G.prog.stack, &ip); bc_vec_push(&G.prog.stack, &ip);
} }
static void bc_vm_init(const char *env_len) static void bc_vm_init(void)
{ {
size_t len = bc_vm_envLen(env_len);
bc_vec_init(&G.files, sizeof(char *), NULL); bc_vec_init(&G.files, sizeof(char *), NULL);
if (IS_BC)
if (IS_BC) {
bc_vm_envArgs(); bc_vm_envArgs();
} bc_program_init();
bc_program_init(len);
if (IS_BC) { if (IS_BC) {
bc_parse_init(&G.prs, BC_PROG_MAIN); bc_parse_init(&G.prs, BC_PROG_MAIN);
} else { } else {
@ -7388,16 +7376,16 @@ static void bc_vm_init(const char *env_len)
} }
} }
static BcStatus bc_vm_run(int argc, char *argv[], static BcStatus bc_vm_run(char **argv, const char *env_len)
const char *env_len)
{ {
BcStatus st; BcStatus st;
bc_vm_init(env_len); G.prog.len = bc_vm_envLen(env_len);
bc_args(argc, argv);
bc_vm_init();
bc_args(argv);
G.ttyin = isatty(0); G.ttyin = isatty(0);
if (G.ttyin) { if (G.ttyin) {
#if ENABLE_FEATURE_BC_SIGNALS #if ENABLE_FEATURE_BC_SIGNALS
// With SA_RESTART, most system calls will restart // With SA_RESTART, most system calls will restart
@ -7421,6 +7409,7 @@ static BcStatus bc_vm_run(int argc, char *argv[],
if (!(option_mask32 & BC_FLAG_Q)) if (!(option_mask32 & BC_FLAG_Q))
bc_vm_info(); bc_vm_info();
} }
st = bc_vm_exec(); st = bc_vm_exec();
#if ENABLE_FEATURE_CLEAN_UP #if ENABLE_FEATURE_CLEAN_UP
@ -7432,23 +7421,23 @@ static BcStatus bc_vm_run(int argc, char *argv[],
#if ENABLE_BC #if ENABLE_BC
int bc_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int bc_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int bc_main(int argc, char **argv) int bc_main(int argc UNUSED_PARAM, char **argv)
{ {
INIT_G(); INIT_G();
G.sbgn = G.send = '"'; G.sbgn = G.send = '"';
return bc_vm_run(argc, argv, "BC_LINE_LENGTH"); return bc_vm_run(argv, "BC_LINE_LENGTH");
} }
#endif #endif
#if ENABLE_DC #if ENABLE_DC
int dc_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; int dc_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int dc_main(int argc, char **argv) int dc_main(int argc UNUSED_PARAM, char **argv)
{ {
INIT_G(); INIT_G();
G.sbgn = '['; G.sbgn = '[';
G.send = ']'; G.send = ']';
return bc_vm_run(argc, argv, "DC_LINE_LENGTH"); return bc_vm_run(argv, "DC_LINE_LENGTH");
} }
#endif #endif