summaryrefslogtreecommitdiff
path: root/libcpp
diff options
context:
space:
mode:
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2008-10-05 12:35:36 +0000
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2008-10-05 12:35:36 +0000
commit956c6108f4cd69f7a8188d1ae822f05ddbde8604 (patch)
tree4d3817d3b652d403b257af245aaef0fa4682d210 /libcpp
parent146ac79f902b964ba1ea339ea57f3a74f789355c (diff)
downloadgcc-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/ChangeLog11
-rw-r--r--libcpp/include/cpplib.h30
-rw-r--r--libcpp/init.c9
-rw-r--r--libcpp/internal.h3
-rw-r--r--libcpp/lex.c49
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. */