#include "parser.h"

ParserRec InitParser(char *filename)
{
    ParserRec pr;

    pr.fil = new std::ifstream(filename);
    if (*pr.fil==0) throw string ("Soubor nebyl nalezen");
    pr.c = pr.fil->get();
    pr.newline = 1;
    return pr;
}

void EndParser(ParserRec *pr)
{
    pr->fil->close();
    pr->fil = NULL;
}

void ReadChar(ParserRec *pr)
{
    pr->c = pr->fil->get();
    pr->newline = 0;
}

void ParseLineFeed(ParserRec *pr)
{
    do {
        ReadChar(pr);
        if (pr->fil->eof()) return;
    } while (pr->c != 13 && pr->c != 10);
    do {
        ReadChar(pr);
        if (pr->fil->eof()) return;
    } while (pr->c == 13 || pr->c == 10);
    pr->newline = 1;
}

int IsWhiteSpace(char c)
{
    return (c < 33);
}

int IsSpecSymbol(char c)
{
    return (c < '.' || c > 'z' ||
        (c > '9' && c < 'A') ||
        (c > 'Z' && c < 'a' && c!='_'));
}

void SkipWhiteSpace(ParserRec *pr)
{
    char lc;

    while (IsWhiteSpace(pr->c)) {
        lc = pr->c;
        ReadChar(pr);
        if (pr->fil->eof()) return;
    }
    if (lc == 13 || lc == 10) pr->newline = 1;
}

char ParseChar(ParserRec *pr)
{
    char c;

    if (pr->fil->eof()) {
        EndParser(pr);
        return 0;
    }
    while (pr->newline == 1 && pr->c == '#') ParseLineFeed(pr);
    SkipWhiteSpace(pr);
    c = pr->c;
    ReadChar(pr);
    return c;
}

string ParseString(ParserRec *pr)
{
    string s;

    s = ParseChar(pr);
    if (s[0] == 0) {
        EndParser(pr);
        return NULL;
    }
    while (!IsSpecSymbol(pr->c) && !IsWhiteSpace(pr->c) && !pr->fil->eof()) {
        s+= pr->c;
        ReadChar(pr);
        if (pr->fil->eof()) return "";
    }
    return s;
}
