71 lines
1.3 KiB
C
71 lines
1.3 KiB
C
|
// Copyright © 2017 Project Golan, all rights reserved.
|
||
|
#include "m_tokbuf.h"
|
||
|
|
||
|
#include <string.h>
|
||
|
|
||
|
// Extern Functions ----------------------------------------------------------|
|
||
|
|
||
|
//
|
||
|
// M_TokBuf_Get
|
||
|
//
|
||
|
[[__optional_args(1)]]
|
||
|
M_token *M_TokBuf_Get(M_tkbuf *tb)
|
||
|
{
|
||
|
if(++tb->tpos < tb->tend)
|
||
|
return &tb->toks[tb->tpos];
|
||
|
|
||
|
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
|