mirror of https://github.com/rui314/chibicc
[GNU] Add #include_next
This commit is contained in:
parent
a6c662207d
commit
f10bcebaa5
19
preprocess.c
19
preprocess.c
|
@ -68,6 +68,7 @@ struct Hideset {
|
||||||
static HashMap macros;
|
static HashMap macros;
|
||||||
static CondIncl *cond_incl;
|
static CondIncl *cond_incl;
|
||||||
static HashMap pragma_once;
|
static HashMap pragma_once;
|
||||||
|
static int include_next_idx;
|
||||||
|
|
||||||
static Token *preprocess2(Token *tok);
|
static Token *preprocess2(Token *tok);
|
||||||
static Macro *find_macro(Token *tok);
|
static Macro *find_macro(Token *tok);
|
||||||
|
@ -696,11 +697,21 @@ char *search_include_paths(char *filename) {
|
||||||
if (!file_exists(path))
|
if (!file_exists(path))
|
||||||
continue;
|
continue;
|
||||||
hashmap_put(&cache, filename, path);
|
hashmap_put(&cache, filename, path);
|
||||||
|
include_next_idx = i + 1;
|
||||||
return path;
|
return path;
|
||||||
}
|
}
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char *search_include_next(char *filename) {
|
||||||
|
for (; include_next_idx < include_paths.len; include_next_idx++) {
|
||||||
|
char *path = format("%s/%s", include_paths.data[include_next_idx], filename);
|
||||||
|
if (file_exists(path))
|
||||||
|
return path;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
// Read an #include argument.
|
// Read an #include argument.
|
||||||
static char *read_include_filename(Token **rest, Token *tok, bool *is_dquote) {
|
static char *read_include_filename(Token **rest, Token *tok, bool *is_dquote) {
|
||||||
// Pattern 1: #include "foo.h"
|
// Pattern 1: #include "foo.h"
|
||||||
|
@ -863,6 +874,14 @@ static Token *preprocess2(Token *tok) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (equal(tok, "include_next")) {
|
||||||
|
bool ignore;
|
||||||
|
char *filename = read_include_filename(&tok, tok->next, &ignore);
|
||||||
|
char *path = search_include_next(filename);
|
||||||
|
tok = include_file(tok, path ? path : filename, start->next->next);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
if (equal(tok, "define")) {
|
if (equal(tok, "define")) {
|
||||||
read_macro_definition(&tok, tok->next);
|
read_macro_definition(&tok, tok->next);
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -265,4 +265,13 @@ echo 'int foo(); int bar=3; int main() { foo(); }' > $tmp/main.c
|
||||||
$chibicc -o $tmp/foo $tmp/main.c $tmp/foo.so
|
$chibicc -o $tmp/foo $tmp/main.c $tmp/foo.so
|
||||||
check -fPIC
|
check -fPIC
|
||||||
|
|
||||||
|
# #include_next
|
||||||
|
mkdir -p $tmp/next1 $tmp/next2 $tmp/next3
|
||||||
|
echo '#include "file1.h"' > $tmp/file.c
|
||||||
|
echo '#include_next "file1.h"' > $tmp/next1/file1.h
|
||||||
|
echo '#include_next "file2.h"' > $tmp/next2/file1.h
|
||||||
|
echo 'foo' > $tmp/next3/file2.h
|
||||||
|
$chibicc -I$tmp/next1 -I$tmp/next2 -I$tmp/next3 -E $tmp/file.c | grep -q foo
|
||||||
|
check '#include_next'
|
||||||
|
|
||||||
echo OK
|
echo OK
|
||||||
|
|
Loading…
Reference in New Issue