// Copyright © 2017 Project Golan, all rights reserved. #include "m_tokbuf.h" #include #include // 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(M_TokBuf_Get(tb)->type != t) { M_TokBuf_UnGet(tb); return false; } else { return true; } } // EOF