diff --git a/README.md b/README.md index bbab8c7..be08206 100644 --- a/README.md +++ b/README.md @@ -8,19 +8,20 @@ TODO ### Build run this command: - autoreconf --force --verbose --install + `autoreconf --force --verbose --install` ### Test run this command: - ./configure CFLAGS='-std=c99 -Werror -Wall -Wextra -Wvla' + `./configure CFLAGS='-std=c99 -Werror -Wall -Wextra -Wvla'` then: - make + `make` #### asan run this command: - ./configure CFLAGS='-std=c99 -Werror -Wall -Wextra -Wvla -g -fsanitize=address' + `./configure CFLAGS='-std=c99 -Werror -Wall -Wextra -Wvla -g -fsanitize=address'` + then: - make check + `make check` ## Authors diff --git a/src/io_backend/io_backend.c b/src/io_backend/io_backend.c index 0fd983e..c6cebdc 100644 --- a/src/io_backend/io_backend.c +++ b/src/io_backend/io_backend.c @@ -8,6 +8,8 @@ // === Static variables +#include "utils/args/args.h" + static struct iob_context context; static FILE *input = NULL; static char *stream_buf = NULL; @@ -102,3 +104,28 @@ ssize_t stream_read(char **stream) return IOB_ERROR_GENERIC; } } + +int iob_config_from_args(struct args_options *args, struct iob_context *ctx) +{ + switch (args->type) + { + case INPUT_STDIN: + ctx->mode = IOB_MODE_STDIN; + ctx->args = NULL; + break; + + case INPUT_FILE: + ctx->mode = IOB_MODE_SCRIPT; + ctx->args = (char *)args->input_source; + break; + + case INPUT_CMD: + ctx->mode = IOB_MODE_CMD; + ctx->args = NULL; + break; + + default: + return -1; + } + return 0; +} \ No newline at end of file diff --git a/src/main.c b/src/main.c index 6ced238..b664786 100644 --- a/src/main.c +++ b/src/main.c @@ -1,19 +1,68 @@ -// all includes - +// All the includes #include +#include +#include "execution/execution.h" +#include "io_backend/io_backend.h" +#include "parser/parser.h" #include "utils/args/args.h" +enum return_codes +{ + SUCCESS = 0, + ERR_IO_BACKEND = 2, + ERR_MALLOC = 3 +}; + int main(int argc, char **argv) { + // Create the options struct (with argument handler) struct args_options options; int r = args_handler(argc, argv, &options); if (r != 0) { print_usage(stderr, argv[0]); - return 2; + return ERR_IO_BACKEND; + } + // args_print(&options); + + // Create the IO-Backend context struct + struct iob_context *io_context = malloc(sizeof(struct iob_context)); + if (io_context == NULL) + { + fprintf(stderr, + "Error: Memory allocation failed for IO Backend context\n"); + return ERR_MALLOC; } - args_print(&options); - return 0; + // Convert args_options to iob_context + r = iob_config_from_args(&options, io_context); + if (r != 0) + { + fprintf(stderr, + "Error: Failed to configure IO Backend from arguments\n"); + free(io_context); + return ERR_IO_BACKEND; + } + + // Init IO Backend (with the context struct) + r = iob_init(io_context); + if (r != 0) + { + fprintf(stderr, + "Error: IO Backend initialization failed with code %d\n", r); + free(io_context); + return ERR_IO_BACKEND; + } + + free(io_context); + + // Call the parser to get the AST + struct ast *command_ast = get_ast(); // We'll pass the options later + + // Call the executor with the AST + r = execution(command_ast); + + // Return the execution return code (last command executed) + return r; }