/* Test of cpp_callbacks::comments. */ #include "gcc-plugin.h" #include "config.h" #include "system.h" #include "coretypes.h" #include "cpplib.h" #include "diagnostic.h" #include "c-family/c-pragma.h" int plugin_is_GPL_compatible; /* Test callback for cpp_callbacks::comments. */ void my_comment_cb (cpp_reader *, location_t loc, const unsigned char *content, size_t len) { if (in_system_header_at (loc)) return; /* CONTENT contains the opening slash-star (or slash-slash), and for C-style comments contains the closing star-slash. */ gcc_assert (len >= 2); gcc_assert (content[0] == '/'); gcc_assert (content[1] == '*' || content[1] == '/'); bool c_style = (content[1] == '*'); if (c_style) { gcc_assert (content[len - 2] == '*'); gcc_assert (content[len - 1] == '/'); } if (c_style) inform (loc, "got C-style comment; length=%i", len); else inform (loc, "got C++-style comment; length=%i", len); /* Print the content of the comment. For a C-style comment, the buffer CONTENT contains the opening slash-star and closing star-slash, so we can't directly verify it in the DejaGnu test without adding another comment, which would trigger this callback again. Hence we skip the syntactically-significant parts of the comment when printing it. */ fprintf (stderr, "stripped content of comment: >"); /* Avoid printing trailing star-slash. */ if (c_style) len -= 2; for (size_t i = 2; i < len; i++) fputc (content[i], stderr); fprintf (stderr, "<\n"); } int plugin_init (struct plugin_name_args *plugin_info, struct plugin_gcc_version *version) { cpp_callbacks *cb = cpp_get_callbacks (parse_in); cb->comment = my_comment_cb; return 0; }