Newer
Older
cneboy_games / rpg / parse.c
@Mark Bavis Mark Bavis on 19 Aug 2022 1 KB Working dynamic code loading
#include "parse.h"

bool reset_parse = false;
char* parse_word = NULL;
int parse_line = 1;
int parse(char* l, size_t len, bool (*is_break)(char), bool debug)
{
    static char last_char;
    static int i = 0;
    static int nl = 0;
    if (reset_parse)
    {
        parse_line = 1;
        i = 0;
        nl = 0;
        last_char = 0;
        reset_parse = false;
    }

    parse_word = NULL;

    while (i < len)
    {
        char c = l[i];
        if (c == 0) c = last_char;
        i++;
        if (debug)
        {
            printf("Char@%d %d %c\n", i, c, c);
        }
        if (is_break(c) || c == '\n')
        {
            if (parse_word)
            {
                i--;
                l[i] = 0;
                last_char = c;
                nl = false;
                return WORD;
            }
            else if (c == '\n')
            {
                nl++;
                parse_line++;
                if (nl == 1)
                {
                    return NL;
                }
                else if (nl == 2)
                {
                    return BREAK;
                }
            }
        }
        else
        {
            if (parse_word == NULL) parse_word = l + (i - 1);
        }
    }

    if (parse_word) return WORD;

    return DONE;
}