From 631d0d36105c07f3e8c4127d252f83dbabbd40a3 Mon Sep 17 00:00:00 2001 From: Matthew Gingell Date: Sun, 5 Oct 2008 12:35:36 +0000 Subject: [PATCH] cpplib.h (cpp_comments, [...]): New structs. 2008-10-05 Matthew Gingell Arnaud Charlet * include/cpplib.h (cpp_comments, cpp_comment_table): New structs. (cpp_get_comments): New function. * internal.h (struct cpp_reader): Add comments field. * init.c (cpp_destroy): Free comments. * lex.c (store_comment, cpp_get_comments): New functions. (comments): New struct. (save_comment): Store comments in comments struct. Co-Authored-By: Arnaud Charlet From-SVN: r140883 --- libcpp/ChangeLog | 11 +++++++++ libcpp/include/cpplib.h | 30 +++++++++++++++++++++++++ libcpp/init.c | 9 ++++++++ libcpp/internal.h | 3 +++ libcpp/lex.c | 49 +++++++++++++++++++++++++++++++++++++++++ 5 files changed, 102 insertions(+) diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index 39be98972ae8..278bb06d6b85 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,14 @@ +2008-10-05 Matthew Gingell + Arnaud Charlet + + * include/cpplib.h (cpp_comments, cpp_comment_table): New structs. + (cpp_get_comments): New function. + * internal.h (struct cpp_reader): Add comments field. + * init.c (cpp_destroy): Free comments. + * lex.c (store_comment, cpp_get_comments): New functions. + (comments): New struct. + (save_comment): Store comments in comments struct. + 2008-09-18 Simon Baldwin * include/cpplib.h (struct cpp_options): Add new boolean flag diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h index 4f073f994333..5720c6fc8ea9 100644 --- a/libcpp/include/cpplib.h +++ b/libcpp/include/cpplib.h @@ -870,6 +870,36 @@ extern const char *cpp_type2name (enum cpp_ttype); extern cppchar_t cpp_parse_escape (cpp_reader *, const unsigned char ** pstr, const unsigned char *limit, int wide); +/* Structure used to hold a comment block at a given location in the + source code. */ + +typedef struct +{ + /* Text of the comment including the terminators. */ + char *comment; + + /* source location for the given comment. */ + source_location sloc; +} cpp_comment; + +/* Structure holding all comments for a given cpp_reader. */ + +typedef struct +{ + /* table of comment entries. */ + cpp_comment *entries; + + /* number of actual entries entered in the table. */ + int count; + + /* number of entries allocated currently. */ + int allocated; +} cpp_comment_table; + +/* Returns the table of comments encountered by the preprocessor. This + table is only populated when pfile->state.save_comments is true. */ +extern cpp_comment_table *cpp_get_comments (cpp_reader *); + /* In hash.c */ /* Lookup an identifier in the hashtable. Puts the identifier in the diff --git a/libcpp/init.c b/libcpp/init.c index 0db167c133c4..cc7a09ed8c27 100644 --- a/libcpp/init.c +++ b/libcpp/init.c @@ -245,6 +245,7 @@ cpp_destroy (cpp_reader *pfile) { cpp_context *context, *contextn; tokenrun *run, *runn; + int i; free (pfile->op_stack); @@ -287,6 +288,14 @@ cpp_destroy (cpp_reader *pfile) free (context); } + if (pfile->comments.entries) + { + for (i = 0; i < pfile->comments.count; i++) + free (pfile->comments.entries[i].comment); + + free (pfile->comments.entries); + } + free (pfile); } diff --git a/libcpp/internal.h b/libcpp/internal.h index c5bf35eab842..af075b4b1c94 100644 --- a/libcpp/internal.h +++ b/libcpp/internal.h @@ -471,6 +471,9 @@ struct cpp_reader /* Next value of __COUNTER__ macro. */ unsigned int counter; + + /* Table of comments, when state.save_comments is true. */ + cpp_comment_table comments; }; /* Character classes. Based on the more primitive macros in safe-ctype.h. diff --git a/libcpp/lex.c b/libcpp/lex.c index 2eb66bd63420..57364f00bb98 100644 --- a/libcpp/lex.c +++ b/libcpp/lex.c @@ -55,6 +55,7 @@ static int skip_line_comment (cpp_reader *); static void skip_whitespace (cpp_reader *, cppchar_t); static void lex_string (cpp_reader *, cpp_token *, const uchar *); static void save_comment (cpp_reader *, cpp_token *, const uchar *, cppchar_t); +static void store_comment (cpp_reader *, cpp_token *); static void create_literal (cpp_reader *, cpp_token *, const uchar *, unsigned int, enum cpp_ttype); static bool warn_in_comment (cpp_reader *, _cpp_line_note *); @@ -670,6 +671,51 @@ lex_string (cpp_reader *pfile, cpp_token *token, const uchar *base) create_literal (pfile, token, base, cur - base, type); } +/* Return the comment table. The client may not make any assumption + about the ordering of the table. */ +cpp_comment_table * +cpp_get_comments (cpp_reader *pfile) +{ + return &pfile->comments; +} + +/* Append a comment to the end of the comment table. */ +static void +store_comment (cpp_reader *pfile, cpp_token *token) +{ + int len; + + if (pfile->comments.allocated == 0) + { + pfile->comments.allocated = 256; + pfile->comments.entries = (cpp_comment *) xmalloc + (pfile->comments.allocated * sizeof (cpp_comment)); + } + + if (pfile->comments.count == pfile->comments.allocated) + { + pfile->comments.allocated *= 2; + pfile->comments.entries = (cpp_comment *) xrealloc + (pfile->comments.entries, + pfile->comments.allocated * sizeof (cpp_comment)); + } + + len = token->val.str.len; + + /* Copy comment. Note, token may not be NULL terminated. */ + pfile->comments.entries[pfile->comments.count].comment = + (char *) xmalloc (sizeof (char) * (len + 1)); + memcpy (pfile->comments.entries[pfile->comments.count].comment, + token->val.str.text, len); + pfile->comments.entries[pfile->comments.count].comment[len] = '\0'; + + /* Set source location. */ + pfile->comments.entries[pfile->comments.count].sloc = token->src_loc; + + /* Increment the count of entries in the comment table. */ + pfile->comments.count++; +} + /* The stored comment includes the comment start and any terminator. */ static void save_comment (cpp_reader *pfile, cpp_token *token, const unsigned char *from, @@ -709,6 +755,9 @@ save_comment (cpp_reader *pfile, cpp_token *token, const unsigned char *from, buffer[clen - 2] = '*'; buffer[clen - 1] = '/'; } + + /* Finally store this comment for use by clients of libcpp. */ + store_comment (pfile, token); } /* Allocate COUNT tokens for RUN. */ -- 2.39.5