[PATCH 05/15] Remove pre_buffer

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: Christopher Li <spase@xxxxxxxxxxx>

This patch removes the pre_buffer completely. Instead,
sparse will tokenized the buffer during add_pre_buffer().
Sparse just tracks the beginning and end of pre_buffer.

Reviewed-by: Alexey Zaytsev <alexey.zaytsev@xxxxxxxxx>
Signed-Off-By: Christopher Li <spase@xxxxxxxxxxx>
---
 lib.c      |   23 ++++++++++++++---------
 token.h    |    2 +-
 tokenize.c |   21 +++++++++++----------
 3 files changed, 26 insertions(+), 20 deletions(-)

diff --git a/lib.c b/lib.c
index 0abcc9a..ea40ce1 100644
--- a/lib.c
+++ b/lib.c
@@ -185,8 +185,8 @@ void die(const char *fmt, ...)
 	exit(1);
 }
 
-static unsigned int pre_buffer_size;
-static char pre_buffer[8192];
+static struct token *pre_buffer_begin = NULL;
+static struct token *pre_buffer_end = NULL;
 
 int Waddress_space = 1;
 int Wbitwise = 0;
@@ -230,14 +230,18 @@ void add_pre_buffer(const char *fmt, ...)
 {
 	va_list args;
 	unsigned int size;
+	struct token *begin, *end;
+	char buffer[4096];
 
 	va_start(args, fmt);
-	size = pre_buffer_size;
-	size += vsnprintf(pre_buffer + size,
-		sizeof(pre_buffer) - size,
-		fmt, args);
-	pre_buffer_size = size;
+	size = vsnprintf(buffer, sizeof(buffer), fmt, args);
 	va_end(args);
+	begin = tokenize_buffer(buffer, size, &end);
+	if (!pre_buffer_begin)
+		pre_buffer_begin = begin;
+	if (pre_buffer_end)
+		pre_buffer_end->next = begin;
+	pre_buffer_end = end;
 }
 
 static char **handle_switch_D(char *arg, char **next)
@@ -819,8 +823,9 @@ static struct symbol_list *sparse_initial(void)
 				 token, includepath);
 
 	// Prepend the initial built-in stream
-	token = tokenize_buffer(pre_buffer, pre_buffer_size, token);
-	return sparse_tokenstream(token);
+	if (token)
+		pre_buffer_end->next = token;
+	return sparse_tokenstream(pre_buffer_begin);
 }
 
 struct symbol_list *sparse_initialize(int argc, char **argv, struct string_list **filelist)
diff --git a/token.h b/token.h
index ba7866d..fda880f 100644
--- a/token.h
+++ b/token.h
@@ -195,7 +195,7 @@ extern const char *show_ident(const struct ident *);
 extern const char *show_string(const struct string *string);
 extern const char *show_token(const struct token *);
 extern struct token * tokenize(const char *, int, struct token *, const char **next_path);
-extern struct token * tokenize_buffer(void *, unsigned long, struct token *);
+extern struct token * tokenize_buffer(void *, unsigned long, struct token **);
 
 extern void show_identifier_stats(void);
 extern struct token *preprocess(struct token *);
diff --git a/tokenize.c b/tokenize.c
index d154882..7c41a56 100644
--- a/tokenize.c
+++ b/tokenize.c
@@ -304,7 +304,7 @@ static inline int nextchar(stream_t *stream)
 
 struct token eof_token_entry;
 
-static void mark_eof(stream_t *stream, struct token *end_token)
+static struct token *mark_eof(stream_t *stream)
 {
 	struct token *end;
 
@@ -315,11 +315,10 @@ static void mark_eof(stream_t *stream, struct token *end_token)
 	eof_token_entry.next = &eof_token_entry;
 	eof_token_entry.pos.newline = 1;
 
-	if (!end_token)
-		end_token =  &eof_token_entry;
-	end->next = end_token;
+	end->next =  &eof_token_entry;
 	*stream->tokenlist = end;
 	stream->tokenlist = NULL;
+	return end;
 }
 
 static void add_token(stream_t *stream)
@@ -912,7 +911,7 @@ static struct token *setup_stream(stream_t *stream, int idx, int fd,
 	return begin;
 }
 
-static void tokenize_stream(stream_t *stream, struct token *endtoken)
+static struct token *tokenize_stream(stream_t *stream)
 {
 	int c = nextchar(stream);
 	while (c != EOF) {
@@ -927,22 +926,22 @@ static void tokenize_stream(stream_t *stream, struct token *endtoken)
 		stream->whitespace = 1;
 		c = nextchar(stream);
 	}
-	mark_eof(stream, endtoken);
+	return mark_eof(stream);
 }
 
-struct token * tokenize_buffer(void *buffer, unsigned long size, struct token *endtoken)
+struct token * tokenize_buffer(void *buffer, unsigned long size, struct token **endtoken)
 {
 	stream_t stream;
 	struct token *begin;
 
 	begin = setup_stream(&stream, 0, -1, buffer, size);
-	tokenize_stream(&stream, endtoken);
+	*endtoken = tokenize_stream(&stream);
 	return begin;
 }
 
 struct token * tokenize(const char *name, int fd, struct token *endtoken, const char **next_path)
 {
-	struct token *begin;
+	struct token *begin, *end;
 	stream_t stream;
 	unsigned char buffer[BUFSIZE];
 	int idx;
@@ -954,6 +953,8 @@ struct token * tokenize(const char *name, int fd, struct token *endtoken, const
 	}
 
 	begin = setup_stream(&stream, idx, fd, buffer, 0);
-	tokenize_stream(&stream, endtoken);
+	end = tokenize_stream(&stream);
+	if (endtoken)
+		end->next = endtoken;
 	return begin;
 }

--
To unsubscribe from this list: send the line "unsubscribe linux-sparse" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Newbies FAQ]     [LKML]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Trinity Fuzzer Tool]

  Powered by Linux