#ifndef PROGRAM_H #define PROGRAM_H #include #include #include #include #include #include struct token; enum Keyword; enum Options_Target_Type { OPTION_TARGET_TOKENS, OPTION_TARGET_AST, OPTION_TARGET_C, OPTION_DEFAULT, }; struct Source { size_t src_size; size_t where_in_src; size_t current_column; size_t current_row; char *src_name; char *src; }; struct Options { enum Options_Target_Type target; int is_quiet:1; int providing_own_queue_implementation:1; int providing_own_buffer_implementation:1; int has_mutex:1; char *src_name; char *output_name; }; struct Error { char *message; size_t row; size_t column; }; struct Translation_Data { struct Queue *errors; struct Queue *tokens; size_t hold_number_of_errors; struct Map *hold_command_map; }; struct Program { struct Source *source; }; struct Source* extract_source(char *src_name); struct Options* parse_command_line(int argc,char **argv); struct Translation_Data* get_translation_data(); struct Error* get_error(char *message,size_t row,size_t column); void push_lexing_error(char *error_message,struct Source *src,struct Translation_Data *translation_data); void push_parsing_error(char *error_message,struct Translation_Data *translation_data); void push_error_with_token(char *error_message,struct token *token,struct Translation_Data *translation_data); char has_new_errors(struct Translation_Data *translation_data); void touch_errors(struct Translation_Data *translation_data); char get_and_check(struct Translation_Data *translation_data,enum Keyword kw); enum Keyword get_kw(struct Translation_Data *translation_data); void chomp(struct Translation_Data *translation_data); void delete_translation_data(struct Translation_Data *data); void delete_source(struct Source *src); void delete_options(struct Options *options); void delete_error(struct Error *error); #endif