加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
parser.c 2.26 KB
一键复制 编辑 原始数据 按行查看 历史
18512813483 提交于 2021-05-12 01:03 . 修改部分全局依赖
#include "parser.h"
#include "vector.h"
#include "keyword.h"
#include "handler.h"
#define BOB "{"
#define EOB "}"
//获取一行数据, 处理注释等
static bool read_line(FILE* stream, char* buf, size_t size) {
if(!fgets(buf, size, stream)) {
return false;
}
//TO DO HANDLE COMMIT
return true;
}
void process_stream(FILE* stream, vector_t* keywords, void* output) {
static keyword_t* cur_kw = NULL;
static int skip = 0;
char buf[1024];
while(read_line(stream, buf, sizeof(buf))) {
bool has_bob = false;
vector_t* line = alloc_strvec(buf);
if(!line)
continue;
if(!strcmp((char*)vector_slot_last(line), BOB)) {
has_bob = true;
if(vector_size(line) == 1) {
skip++;
free_strvec(line);
continue;
}
}
if(!strcmp((char*)vector_slot_first(line), EOB)) {
free_strvec(line);
if(skip) {
skip--;
continue;
} else {
break;
}
}
if(skip) {
#ifdef KP_PARSER_DEBUG
puts(cur_kw->string);
default_keyword_handler(line);
#endif
if(cur_kw && cur_kw->handler) {
cur_kw->handler(line, output);
}
}
int i = 0;
for(i=0;i<vector_size(keywords);++i) {
keyword_t* keyword = (keyword_t*)vector_slot(keywords, i);
if(!strcmp(keyword->string, (const char*)vector_slot_first(line))) {
#ifdef KP_PARSER_DEBUG
default_keyword_handler(line);
#endif
if(keyword->handler) {
keyword->handler(line, output);
}
if(has_bob) {
if(keyword->sub) {
process_stream(stream, keyword->sub, output);
} else {
cur_kw = keyword;
skip++;
}
}
break;
}
}
//不匹配
if(i == vector_size(keywords) && has_bob) {
skip++;
}
free_strvec(line);
}
}
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化