omi-eikyo/src/m_tokbuf.c

115 lines
2.1 KiB
C

// Copyright © 2017 Project Golan, all rights reserved.
#include "m_tokbuf.h"
#include <string.h>
#include <stdlib.h>
// Static Functions ----------------------------------------------------------|
//
// M_TokBuf_tokProcess
//
static enum M_tkprc M_TokBuf_tokProcess(M_token *tok, void *udata)
{
switch(tok->type) {
default: return tokproc_next;
case tok_eof: return tokproc_done;
case tok_lnend:
case tok_cmtlin: return tokproc_skip;
}
}
// Extern Functions ----------------------------------------------------------|
//
// M_TokBuf_Ctor
//
void M_TokBuf_Ctor(M_tkbuf *tb)
{
tb->toks = calloc(tb->bend, sizeof(M_token));
if(!tb->tokProcess) tb->tokProcess = M_TokBuf_tokProcess;
}
//
// M_TokBuf_Dtor
//
void M_TokBuf_Dtor(M_tkbuf *tb)
{
/* TODO
if(tb->toks)
for(int i = 0; i < tb->bend; i++)
free(tb->toks[i].textV);
free(tb->toks);
*/
}
//
// M_TokBuf_Get
//
[[__optional_args(1)]]
M_token *M_TokBuf_Get(M_tkbuf *tb)
{
if(++tb->tpos < tb->tend)
return &tb->toks[tb->tpos];
/* TODO
for(int i = 0; i < tb->tend - tb->bbeg; i++)
free(tb->toks[i].textV);
*/
memmove(&tb->toks[0], &tb->toks[tb->tend - tb->bbeg],
sizeof(M_token) * tb->bbeg);
for(tb->tpos = tb->tend = tb->bbeg; tb->tend < tb->bend; tb->tend++)
{
skip:
M_Tk_Parse(tb->fp, &tb->toks[tb->tend]);
switch(tb->tokProcess(&tb->toks[tb->tend], tb->udata)) {
case tokproc_next: break;
case tokproc_done: goto done;
case tokproc_skip: goto skip;
}
}
done:
/*
for(int i = 0; i < tb->tend; i++)
printf("%i: %s%s\n", tb->toks[i].type, tb->toks[i].text, i == tb->tpos ? " <-- cursor is here" : "");
*/
return &tb->toks[tb->tpos];
}
//
// M_TokBuf_UnGet
//
M_token *M_TokBuf_UnGet(M_tkbuf *tb)
{
return &tb->toks[tb->tpos--];
}
//
// M_TokBuf_ReGet
//
M_token *M_TokBuf_ReGet(M_tkbuf *tb)
{
return &tb->toks[tb->tpos];
}
//
// M_TokBuf_Drop
//
bool M_TokBuf_Drop(M_tkbuf *tb, M_tokty t)
{
if(tb->get()->type != t) {
tb->unget();
return false;
} else {
return true;
}
}
// EOF