summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorStefan Eßer <se@FreeBSD.org>2020-08-03 18:55:39 +0000
committerStefan Eßer <se@FreeBSD.org>2020-08-03 18:55:39 +0000
commita68dea2ff90f2e77fe8c6a9e022aa1ac258106b7 (patch)
tree14083ae0377e0e7df842ba66878bd3f26c9491c7 /src
parentee177a09be9c81bf1c3e00326e1d38e6edb8e2a4 (diff)
Notes
Diffstat (limited to 'src')
-rw-r--r--src/args.c14
-rw-r--r--src/bc/bc.c2
-rw-r--r--src/bc/parse.c18
-rw-r--r--src/dc/dc.c2
-rw-r--r--src/vm.c74
5 files changed, 53 insertions, 57 deletions
diff --git a/src/args.c b/src/args.c
index 1626ad4944e4e..0292376277866 100644
--- a/src/args.c
+++ b/src/args.c
@@ -108,13 +108,20 @@ void bc_args(int argc, char *argv[]) {
case 'e':
{
+ if (vm.no_exit_exprs)
+ bc_vm_verr(BC_ERROR_FATAL_OPTION, "-e (--expression)");
bc_args_exprs(opts.optarg);
break;
}
case 'f':
{
- bc_args_file(opts.optarg);
+ if (!strcmp(opts.optarg, "-")) vm.no_exit_exprs = true;
+ else {
+ if (vm.no_exit_exprs)
+ bc_vm_verr(BC_ERROR_FATAL_OPTION, "-f (--file)");
+ bc_args_file(opts.optarg);
+ }
break;
}
@@ -155,7 +162,7 @@ void bc_args(int argc, char *argv[]) {
case 'q':
{
assert(BC_IS_BC);
- vm.flags |= BC_FLAG_Q;
+ // Do nothing.
break;
}
@@ -205,9 +212,8 @@ void bc_args(int argc, char *argv[]) {
if (version) bc_vm_info(NULL);
if (do_exit) exit((int) vm.status);
- if (vm.exprs.len > 1 || BC_IS_DC) vm.flags |= BC_FLAG_Q;
- if (opts.optind < (size_t) argc)
+ if (opts.optind < (size_t) argc && vm.files.v == NULL)
bc_vec_init(&vm.files, sizeof(char*), NULL);
for (i = opts.optind; i < (size_t) argc; ++i)
diff --git a/src/bc/bc.c b/src/bc/bc.c
index ef0fc3d6865dc..3d488b5640c8f 100644
--- a/src/bc/bc.c
+++ b/src/bc/bc.c
@@ -52,6 +52,6 @@ void bc_main(int argc, char **argv) {
vm.parse = bc_parse_parse;
vm.expr = bc_parse_expr;
- bc_vm_boot(argc, argv, "BC_LINE_LENGTH", "BC_ENV_ARGS", "BC_EXPR_EXIT");
+ bc_vm_boot(argc, argv, "BC_LINE_LENGTH", "BC_ENV_ARGS");
}
#endif // BC_ENABLED
diff --git a/src/bc/parse.c b/src/bc/parse.c
index 2aa9d97468ffb..329c1a84b4199 100644
--- a/src/bc/parse.c
+++ b/src/bc/parse.c
@@ -179,10 +179,10 @@ static void bc_parse_params(BcParse *p, uint8_t flags) {
bc_lex_next(&p->l);
- for (nparams = 0; p->l.t != BC_LEX_RPAREN; ++nparams) {
+ flags &= ~(BC_PARSE_PRINT | BC_PARSE_REL);
+ flags |= (BC_PARSE_ARRAY | BC_PARSE_NEEDVAL);
- flags &= ~(BC_PARSE_PRINT | BC_PARSE_REL);
- flags |= (BC_PARSE_ARRAY | BC_PARSE_NEEDVAL);
+ for (nparams = 0; p->l.t != BC_LEX_RPAREN; ++nparams) {
bc_parse_expr_status(p, flags, bc_parse_next_param);
@@ -516,6 +516,12 @@ static void bc_parse_return(BcParse *p) {
}
}
+static void bc_parse_noElse(BcParse *p) {
+ uint16_t *flag_ptr = BC_PARSE_TOP_FLAG_PTR(p);
+ *flag_ptr = (*flag_ptr & ~(BC_PARSE_FLAG_IF_END));
+ bc_parse_setLabel(p);
+}
+
static void bc_parse_endBody(BcParse *p, bool brace) {
bool has_brace, new_else = false;
@@ -610,12 +616,6 @@ static void bc_parse_startBody(BcParse *p, uint16_t flags) {
bc_vec_push(&p->flags, &flags);
}
-void bc_parse_noElse(BcParse *p) {
- uint16_t *flag_ptr = BC_PARSE_TOP_FLAG_PTR(p);
- *flag_ptr = (*flag_ptr & ~(BC_PARSE_FLAG_IF_END));
- bc_parse_setLabel(p);
-}
-
static void bc_parse_if(BcParse *p) {
size_t idx;
diff --git a/src/dc/dc.c b/src/dc/dc.c
index 21d7bfbd4385a..8c03ccf0e414e 100644
--- a/src/dc/dc.c
+++ b/src/dc/dc.c
@@ -52,6 +52,6 @@ void dc_main(int argc, char **argv) {
vm.parse = dc_parse_parse;
vm.expr = dc_parse_expr;
- bc_vm_boot(argc, argv, "DC_LINE_LENGTH", "DC_ENV_ARGS", "DC_EXPR_EXIT");
+ bc_vm_boot(argc, argv, "DC_LINE_LENGTH", "DC_ENV_ARGS");
}
#endif // DC_ENABLED
diff --git a/src/vm.c b/src/vm.c
index 905613563e8dc..9818ce4f35f46 100644
--- a/src/vm.c
+++ b/src/vm.c
@@ -452,7 +452,7 @@ static void bc_vm_clean(void) {
}
}
-static void bc_vm_process(const char *text, bool is_stdin) {
+static void bc_vm_process(const char *text) {
bc_parse_text(&vm.prs, text);
@@ -464,21 +464,6 @@ static void bc_vm_process(const char *text, bool is_stdin) {
while (BC_PARSE_CAN_PARSE(vm.prs)) vm.parse(&vm.prs);
-#if BC_ENABLED
- if (BC_IS_BC) {
-
- uint16_t *flags = BC_PARSE_TOP_FLAG_PTR(&vm.prs);
-
- if (!is_stdin && vm.prs.flags.len == 1 &&
- *flags == BC_PARSE_FLAG_IF_END)
- {
- bc_parse_noElse(&vm.prs);
- }
-
- if (BC_PARSE_NO_EXEC(&vm.prs)) return;
- }
-#endif // BC_ENABLED
-
bc_program_exec(&vm.prog);
assert(BC_IS_DC || vm.prog.results.len == 0);
@@ -488,6 +473,28 @@ static void bc_vm_process(const char *text, bool is_stdin) {
} while (vm.prs.l.t != BC_LEX_EOF);
}
+#if BC_ENABLED
+static void bc_vm_endif(void) {
+
+ size_t i;
+ bool good;
+
+ if (BC_NO_ERR(!BC_PARSE_NO_EXEC(&vm.prs))) return;
+
+ good = true;
+
+ for (i = 0; good && i < vm.prs.flags.len; ++i) {
+ uint16_t flag = *((uint16_t*) bc_vec_item(&vm.prs.flags, i));
+ good = ((flag & BC_PARSE_FLAG_BRACE) != BC_PARSE_FLAG_BRACE);
+ }
+
+ if (good) {
+ while (BC_PARSE_IF_END(&vm.prs)) bc_vm_process("else {}");
+ }
+ else bc_parse_err(&vm.prs, BC_ERROR_PARSE_BLOCK);
+}
+#endif // BC_ENABLED
+
static void bc_vm_file(const char *file) {
char *data = NULL;
@@ -504,11 +511,10 @@ static void bc_vm_file(const char *file) {
BC_SIG_UNLOCK;
- bc_vm_process(data, false);
+ bc_vm_process(data);
#if BC_ENABLED
- if (BC_IS_BC && BC_ERR(BC_PARSE_NO_EXEC(&vm.prs)))
- bc_parse_err(&vm.prs, BC_ERROR_PARSE_BLOCK);
+ if (BC_IS_BC) bc_vm_endif();
#endif // BC_ENABLED
err:
@@ -589,7 +595,7 @@ restart:
if (vm.history.stdin_has_data) continue;
#endif // BC_ENABLE_HISTORY
- bc_vm_process(buffer.v, true);
+ bc_vm_process(buffer.v);
bc_vec_empty(&buffer);
if (vm.eof) break;
@@ -602,21 +608,7 @@ restart:
else if (BC_ERR(string))
bc_parse_err(&vm.prs, BC_ERROR_PARSE_STRING);
#if BC_ENABLED
- else if (BC_IS_BC && BC_ERR(BC_PARSE_NO_EXEC(&vm.prs))) {
-
- size_t i;
- bool good = true;
-
- for (i = 0; good && i < vm.prs.flags.len; ++i) {
- uint16_t flag = *((uint16_t*) bc_vec_item(&vm.prs.flags, i));
- good = ((flag & BC_PARSE_FLAG_BRACE) != BC_PARSE_FLAG_BRACE);
- }
-
- if (good) {
- while (BC_PARSE_IF_END(&vm.prs)) bc_vm_process("else {}", true);
- }
- else bc_parse_err(&vm.prs, BC_ERROR_PARSE_BLOCK);
- }
+ else if (BC_IS_BC) bc_vm_endif();
#endif // BC_ENABLED
}
@@ -706,7 +698,7 @@ static void bc_vm_gettext(void) {
#endif // BC_ENABLE_NLS
}
-static void bc_vm_exec(const char* env_exp_exit) {
+static void bc_vm_exec(void) {
size_t i;
bool has_file = false;
@@ -743,7 +735,7 @@ static void bc_vm_exec(const char* env_exp_exit) {
more = bc_read_buf(&buf, vm.exprs.v, &len);
bc_vec_pushByte(&buf, '\0');
- bc_vm_process(buf.v, false);
+ bc_vm_process(buf.v);
bc_vec_npop(&buf, buf.len);
@@ -758,7 +750,7 @@ static void bc_vm_exec(const char* env_exp_exit) {
BC_SIG_UNLOCK;
- if (getenv(env_exp_exit) != NULL) return;
+ if (!vm.no_exit_exprs) return;
}
for (i = 0; i < vm.files.len; ++i) {
@@ -784,7 +776,7 @@ err:
}
void bc_vm_boot(int argc, char *argv[], const char *env_len,
- const char* const env_args, const char* env_exp_exit)
+ const char* const env_args)
{
int ttyin, ttyout, ttyerr;
struct sigaction sa;
@@ -863,9 +855,7 @@ void bc_vm_boot(int argc, char *argv[], const char *env_len,
vm.maxes[BC_PROG_GLOBALS_IBASE] = BC_NUM_MAX_IBASE;
#endif // BC_ENABLED
- if (BC_IS_BC && BC_I && !(vm.flags & BC_FLAG_Q)) bc_vm_info(NULL);
-
BC_SIG_UNLOCK;
- bc_vm_exec(env_exp_exit);
+ bc_vm_exec();
}