77 lines
1.7 KiB
C
77 lines
1.7 KiB
C
#include <stdbool.h>
|
|
#include <stdio.h>
|
|
|
|
#include "hydroforth/hydroforth.h"
|
|
|
|
bool hydroforth__step(HYDROFORTH__INTERPRETER *interpreter)
|
|
{
|
|
const unsigned long start = interpreter->pos;
|
|
unsigned char len = 0;
|
|
while (interpreter->src[interpreter->pos] != ' ' && interpreter->src[interpreter->pos] != '\n' && interpreter->src[interpreter->pos])
|
|
{
|
|
len++;
|
|
interpreter->pos++;
|
|
}
|
|
printf("START: %lu\nLEN: %u\n", start, len);
|
|
HYDROFORTH__WORD word;
|
|
if (len == 1)
|
|
{
|
|
if (hydroforth__number__is_digit(interpreter->src[start]))
|
|
{
|
|
word = (HYDROFORTH__WORD){
|
|
.type = PUSH,
|
|
.data = {.number = interpreter->src[start] - '0'},
|
|
};
|
|
}
|
|
else
|
|
{
|
|
word = (HYDROFORTH__WORD){
|
|
.type = CHAR_WORD,
|
|
.data = {.char_word = interpreter->src[start]},
|
|
};
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if ((interpreter->src[start] == '-' || interpreter->src[start] == '+') &&
|
|
hydroforth__number__is_digit(interpreter->src[start + 1]))
|
|
{
|
|
}
|
|
else if (hydroforth__number__is_digit(interpreter->src[start]))
|
|
{
|
|
int n;
|
|
if (!hydroforth__number__parse_number(interpreter->src + start, len, &n))
|
|
{
|
|
printf("RESULT IS FALSE!!!\nNUMBER: %i\n", n);
|
|
return false;
|
|
}
|
|
printf("NUMBER: %i\n", n);
|
|
}
|
|
else
|
|
{
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool hydroforth__run(HYDROFORTH__INTERPRETER *interpreter)
|
|
{
|
|
while (true)
|
|
{
|
|
while (interpreter->src[interpreter->pos] == ' ' || interpreter->src[interpreter->pos] == '\n')
|
|
{
|
|
interpreter->pos++;
|
|
}
|
|
if (!interpreter->src[interpreter->pos])
|
|
{
|
|
puts("END REACHED!");
|
|
return true;
|
|
}
|
|
if (!hydroforth__step(interpreter))
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
}
|