#ifndef __HYDROFORTH_H__ #define __HYDROFORTH_H__ #include #include "result.h" #include "number.h" extern unsigned hydroforth__hash_string(const char *const key, unsigned char len); extern bool hydroforth__is_space(char c); typedef enum HYDROFORTH__WORD_TYPE { PUSH, CHAR_WORD, WORD, } HYDROFORTH__WORD_TYPE; typedef union HYDROFORTH__WORD_DATA { int number; char char_word; unsigned int hash; } HYDROFORTH__WORD_DATA; typedef struct HYDROFORTH__WORD { HYDROFORTH__WORD_TYPE type; HYDROFORTH__WORD_DATA data; } HYDROFORTH__WORD; typedef struct HYDROFORTH__WORD_DEFINITION { HYDROFORTH__WORD *words; unsigned char words_len; } HYDROFORTH__WORD_DEFINITION; typedef struct HYDROFORTH__WORD_DEFINITION_BASE_KEY { unsigned char word_definition_index; } HYDROFORTH__WORD_DEFINITION_BASE_KEY; typedef struct HYDROFORTH__WORD_DEFINITION_SINGLE_CHAR_WORD_KEY { char c; HYDROFORTH__WORD_DEFINITION_BASE_KEY key; } HYDROFORTH__WORD_DEFINITION_SINGLE_CHAR_WORD_KEY; typedef struct HYDROFORTH__WORD_DEFINITION_WORD_KEY { unsigned int hash; HYDROFORTH__WORD_DEFINITION_BASE_KEY key; } HYDROFORTH__WORD_DEFINITION_WORD_KEY; typedef struct HYDROFORTH__INTERPRETER { char *src; unsigned long pos; HYDROFORTH__WORD_DEFINITION_SINGLE_CHAR_WORD_KEY single_char_word_keys[32]; unsigned char single_char_word_keys_len; HYDROFORTH__WORD_DEFINITION_WORD_KEY word_keys[256]; unsigned short word_keys_len; HYDROFORTH__WORD_DEFINITION word_definitions[256 + 32]; unsigned short word_definitions_len; HYDROFORTH__WORD call_stack[256]; unsigned char call_stack_len; int stack[256]; unsigned char stack_len; } HYDROFORTH__INTERPRETER; typedef struct HYDROFORTH__SCAN_NEXT_WORD_RESULT { unsigned long start; unsigned char len; } HYDROFORTH__SCAN_NEXT_WORD_RESULT; extern HYDROFORTH__SCAN_NEXT_WORD_RESULT hydroforth__scan_next_word(HYDROFORTH__INTERPRETER *interpreter); extern void hydroforth__add_word_to_word_definition(HYDROFORTH__WORD_DEFINITION *word_def, HYDROFORTH__WORD word); extern void hydroforth__parse(HYDROFORTH__RESULT *result, HYDROFORTH__INTERPRETER *interpreter, HYDROFORTH__WORD_DEFINITION *word_def); extern void hydroforth__run_call_stack(HYDROFORTH__RESULT *result, HYDROFORTH__INTERPRETER *interpreter); extern void hydroforth__run(HYDROFORTH__RESULT *result, HYDROFORTH__INTERPRETER *interpreter); typedef struct __HYDROFORTH { __HYDROFORTH__RESULT result; __HYDROFORTH__NUMBER number; unsigned (*hash_string)(const char *const key, unsigned char len); bool (*is_space)(char c); HYDROFORTH__SCAN_NEXT_WORD_RESULT(*scan_next_word) (HYDROFORTH__INTERPRETER *interpreter); void (*add_word_to_word_definition)(HYDROFORTH__WORD_DEFINITION *word_def, HYDROFORTH__WORD word); void (*parse)(HYDROFORTH__RESULT *result, HYDROFORTH__INTERPRETER *interpreter, HYDROFORTH__WORD_DEFINITION *word_def); void (*run_call_stack)(HYDROFORTH__RESULT *result, HYDROFORTH__INTERPRETER *interpreter); void (*run)(HYDROFORTH__RESULT *result, HYDROFORTH__INTERPRETER *interpreter); } __HYDROFORTH; static const __HYDROFORTH hydroforth = { .result = { .add_backtrace = hydroforth__result__add_backtrace, .get_error_message = hydroforth__result__get_error_message, .unwrap = hydroforth__result__unwrap, }, .number = { .is_digit = hydroforth__number__is_digit, .convert_hex_digit = hydroforth__number__convert_hex_digit, .parse_number_hex = hydroforth__number__parse_number_hex, .parse_number = hydroforth__number__parse_number, .count_digits = hydroforth__number__count_digits, }, .hash_string = hydroforth__hash_string, .is_space = hydroforth__is_space, .scan_next_word = hydroforth__scan_next_word, .add_word_to_word_definition = hydroforth__add_word_to_word_definition, .parse = hydroforth__parse, .run_call_stack = hydroforth__run_call_stack, .run = hydroforth__run, }; #endif