#define _XOPEN_SOURCE #include #include #define VERIFY(x) if (!(x)) printf ("%d %s failed\n", __LINE__, #x) int main () { const char *str, *format; char *ret; struct tm time; /* PR78714 tests */ str = "Mon"; format = "%a"; ret = strptime (str, format, &time); VERIFY( ret && *ret == '\0' ); VERIFY( time.tm_wday == 1 ); str = "Tue "; format = "%a"; ret = strptime (str, format, &time); VERIFY( ret != NULL && *ret == ' ' ); VERIFY( time.tm_wday == 2 ); str = "Wednesday"; format = "%a"; ret = strptime (str, format, &time); VERIFY( ret && *ret == '\0' ); VERIFY( time.tm_wday == 3 ); str = "Thu"; format = "%A"; ret = strptime (str, format, &time); VERIFY( ret && *ret == '\0' ); VERIFY( time.tm_wday == 4 ); str = "Fri "; format = "%A"; ret = strptime (str, format, &time); VERIFY( ret != NULL && *ret == ' ' ); VERIFY( time.tm_wday == 5 ); str = "Saturday"; format = "%A"; ret = strptime (str, format, &time); VERIFY( ret && *ret == '\0' ); VERIFY( time.tm_wday == 6 ); str = "Feb"; format = "%b"; ret = strptime (str, format, &time); VERIFY( ret && *ret == '\0' ); VERIFY( time.tm_mon == 1 ); str = "Mar "; format = "%b"; ret = strptime (str, format, &time); VERIFY( ret != NULL && *ret == ' ' ); VERIFY( time.tm_mon == 2 ); str = "April"; format = "%b"; ret = strptime (str, format, &time); VERIFY( ret && *ret == '\0' ); VERIFY( time.tm_mon == 3 ); str = "May"; format = "%B"; ret = strptime (str, format, &time); VERIFY( ret && *ret == '\0' ); VERIFY( time.tm_mon == 4 ); str = "Jun "; format = "%B"; ret = strptime (str, format, &time); VERIFY( ret != NULL && *ret == ' ' ); VERIFY( time.tm_mon == 5 ); str = "July"; format = "%B"; ret = strptime (str, format, &time); VERIFY( ret && *ret == '\0' ); VERIFY( time.tm_mon == 6 ); str = "Aug"; format = "%h"; ret = strptime (str, format, &time); VERIFY( ret && *ret == '\0' ); VERIFY( time.tm_mon == 7 ); str = "May "; format = "%h"; ret = strptime (str, format, &time); VERIFY( ret != NULL && *ret == ' ' ); VERIFY( time.tm_mon == 4 ); str = "October"; format = "%h"; ret = strptime (str, format, &time); VERIFY( ret && *ret == '\0' ); VERIFY( time.tm_mon == 9 ); /* Other tests. */ str = " 1."; format = "%d."; ret = strptime (str, format, &time); VERIFY( ret && *ret == '\0' ); VERIFY( time.tm_mday == 1 ); str = "2."; format = "%d."; ret = strptime (str, format, &time); VERIFY( ret && *ret == '\0' ); VERIFY( time.tm_mday == 2 ); str = "03."; format = "%d."; ret = strptime (str, format, &time); VERIFY( ret && *ret == '\0' ); VERIFY( time.tm_mday == 3 ); str = "0."; format = "%d."; ret = strptime (str, format, &time); VERIFY( ret == NULL ); str = "32."; format = "%d."; ret = strptime (str, format, &time); VERIFY( ret == NULL ); str = " 4."; format = "%e."; ret = strptime (str, format, &time); VERIFY( ret && *ret == '\0' ); VERIFY( time.tm_mday == 4 ); str = "5."; format = "%e."; ret = strptime (str, format, &time); VERIFY( ret && *ret == '\0' ); VERIFY( time.tm_mday == 5 ); str = "06."; format = "%e."; ret = strptime (str, format, &time); VERIFY( ret && *ret == '\0' ); VERIFY( time.tm_mday == 6 ); str = "0"; format = "%e"; ret = strptime (str, format, &time); VERIFY( ret == NULL ); str = "35"; format = "%e"; ret = strptime (str, format, &time); VERIFY( ret == NULL ); str = " \t\t 02"; format = "%t%m"; ret = strptime (str, format, &time); VERIFY( ret && *ret == '\0' ); VERIFY( time.tm_mon == 1 ); str = " \t \t 03"; format = "%n%m"; ret = strptime (str, format, &time); VERIFY( ret && *ret == '\0' ); VERIFY( time.tm_mon == 2 ); str = " \t \t 4"; format = " %m"; ret = strptime (str, format, &time); VERIFY( ret && *ret == '\0' ); VERIFY( time.tm_mon == 3 ); str = " \t \t 5"; format = "\t%m"; ret = strptime (str, format, &time); VERIFY( ret && *ret == '\0' ); VERIFY( time.tm_mon == 4 ); str = "12:00AM"; format = "%I:%M%p"; ret = strptime (str, format, &time); VERIFY( ret && *ret == '\0' ); VERIFY( time.tm_hour == 0 ); VERIFY( time.tm_min == 0 ); str = "12:37AM"; format = "%I:%M%p"; ret = strptime (str, format, &time); VERIFY( ret && *ret == '\0' ); VERIFY( time.tm_hour == 0 ); VERIFY( time.tm_min == 37 ); str = "01:25AM"; format = "%I:%M%p"; ret = strptime (str, format, &time); VERIFY( ret && *ret == '\0' ); VERIFY( time.tm_hour == 1 ); VERIFY( time.tm_min == 25 ); str = "12:00PM"; format = "%I:%M%p"; ret = strptime (str, format, &time); VERIFY( ret && *ret == '\0' ); VERIFY( time.tm_hour == 12 ); VERIFY( time.tm_min == 0 ); str = "12:42PM"; format = "%I:%M%p"; ret = strptime (str, format, &time); VERIFY( ret && *ret == '\0' ); VERIFY( time.tm_hour == 12 ); VERIFY( time.tm_min == 42 ); str = "07:23PM"; format = "%I:%M%p"; ret = strptime (str, format, &time); VERIFY( ret && *ret == '\0' ); VERIFY( time.tm_hour == 19 ); VERIFY( time.tm_min == 23 ); str = "17%20"; format = "%H%%%M"; ret = strptime (str, format, &time); VERIFY( ret && *ret == '\0' ); VERIFY( time.tm_hour == 17 ); VERIFY( time.tm_min == 20 ); str = "24:30"; format = "%H:%M"; ret = strptime (str, format, &time); VERIFY( ret == NULL ); /* This one behaves differently from strptime, in a single pass scaning we can't go back. */ str = "Novembur"; format = "%bembur"; ret = strptime (str, format, &time); VERIFY( ret != NULL && *ret == '\0' ); return 0; }