cpp.texi (__TIMESTAMP__): Document.
authorGrigory Zagorodnev <grigory_zagorodnev@linux.intel.com>
Sat, 18 Feb 2006 09:25:31 +0000 (09:25 +0000)
committerMarcin Dalecki <dalecki@gcc.gnu.org>
Sat, 18 Feb 2006 09:25:31 +0000 (10:25 +0100)
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

gcc/ChangeLog
gcc/doc/cpp.texi
gcc/testsuite/ChangeLog
libcpp/ChangeLog
libcpp/files.c
libcpp/include/cpplib.h
libcpp/init.c
libcpp/internal.h
libcpp/macro.c

index 9acf0ac..0025c6c 100644 (file)
@@ -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>
 
        PR middle-end/25600
index c019adb..e693942 100644 (file)
@@ -2128,6 +2128,17 @@ use.
 This macro is defined, with value 2, when @option{-fstack-protector-all} is
 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
 
 @node System-specific Predefined Macros
index b8ea9f0..08b1d2d 100644 (file)
@@ -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>
 
        PR c++/26266
index 3a4885f..3b42cc1 100644 (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
index 31c38d0..8334218 100644 (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.
index f1b5eab..2cea1f5 100644 (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))
index bf4c34c..4330f88 100644 (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),
index 8ac1103..857bfe1 100644 (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 *);
index 3204e55..67e936e 100644 (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:
       {