diff options
Diffstat (limited to 'time')
-rw-r--r-- | time/strptime.c | 11 | ||||
-rw-r--r-- | time/time.h | 21 |
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 |