aboutsummaryrefslogtreecommitdiff
path: root/time
diff options
context:
space:
mode:
Diffstat (limited to 'time')
-rw-r--r--time/strptime.c11
-rw-r--r--time/time.h21
2 files changed, 22 insertions, 10 deletions
diff --git a/time/strptime.c b/time/strptime.c
index d126b14616..a26da5a88c 100644
--- a/time/strptime.c
+++ b/time/strptime.c
@@ -203,10 +203,13 @@ strptime_internal (buf, format, tm, decided)
int cnt;
size_t val;
int have_I, is_pm;
+ int century, want_century;
rp = buf;
fmt = format;
have_I = is_pm = 0;
+ century = -1;
+ want_century = 0;
while (*fmt != '\0')
{
@@ -343,7 +346,7 @@ strptime_internal (buf, format, tm, decided)
case 'C':
/* Match century number. */
get_number (0, 99);
- /* We don't need the number. */
+ century = val;
break;
case 'd':
case 'e':
@@ -548,11 +551,14 @@ strptime_internal (buf, format, tm, decided)
/* The "Year 2000 :The Millennium Rollover" paper suggests that
values in the range 69-99 refer to the twentieth century. */
tm->tm_year = val >= 69 ? val : val + 100;
+ /* Indicate that we want to use the century, if specified
+ want_century = 1;
break;
case 'Y':
/* Match year including century number. */
get_number (0, 9999);
tm->tm_year = val - 1900;
+ want_century = 0;
break;
case 'Z':
/* XXX How to handle this? */
@@ -725,6 +731,9 @@ strptime_internal (buf, format, tm, decided)
if (have_I && is_pm)
tm->tm_hour += 12;
+ if (want_century && century != -1)
+ tm->tm_year = tm->tm_year % 100 + (century - 19) * 100;
+
return (char *) rp;
}
diff --git a/time/time.h b/time/time.h
index 374885290a..08b1da244c 100644
--- a/time/time.h
+++ b/time/time.h
@@ -214,15 +214,15 @@ extern struct tm *localtime __P ((__const time_t *__timer));
# if defined __USE_POSIX || defined __USE_MISC
/* Return the `struct tm' representation of *TIMER in UTC,
using *TP to store the result. */
-extern struct tm *__gmtime_r __P ((__const time_t *__timer,
- struct tm *__tp));
-extern struct tm *gmtime_r __P ((__const time_t *__timer,
- struct tm *__tp));
+extern struct tm *__gmtime_r __P ((__const time_t *__restrict __timer,
+ struct tm *__restrict __tp));
+extern struct tm *gmtime_r __P ((__const time_t *__restrict __timer,
+ struct tm *__restrict __tp));
/* Return the `struct tm' representation of *TIMER in local time,
using *TP to store the result. */
-extern struct tm *localtime_r __P ((__const time_t *__timer,
- struct tm *__tp));
+extern struct tm *localtime_r __P ((__const time_t *__restrict __timer,
+ struct tm *__restrict __tp));
# endif /* POSIX or misc */
/* Return a string of the form "Day Mon dd hh:mm:ss yyyy\n"
@@ -237,10 +237,12 @@ extern char *ctime __P ((__const time_t *__timer));
/* Return in BUF a string of the form "Day Mon dd hh:mm:ss yyyy\n"
that is the representation of TP in this format. */
-extern char *asctime_r __P ((__const struct tm *__tp, char *__buf));
+extern char *asctime_r __P ((__const struct tm *__restrict __tp,
+ char *__restrict __buf));
/* Equivalent to `asctime_r (localtime_r (timer, *TMP*), buf)'. */
-extern char *ctime_r __P ((__const time_t *__timer, char *__buf));
+extern char *ctime_r __P ((__const time_t *__restrict __timer,
+ char *__restrict __buf));
# endif /* POSIX or misc */
@@ -326,7 +328,8 @@ extern struct tm *getdate __P ((__const char *__string));
variant. The functionality is the same. The result is returned in
the buffer pointed to by RESBUFP and in case of an error the return
value is != 0 with the same values as given above for `getdate_err'. */
-extern int getdate_r __P ((__const char *__string, struct tm *__resbufp));
+extern int getdate_r __P ((__const char *__restrict __string,
+ struct tm *__restrict __resbufp));
# endif