hydroforth/include/hydroforth/hydroforth.h

125 lines
3.9 KiB
C
Raw Normal View History

2022-12-22 12:19:33 +00:00
#ifndef __HYDROFORTH_H__
#define __HYDROFORTH_H__
#include <stdbool.h>
2022-12-23 14:02:29 +00:00
#include "result.h"
2022-12-22 12:19:33 +00:00
#include "number.h"
2022-12-23 19:52:25 +00:00
extern unsigned hydroforth__hash_string(const char *const key, unsigned char len);
2022-12-22 17:05:42 +00:00
extern bool hydroforth__is_space(char c);
2022-12-22 15:02:45 +00:00
2022-12-22 12:19:33 +00:00
typedef enum HYDROFORTH__WORD_TYPE
{
PUSH,
CHAR_WORD,
WORD,
} HYDROFORTH__WORD_TYPE;
typedef union HYDROFORTH__WORD_DATA
{
int number;
char char_word;
2022-12-22 17:05:42 +00:00
unsigned int hash;
2022-12-22 12:19:33 +00:00
} HYDROFORTH__WORD_DATA;
typedef struct HYDROFORTH__WORD
{
HYDROFORTH__WORD_TYPE type;
HYDROFORTH__WORD_DATA data;
} HYDROFORTH__WORD;
2022-12-22 15:02:45 +00:00
typedef struct HYDROFORTH__WORD_DEFINITION
{
HYDROFORTH__WORD *words;
2022-12-23 19:52:25 +00:00
unsigned char words_len;
2022-12-22 15:02:45 +00:00
} 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;
2022-12-22 12:19:33 +00:00
typedef struct HYDROFORTH__INTERPRETER
{
char *src;
unsigned long pos;
2022-12-22 15:02:45 +00:00
HYDROFORTH__WORD_DEFINITION_SINGLE_CHAR_WORD_KEY single_char_word_keys[32];
unsigned char single_char_word_keys_len;
2022-12-23 19:52:25 +00:00
HYDROFORTH__WORD_DEFINITION_WORD_KEY word_keys[256];
2022-12-22 15:02:45 +00:00
unsigned short word_keys_len;
2022-12-23 19:52:25 +00:00
HYDROFORTH__WORD_DEFINITION word_definitions[256 + 32];
unsigned short word_definitions_len;
2022-12-22 12:19:33 +00:00
HYDROFORTH__WORD call_stack[256];
unsigned char call_stack_len;
int stack[256];
unsigned char stack_len;
} HYDROFORTH__INTERPRETER;
2022-12-23 14:02:29 +00:00
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);
2022-12-23 19:52:25 +00:00
extern void hydroforth__add_word_to_word_definition(HYDROFORTH__WORD_DEFINITION *word_def, HYDROFORTH__WORD word);
2022-12-22 15:02:45 +00:00
2022-12-23 19:52:25 +00:00
extern void hydroforth__parse(HYDROFORTH__RESULT *result, HYDROFORTH__INTERPRETER *interpreter, HYDROFORTH__WORD_DEFINITION *word_def);
2022-12-22 12:19:33 +00:00
2022-12-23 19:52:25 +00:00
extern void hydroforth__run_call_stack(HYDROFORTH__RESULT *result, HYDROFORTH__INTERPRETER *interpreter);
extern void hydroforth__run(HYDROFORTH__RESULT *result, HYDROFORTH__INTERPRETER *interpreter);
2022-12-22 12:19:33 +00:00
typedef struct __HYDROFORTH
{
2022-12-23 14:02:29 +00:00
__HYDROFORTH__RESULT result;
2022-12-22 12:19:33 +00:00
__HYDROFORTH__NUMBER number;
2022-12-23 19:52:25 +00:00
unsigned (*hash_string)(const char *const key, unsigned char len);
2022-12-22 17:05:42 +00:00
bool (*is_space)(char c);
2022-12-23 14:02:29 +00:00
HYDROFORTH__SCAN_NEXT_WORD_RESULT(*scan_next_word)
(HYDROFORTH__INTERPRETER *interpreter);
2022-12-23 19:52:25 +00:00
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);
2022-12-22 12:19:33 +00:00
} __HYDROFORTH;
static const __HYDROFORTH hydroforth = {
2022-12-23 14:02:29 +00:00
.result = {
.add_backtrace = hydroforth__result__add_backtrace,
.get_error_message = hydroforth__result__get_error_message,
2022-12-23 16:16:29 +00:00
.unwrap = hydroforth__result__unwrap,
2022-12-23 14:02:29 +00:00
},
2022-12-22 12:19:33 +00:00
.number = {
.is_digit = hydroforth__number__is_digit,
2022-12-22 15:02:45 +00:00
.convert_hex_digit = hydroforth__number__convert_hex_digit,
.parse_number_hex = hydroforth__number__parse_number_hex,
2022-12-22 12:19:33 +00:00
.parse_number = hydroforth__number__parse_number,
2022-12-23 14:02:29 +00:00
.count_digits = hydroforth__number__count_digits,
2022-12-22 12:19:33 +00:00
},
2022-12-22 15:02:45 +00:00
.hash_string = hydroforth__hash_string,
2022-12-22 17:05:42 +00:00
.is_space = hydroforth__is_space,
2022-12-23 14:02:29 +00:00
.scan_next_word = hydroforth__scan_next_word,
2022-12-23 19:52:25 +00:00
.add_word_to_word_definition = hydroforth__add_word_to_word_definition,
2022-12-22 15:02:45 +00:00
.parse = hydroforth__parse,
.run_call_stack = hydroforth__run_call_stack,
2022-12-22 12:19:33 +00:00
.run = hydroforth__run,
};
#endif