diff options
author | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-03-30 21:12:53 +0000 |
---|---|---|
committer | rth <rth@138bc75d-0d04-0410-961f-82ee72b054a4> | 2007-03-30 21:12:53 +0000 |
commit | 3fa3949da38e56a88feef5467a58ea52c3fea3be (patch) | |
tree | f8ad58ad599c110a4cb386319a9c1e0f7f184b64 /libcpp/directives.c | |
parent | 6e9e3dbec65a8f70bf8c2db0047ee92349a14cd2 (diff) | |
download | gcc-3fa3949da38e56a88feef5467a58ea52c3fea3be.tar.gz |
libcpp/
* directives.c (lex_macro_node_from_str): New.
(cpp_push_definition, cpp_pop_definition): New.
* include/cpplib.h (cpp_push_definition, cpp_pop_definition): Declare.
gcc/
* c-pragma.c (struct def_pragma_macro_value): New.
(struct def_pragma_macro): New.
(pushed_macro_table): New.
(dpm_hash, dpm_eq): New.
(handle_pragma_push_macro, handle_pragma_pop_macro): New.
(init_pragma): Install them.
* doc/tm.texi (HANDLE_PRAGMA_PUSH_POP_MACRO): New.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@123370 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libcpp/directives.c')
-rw-r--r-- | libcpp/directives.c | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/libcpp/directives.c b/libcpp/directives.c index d67cb5fd6d1..d9cf9d27204 100644 --- a/libcpp/directives.c +++ b/libcpp/directives.c @@ -2078,6 +2078,65 @@ cpp_undef (cpp_reader *pfile, const char *macro) run_directive (pfile, T_UNDEF, buf, len); } +/* Like lex_macro_node, but read the input from STR. */ +static cpp_hashnode * +lex_macro_node_from_str (cpp_reader *pfile, const char *str) +{ + size_t len = strlen (str); + uchar *buf = (char *) alloca (len + 1); + cpp_hashnode *node; + + memcpy (buf, str, len); + buf[len] = '\n'; + cpp_push_buffer (pfile, buf, len, true); + node = lex_macro_node (pfile, true); + _cpp_pop_buffer (pfile); + + return node; +} + +/* If STR is a defined macro, return its definition node, else return NULL. */ +cpp_macro * +cpp_push_definition (cpp_reader *pfile, const char *str) +{ + cpp_hashnode *node = lex_macro_node_from_str (pfile, str); + if (node && node->type == NT_MACRO) + return node->value.macro; + else + return NULL; +} + +/* Replace a previous definition DFN of the macro STR. If DFN is NULL, + then the macro should be undefined. */ +void +cpp_pop_definition (cpp_reader *pfile, const char *str, cpp_macro *dfn) +{ + cpp_hashnode *node = lex_macro_node_from_str (pfile, str); + if (node == NULL) + return; + + if (node->type == NT_MACRO) + { + if (pfile->cb.undef) + pfile->cb.undef (pfile, pfile->directive_line, node); + if (CPP_OPTION (pfile, warn_unused_macros)) + _cpp_warn_if_unused_macro (pfile, node, NULL); + } + if (node->type != NT_VOID) + _cpp_free_definition (node); + + if (dfn) + { + node->type = NT_MACRO; + node->value.macro = dfn; + if (! ustrncmp (NODE_NAME (node), DSC ("__STDC_"))) + node->flags |= NODE_WARN; + + if (pfile->cb.define) + pfile->cb.define (pfile, pfile->directive_line, node); + } +} + /* Process the string STR as if it appeared as the body of a #assert. */ void cpp_assert (cpp_reader *pfile, const char *str) |