diff options
author | charlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-10-05 12:35:36 +0000 |
---|---|---|
committer | charlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2008-10-05 12:35:36 +0000 |
commit | 956c6108f4cd69f7a8188d1ae822f05ddbde8604 (patch) | |
tree | 4d3817d3b652d403b257af245aaef0fa4682d210 /libcpp | |
parent | 146ac79f902b964ba1ea339ea57f3a74f789355c (diff) | |
download | gcc-956c6108f4cd69f7a8188d1ae822f05ddbde8604.tar.gz |
2008-10-05 Matthew Gingell <gingell@adacore.com>
Arnaud Charlet <charlet@adacore.com>
* 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.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@140883 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libcpp')
-rw-r--r-- | libcpp/ChangeLog | 11 | ||||
-rw-r--r-- | libcpp/include/cpplib.h | 30 | ||||
-rw-r--r-- | libcpp/init.c | 9 | ||||
-rw-r--r-- | libcpp/internal.h | 3 | ||||
-rw-r--r-- | libcpp/lex.c | 49 |
5 files changed, 102 insertions, 0 deletions
diff --git a/libcpp/ChangeLog b/libcpp/ChangeLog index 39be98972ae..278bb06d6b8 100644 --- a/libcpp/ChangeLog +++ b/libcpp/ChangeLog @@ -1,3 +1,14 @@ +2008-10-05 Matthew Gingell <gingell@adacore.com> + Arnaud Charlet <charlet@adacore.com> + + * 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 <simonb@google.com> * include/cpplib.h (struct cpp_options): Add new boolean flag diff --git a/libcpp/include/cpplib.h b/libcpp/include/cpplib.h index 4f073f99433..5720c6fc8ea 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 0db167c133c..cc7a09ed8c2 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 c5bf35eab84..af075b4b1c9 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 2eb66bd6342..57364f00bb9 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. */ |