aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/pre-process.c
diff options
authorJosh Triplett <josh@joshtriplett.org>2013-04-19 12:10:38 -0700
committerChristopher Li <sparse@chrisli.org>2013-04-21 20:55:10 -0700
commit9aadf85a29be2a74e46fc67b5313d41aee81dac7 (patch)
tree75a01db121c05159645cf68216db6b4f6f9b2506 /pre-process.c
parentf022d1c8b777af93ef25205cbc34cb6b64c698a7 (diff)
downloadsparse-dev-9aadf85a29be2a74e46fc67b5313d41aee81dac7.tar.gz
Support #pragma once
"#pragma once" acts like a multiple-inclusion guard affecting the entire file, without an associated preprocessor symbol. This allows use of sparse on projects that rely on #pragma once without also using an ifndef-based multiple-inclusion guard, such as systemd; without this change, sparse will get into an include loop. Signed-off-by: Josh Triplett <josh@joshtriplett.org> Signed-off-by: Christopher Li <sparse@chrisli.org>
Diffstat (limited to 'pre-process.c')
-rw-r--r--pre-process.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/pre-process.c b/pre-process.c
index 22ddf028..d5213186 100644
--- a/pre-process.c
+++ b/pre-process.c
@@ -745,6 +745,11 @@ static int already_tokenized(const char *path)
struct stream *s = input_streams + stream;
next = s->next_stream;
+ if (s->once) {
+ if (strcmp(path, s->name))
+ continue;
+ return 1;
+ }
if (s->constant != CONSTANT_FILE_YES)
continue;
if (strcmp(path, s->name))
@@ -1783,6 +1788,10 @@ static int handle_pragma(struct stream *stream, struct token **line, struct toke
{
struct token *next = *line;
+ if (match_ident(token->next, &once_ident) && eof_token(token->next->next)) {
+ stream->once = 1;
+ return 1;
+ }
token->ident = &pragma_ident;
token->pos.newline = 1;
token->pos.whitespace = 1;