feat(pproc): 添加预处理器包含路径支持和改进头文件查找逻辑

添加了新的类型定义 scc_pproc_cstr_vec_t 用于存储包含路径,
并在 scc_pproc 结构中添加 include_paths 字段。实现改进的
switch_file_stack 函数,支持从当前目录、父目录和系统包含路径
中查找头文件,提供更完整的 #include 指令处理能力。

fix(core): 重命名环形缓冲区内联宏避免命名冲突

将 scc_ring_phys 宏重命名为 _scc_ring_phys,并添加其他相关
内部宏如 _scc_ring_cap、_scc_ring_head 等,以避免与外部接口
的命名冲突并提高代码清晰度。

refactor(main): 添加命令行包含路径选项并清理标准库引用

在命令行参数解析中添加 -I/--include 选项支持,允许用户指定
额外的头文件搜索路径。同时移除不必要的 stdio.h 引用并清理
一些调试相关的缓冲区设置。
This commit is contained in:
zzy
2026-02-19 19:30:00 +08:00
parent a52ff33e30
commit bc0b1d23e3
5 changed files with 62 additions and 14 deletions

View File

@@ -1,11 +1,45 @@
#include <pproc_expand.h>
#include <scc_pproc.h>
static int switch_file_stack(scc_pproc_t *pp, scc_cstring_t fname,
static int switch_file_stack(scc_pproc_t *pp, scc_cstring_t *fname,
int is_system) {
scc_cstring_t fpath = scc_cstring_create();
int ret = 0;
if (!is_system) {
const char parent[] = "/../";
// FIXME maybe it can eazy
const char *org_fname =
(((scc_sstream_t *)(((scc_lexer_t *)pp->org_ring->userdata)
->stream_ref->userdata))
->fname);
scc_cstring_append_cstr(&fpath, org_fname, scc_strlen(org_fname));
scc_cstring_append_cstr(&fpath, parent, scc_strlen(parent));
scc_cstring_append(&fpath, fname);
ret = scc_fexists(scc_cstring_as_cstr(&fpath));
if (ret == true) {
goto FOPEN;
}
}
/* system default path and -I includes path */
scc_vec_foreach(pp->include_paths, i) {
scc_cstring_free(&fpath);
scc_cstring_t *syspath = &scc_vec_at(pp->include_paths, i);
scc_cstring_append(&fpath, syspath);
scc_cstring_append(&fpath, fname);
ret = scc_fexists(scc_cstring_as_cstr(&fpath));
if (ret == true) {
goto FOPEN;
}
}
LOG_ERROR("Include File %c%s%c Not Found", is_system ? '<' : '\"',
scc_cstring_as_cstr(fname), is_system ? '>' : '\"');
return -1;
FOPEN:
scc_pproc_file_state_t *file = scc_malloc(sizeof(scc_pproc_file_state_t));
Assert(file != null);
if (scc_sstream_init(&(file->sstream), fname.data, 1024)) {
if (scc_sstream_init(&(file->sstream), scc_cstring_as_cstr(&fpath), 1024)) {
return -1;
}
scc_lexer_init(&(file->lexer), scc_sstream_to_ring(&(file->sstream)));
@@ -74,9 +108,10 @@ void scc_pproc_parse_include(scc_pproc_t *pp) {
}
scc_cstring_free(&line);
int is_system = includename[0] == '<';
if (switch_file_stack(pp, fname, is_system)) {
goto ERROR;
if (switch_file_stack(pp, &fname, is_system)) {
// LOG_ERROR()
}
scc_cstring_free(&fname);
return;
ERROR:
LOG_ERROR("Invalid include filename need \"FILENAME\" or <FILENAME>");