cpp.texi (__TIMESTAMP__): Document.

2006-02-17  Grigory Zagorodnev <grigory_zagorodnev@linux.intel.com>

gcc/ChangeLog:
     * doc/cpp.texi (__TIMESTAMP__): Document.

libcpp/ChangeLog:
     * macro.c (_cpp_builtin_macro_text): Handle BT_TIMESTAMP.
     * files.c (_cpp_get_file_stat): New function.
     * include/cpplib.h (builtin_type): Add BT_TIMESTAMP.
     * init.c (builtin_array): Add support for __TIMESTAMP__/BT_TIMESTAMP.
     * internal.h (_cpp_get_file_stat): Prototype.
     (struct cpp_buffer): Add timestamp.

gcc/testsuite/ChangeLog:
     * gcc.dg/cpp/undef3.c: New test.
     * gcc.dg/cpp/trad/builtins2.c: New test.

From-SVN: r111232
This commit is contained in:
Grigory Zagorodnev 2006-02-18 09:25:31 +00:00 committed by Marcin Dalecki
parent 8d08b2d786
commit be8ac3e243
9 changed files with 82 additions and 1 deletions

View file

@ -1,3 +1,12 @@
2006-02-17 Grigory Zagorodnev <grigory_zagorodnev@linux.intel.com>
* macro.c (_cpp_builtin_macro_text): Handle BT_TIMESTAMP.
* files.c (_cpp_get_file_stat): New function.
* include/cpplib.h (builtin_type): Add BT_TIMESTAMP.
* init.c (builtin_array): Add support for __TIMESTAMP__/BT_TIMESTAMP.
* internal.h (_cpp_get_file_stat): Prototype.
(struct cpp_buffer): Add timestamp.
2006-01-23 Jakub Jelinek <jakub@redhat.com>
PR preprocessor/25717

View file

@ -1147,6 +1147,13 @@ _cpp_pop_file_buffer (cpp_reader *pfile, _cpp_file *file)
}
}
/* Inteface to file statistics record in _cpp_file structure. */
struct stat *
_cpp_get_file_stat (_cpp_file *file)
{
return &file->st;
}
/* Set the include chain for "" to QUOTE, for <> to BRACKET. If
QUOTE_IGNORES_SOURCE_DIR, then "" includes do not look in the
directory of the including file.

View file

@ -555,7 +555,8 @@ enum builtin_type
BT_INCLUDE_LEVEL, /* `__INCLUDE_LEVEL__' */
BT_TIME, /* `__TIME__' */
BT_STDC, /* `__STDC__' */
BT_PRAGMA /* `_Pragma' operator */
BT_PRAGMA, /* `_Pragma' operator */
BT_TIMESTAMP /* `__TIMESTAMP__' */
};
#define CPP_HASHNODE(HNODE) ((cpp_hashnode *) (HNODE))

View file

@ -301,6 +301,7 @@ struct builtin
#define B(n, t) { DSC(n), t }
static const struct builtin builtin_array[] =
{
B("__TIMESTAMP__", BT_TIMESTAMP),
B("__TIME__", BT_TIME),
B("__DATE__", BT_DATE),
B("__FILE__", BT_FILE),

View file

@ -264,6 +264,10 @@ struct cpp_buffer
Used for include_next and to record control macros. */
struct _cpp_file *file;
/* Saved value of __TIMESTAMP__ macro - date and time of last modification
of the assotiated file. */
const unsigned char *timestamp;
/* Value of if_stack at start of this file.
Used to prohibit unmatched #endif (etc) in an include file. */
struct if_stack *if_stack;
@ -524,6 +528,7 @@ extern void _cpp_cleanup_files (cpp_reader *);
extern void _cpp_pop_file_buffer (cpp_reader *, struct _cpp_file *);
extern bool _cpp_save_file_entries (cpp_reader *pfile, FILE *f);
extern bool _cpp_read_file_entries (cpp_reader *, FILE *);
extern struct stat *_cpp_get_file_stat (_cpp_file *);
/* In expr.c */
extern bool _cpp_parse_expr (cpp_reader *);

View file

@ -123,6 +123,44 @@ _cpp_builtin_macro_text (cpp_reader *pfile, cpp_hashnode *node)
NODE_NAME (node));
break;
case BT_TIMESTAMP:
{
cpp_buffer *pbuffer = cpp_get_buffer (pfile);
if (pbuffer->timestamp == NULL)
{
/* Initialize timestamp value of the assotiated file. */
struct _cpp_file *file = cpp_get_file (pbuffer);
if (file)
{
/* Generate __TIMESTAMP__ string, that represents
the date and time of the last modification
of the current source file. The string constant
looks like "Sun Sep 16 01:03:52 1973". */
struct tm *tb = NULL;
struct stat *st = _cpp_get_file_stat (file);
if (st)
tb = localtime (&st->st_mtime);
if (tb)
{
char *str = asctime (tb);
size_t len = strlen (str);
unsigned char *buf = _cpp_unaligned_alloc (pfile, len + 2);
buf[0] = '"';
strcpy ((char *) buf + 1, str);
buf[len] = '"';
pbuffer->timestamp = buf;
}
else
{
cpp_errno (pfile, CPP_DL_WARNING,
"could not determine file timestamp");
pbuffer->timestamp = U"\"??? ??? ?? ??:??:?? ????\"";
}
}
}
result = pbuffer->timestamp;
}
break;
case BT_FILE:
case BT_BASE_FILE:
{