diff --git a/libs/pproc/include/scc_pproc.h b/libs/pproc/include/scc_pproc.h index 7711f3b..b6a9764 100644 --- a/libs/pproc/include/scc_pproc.h +++ b/libs/pproc/include/scc_pproc.h @@ -51,7 +51,7 @@ scc_lexer_tok_ring_t *scc_pproc_to_ring(scc_pproc_t *pp, int ring_size); void scc_pproc_drop(scc_pproc_t *pp); void scc_pproc_handle_directive(scc_pproc_t *pp); -void scc_pproc_parse_include(scc_pproc_t *pp); +void scc_pproc_parse_include(scc_pproc_t *pp, scc_lexer_tok_t *include_tok); void scc_pproc_parse_macro_arguments(scc_lexer_tok_ring_t *ring, scc_lexer_tok_vec_t *args, int need_full); void scc_pproc_parse_function_macro(scc_pproc_t *pp, diff --git a/libs/pproc/src/pproc_directive.c b/libs/pproc/src/pproc_directive.c index 25615ad..324fcc2 100644 --- a/libs/pproc/src/pproc_directive.c +++ b/libs/pproc/src/pproc_directive.c @@ -271,8 +271,7 @@ void scc_pproc_handle_directive(scc_pproc_t *pp) { return; } case SCC_PP_TOK_INCLUDE: - scc_lexer_tok_drop(&tok); - scc_pproc_parse_include(pp); + scc_pproc_parse_include(pp, &tok); return; case SCC_PP_TOK_IF: case SCC_PP_TOK_IFDEF: diff --git a/libs/pproc/src/pproc_include.c b/libs/pproc/src/pproc_include.c index 01647ec..950ef88 100644 --- a/libs/pproc/src/pproc_include.c +++ b/libs/pproc/src/pproc_include.c @@ -2,17 +2,15 @@ #include static int switch_file_stack(scc_pproc_t *pp, scc_cstring_t *fname, - int is_system) { + scc_pos_t *pos, int is_system) { scc_cstring_t fpath = scc_cstring_create(); int ret = 0; + const char *org_fname = pos->name; + 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); @@ -33,7 +31,8 @@ static int switch_file_stack(scc_pproc_t *pp, scc_cstring_t *fname, goto FOPEN; } } - LOG_ERROR("Include File %c%s%c Not Found", is_system ? '<' : '\"', + LOG_ERROR("In %s:%d:%d include %c%s%c , the file is not found", org_fname, + pos->line, pos->col, is_system ? '<' : '\"', scc_cstring_as_cstr(fname), is_system ? '>' : '\"'); return -1; FOPEN: @@ -50,9 +49,11 @@ FOPEN: return 0; } -void scc_pproc_parse_include(scc_pproc_t *pp) { +void scc_pproc_parse_include(scc_pproc_t *pp, scc_lexer_tok_t *include_tok) { int ok; scc_lexer_tok_t tok; + scc_pos_t pos = include_tok->loc; + scc_lexer_tok_drop(&tok); scc_lexer_tok_ring_t *stream = pp->cur_ring; scc_lexer_tok_vec_t org_toks; @@ -108,7 +109,7 @@ 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)) { + if (switch_file_stack(pp, &fname, &pos, is_system)) { // LOG_ERROR() } scc_cstring_free(&fname);