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:
parent
8d08b2d786
commit
be8ac3e243
9 changed files with 82 additions and 1 deletions
|
@ -1,3 +1,7 @@
|
||||||
|
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.
|
||||||
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
|
||||||
|
|
|
@ -1,3 +1,8 @@
|
||||||
|
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
|
||||||
|
|
|
@ -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>
|
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)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* 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
|
||||||
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
|
||||||
#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
|
||||||
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 *);
|
||||||
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)
|
||||||
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:
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue