#ifndef _AUTOMATON_PARSER_H #define _AUTOMATON_PARSER_H #define NUMINPUTS 500 #define MAX_PROGRAM_LENGTH 20000 #define MAX_PROGRAM_WALK_LENGTH 5000 #define MAX_TERMINAL_NUMS 5000 #define MAX_TERMINAL_LENGTH 1000 #define MAX_PROGRAM_NAME_LENGTH 5000 #include "gramfuzz.h" // represents an edge in the FSA struct terminal_meta { int state_name; int trigger_idx; int dest; }; // represents a set of edges struct terminal_arr { struct terminal_meta *start; size_t len; }; // essentially a string array struct symbols_arr { char **symbols_arr; size_t len; }; struct symbols_arr *symbols; // symbols contain all the symbols in the language map_t pda_map; // a map that maps each symbol in the language to a set of edges struct symbols_arr * first_chars; // an array of first characters, only temperary array map_t first_char_to_symbols_map; // a map that maps each first character to a // set of symbols (the symbols are sorted in // descending order) // freeing terminal arrays int free_terminal_arr(any_t placeholder, any_t item); // return a map that maps each symbol in the language to a set of edges // populate symbols_arr with all the symbols in the language map_t create_pda_hashmap(state *pda, struct symbols_arr *symbols_arr); // print the string array void print_symbols_arr(struct symbols_arr *arr); // free hashmap // the function pointer contains function to free the values in the hashmap void free_hashmap(map_t m, int (*f)(any_t, any_t)); // free string array int free_array_of_chars(any_t placeholder, any_t item); // free the pda void free_pda(state *pda); // create a string array struct symbols_arr *create_array_of_chars(); map_t create_first_char_to_symbols_hashmap(struct symbols_arr *symbols, struct symbols_arr *first_chars); // return the automaton represented by the seed Array *automaton_parser(const uint8_t *seed_fn); int add_element_to_symbols_arr(struct symbols_arr *symbols_arr, char *symbol, size_t symbol_len); #endif