#ifndef SHELL_H_SENTRY #define SHELL_H_SENTRY #include "dynamic_array.h" #include "queue.h" #include enum { /* CTRL-D */ end_of_file = 4, new_line = 10, whitespace = ' ', tab = 9, esc = 27, backslash = '\\', double_quotes = '"' }; /* two-letter tokens */ enum { append = '>' + 1, and = '&' + 1, or = '|' + 1, next_command = ';', start_subshell = '(', end_subshell = ')' }; /* error codes */ enum { err_filename_expected = 1, err_redirect_stream_again = 2, err_redirect_stream_in_pipeline = 3, err_bg_process = 4, err_empty_command = 5, err_extra_chars_after_filename = 6, err_odd_double_quotes = 7, err_set_failure = 8, err_missing_closing_bracket = 9, err_repeated_background_ch = 10 }; /* storing file names to redirect standard input/output streams */ struct io_type { char *input_stream; char *output_stream; char *output_stream_to_append; }; struct param_type { int is_word; int escape_sequences; unsigned int double_quotes_counter; char stored_symbol; int empty_word_flag; int tokens; int wrong_command; struct io_type streams; int pipeline; int new_readline; int general_pipe_pgid; int general_subshell_pgid; int general_pgid; int subshell; int fd_read_for_channel; int fd_read_for_subshell; int background_process; }; extern volatile sig_atomic_t last_execution_status; int filename_waiting(struct param_type *params); void add_filename(struct dynamic_array *tmp_word, struct param_type *params); void add_word(struct w_queue *word_chain, struct dynamic_array *tmp_word, struct param_type *params); int is_stream_redirection_set(const struct param_type *params); char** create_cmdline(const struct w_queue *word_chain, int word_counter); #endif