From bc9033fdf30424c34008e651fdbbba5da8c8fc40 Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Tue, 13 Jul 2021 02:44:18 +0200 Subject: Third commit MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- apsh.c | 49 +++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 39 insertions(+), 10 deletions(-) (limited to 'apsh.c') diff --git a/apsh.c b/apsh.c index 4e7183b..90743ad 100644 --- a/apsh.c +++ b/apsh.c @@ -4,19 +4,39 @@ USAGE(""); +int login_shell; +int posix_mode; + + void -initialise_parser_context(struct parser_context *ctx) +initialise_parser_context(struct parser_context *ctx, int need_tokeniser, int need_parser) { memset(ctx, 0, sizeof(*ctx)); - ctx->preparser_line_number = 1; - ctx->tokeniser_line_number = 1; - ctx->mode_stack = ecalloc(1, sizeof(*ctx->mode_stack)); - ctx->mode_stack->mode = NORMAL_MODE; - ctx->mode_stack->she_is_comment = 1; - ctx->parser_state = ecalloc(1, sizeof(*ctx->parser_state)); - ctx->here_documents_next = &ctx->here_documents_first; + if (need_tokeniser) { + ctx->preparser_line_number = 1; + ctx->tokeniser_line_number = 1; + ctx->mode_stack = ecalloc(1, sizeof(*ctx->mode_stack)); + ctx->mode_stack->she_is_comment = 1; + ctx->here_document_stack = ecalloc(1, sizeof(*ctx->here_document_stack)); + ctx->here_document_stack->next = &ctx->here_document_stack->first; + } + if (need_parser) { + ctx->parser_state = ecalloc(1, sizeof(*ctx->parser_state)); + } + ctx->interpreter_state = ecalloc(1, sizeof(*ctx->interpreter_state)); +} + + +static int +is_sh(char *name) +{ + if (!strcmp(name, "sh")) + return 1; + name = strrchr(name, '/'); + return name && !strcmp(name, "/sh"); } + int main(int argc, char *argv[]) { @@ -36,8 +56,11 @@ main(int argc, char *argv[]) if (argc) usage(); - initialise_parser_context(&ctx); - ctx.tty_input = isatty(STDIN_FILENO); + login_shell = (argv0[0] == '-'); + posix_mode = is_sh(&argv0[login_shell]); + + initialise_parser_context(&ctx, 1, 1); + ctx.tty_input = (char)isatty(STDIN_FILENO); if (ctx.tty_input) weprintf("apsh is currently not implemented to be interactive\n"); @@ -71,6 +94,12 @@ main(int argc, char *argv[]) if (buffer_tail != buffer_head || ctx.premature_end_of_file) eprintf("premature end of file reached\n"); + free(ctx.parser_state->commands); + free(ctx.parser_state->arguments); + free(ctx.parser_state->redirections); + free(ctx.parser_state); + free(ctx.here_document_stack); + free(ctx.interpreter_state); free(buffer); return 0; } -- cgit v1.2.3-70-g09d2