#ifndef __HYDROFORTH_H__ #define __HYDROFORTH_H__ #include #include "number.h" extern unsigned int 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; } 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; unsigned short word_keys_len; unsigned short word_keys_max_len; HYDROFORTH__WORD_DEFINITION_WORD_KEY *word_keys; HYDROFORTH__WORD_DEFINITION word_definitions[256]; HYDROFORTH__WORD call_stack[256]; unsigned char call_stack_len; int stack[256]; unsigned char stack_len; } HYDROFORTH__INTERPRETER; extern bool hydroforth__parse(HYDROFORTH__INTERPRETER *interpreter); extern bool hydroforth__run_call_stack(HYDROFORTH__INTERPRETER *interpreter); extern bool hydroforth__run(HYDROFORTH__INTERPRETER *interpreter); typedef struct __HYDROFORTH { __HYDROFORTH__NUMBER number; unsigned int (*hash_string)(const char *const key, unsigned char len); bool (*is_space)(char c); bool (*parse)(HYDROFORTH__INTERPRETER *interpreter); bool (*run_call_stack)(HYDROFORTH__INTERPRETER *interpreter); bool (*run)(HYDROFORTH__INTERPRETER *interpreter); } __HYDROFORTH; static const __HYDROFORTH hydroforth = { .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, }, .hash_string = hydroforth__hash_string, .is_space = hydroforth__is_space, .parse = hydroforth__parse, .run_call_stack = hydroforth__run_call_stack, .run = hydroforth__run, }; #endif