Commit be8ac3e2 by Grigory Zagorodnev Committed by Marcin Dalecki

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
parent 8d08b2d7
2006-02-17 Grigory Zagorodnev <grigory_zagorodnev@linux.intel.com>
* doc/cpp.texi (__TIMESTAMP__): Document.
2006-02-17 Roger Sayle <roger@eyesopen.com> 2006-02-17 Roger Sayle <roger@eyesopen.com>
PR middle-end/25600 PR middle-end/25600
......
...@@ -2128,6 +2128,17 @@ use. ...@@ -2128,6 +2128,17 @@ use.
This macro is defined, with value 2, when @option{-fstack-protector-all} is This macro is defined, with value 2, when @option{-fstack-protector-all} is
in use. in use.
@item __TIMESTAMP__
This macro expands to a string constant that describes the date and time
of the last modification of the current source file. The string constant
contains abbreviated day of the week, month, day of the month, time in
hh:mm:ss form, year and looks like @code{@w{"Sun Sep 16 01:03:52 1973"}}.
If the day of the month is less than 10, it is padded with a space on the left.
If GCC cannot determine the current date, it will emit a warning message
(once per compilation) and @code{__TIMESTAMP__} will expand to
@code{@w{"??? ??? ?? ??:??:?? ????"}}.
@end table @end table
@node System-specific Predefined Macros @node System-specific Predefined Macros
......
2006-02-17 Grigory Zagorodnev <grigory_zagorodnev@linux.intel.com>
* gcc.dg/cpp/undef3.c: New test.
* gcc.dg/cpp/trad/builtins2.c: New test.
2006-02-18 Mark Mitchell <mark@codesourcery.com> 2006-02-18 Mark Mitchell <mark@codesourcery.com>
PR c++/26266 PR c++/26266
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> 2006-01-23 Jakub Jelinek <jakub@redhat.com>
PR preprocessor/25717 PR preprocessor/25717
......
...@@ -1147,6 +1147,13 @@ _cpp_pop_file_buffer (cpp_reader *pfile, _cpp_file *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 /* Set the include chain for "" to QUOTE, for <> to BRACKET. If
QUOTE_IGNORES_SOURCE_DIR, then "" includes do not look in the QUOTE_IGNORES_SOURCE_DIR, then "" includes do not look in the
directory of the including file. directory of the including file.
......
...@@ -555,7 +555,8 @@ enum builtin_type ...@@ -555,7 +555,8 @@ enum builtin_type
BT_INCLUDE_LEVEL, /* `__INCLUDE_LEVEL__' */ BT_INCLUDE_LEVEL, /* `__INCLUDE_LEVEL__' */
BT_TIME, /* `__TIME__' */ BT_TIME, /* `__TIME__' */
BT_STDC, /* `__STDC__' */ BT_STDC, /* `__STDC__' */
BT_PRAGMA /* `_Pragma' operator */ BT_PRAGMA, /* `_Pragma' operator */
BT_TIMESTAMP /* `__TIMESTAMP__' */
}; };
#define CPP_HASHNODE(HNODE) ((cpp_hashnode *) (HNODE)) #define CPP_HASHNODE(HNODE) ((cpp_hashnode *) (HNODE))
......
...@@ -301,6 +301,7 @@ struct builtin ...@@ -301,6 +301,7 @@ struct builtin
#define B(n, t) { DSC(n), t } #define B(n, t) { DSC(n), t }
static const struct builtin builtin_array[] = static const struct builtin builtin_array[] =
{ {
B("__TIMESTAMP__", BT_TIMESTAMP),
B("__TIME__", BT_TIME), B("__TIME__", BT_TIME),
B("__DATE__", BT_DATE), B("__DATE__", BT_DATE),
B("__FILE__", BT_FILE), B("__FILE__", BT_FILE),
......
...@@ -264,6 +264,10 @@ struct cpp_buffer ...@@ -264,6 +264,10 @@ struct cpp_buffer
Used for include_next and to record control macros. */ Used for include_next and to record control macros. */
struct _cpp_file *file; 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. /* Value of if_stack at start of this file.
Used to prohibit unmatched #endif (etc) in an include file. */ Used to prohibit unmatched #endif (etc) in an include file. */
struct if_stack *if_stack; struct if_stack *if_stack;
...@@ -524,6 +528,7 @@ extern void _cpp_cleanup_files (cpp_reader *); ...@@ -524,6 +528,7 @@ extern void _cpp_cleanup_files (cpp_reader *);
extern void _cpp_pop_file_buffer (cpp_reader *, struct _cpp_file *); 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_save_file_entries (cpp_reader *pfile, FILE *f);
extern bool _cpp_read_file_entries (cpp_reader *, FILE *); extern bool _cpp_read_file_entries (cpp_reader *, FILE *);
extern struct stat *_cpp_get_file_stat (_cpp_file *);
/* In expr.c */ /* In expr.c */
extern bool _cpp_parse_expr (cpp_reader *); extern bool _cpp_parse_expr (cpp_reader *);
......
...@@ -123,6 +123,44 @@ _cpp_builtin_macro_text (cpp_reader *pfile, cpp_hashnode *node) ...@@ -123,6 +123,44 @@ _cpp_builtin_macro_text (cpp_reader *pfile, cpp_hashnode *node)
NODE_NAME (node)); NODE_NAME (node));
break; 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_FILE:
case BT_BASE_FILE: case BT_BASE_FILE:
{ {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment