1b528cefcSMark Murray /* 2*ae771770SStanislav Sedov * Copyright (c) 1999 Kungliga Tekniska Högskolan 3b528cefcSMark Murray * (Royal Institute of Technology, Stockholm, Sweden). 4b528cefcSMark Murray * All rights reserved. 5b528cefcSMark Murray * 6b528cefcSMark Murray * Redistribution and use in source and binary forms, with or without 7b528cefcSMark Murray * modification, are permitted provided that the following conditions 8b528cefcSMark Murray * are met: 9b528cefcSMark Murray * 10b528cefcSMark Murray * 1. Redistributions of source code must retain the above copyright 11b528cefcSMark Murray * notice, this list of conditions and the following disclaimer. 12b528cefcSMark Murray * 13b528cefcSMark Murray * 2. Redistributions in binary form must reproduce the above copyright 14b528cefcSMark Murray * notice, this list of conditions and the following disclaimer in the 15b528cefcSMark Murray * documentation and/or other materials provided with the distribution. 16b528cefcSMark Murray * 17b528cefcSMark Murray * 3. Neither the name of KTH nor the names of its contributors may be 18b528cefcSMark Murray * used to endorse or promote products derived from this software without 19b528cefcSMark Murray * specific prior written permission. 20b528cefcSMark Murray * 21b528cefcSMark Murray * THIS SOFTWARE IS PROVIDED BY KTH AND ITS CONTRIBUTORS ``AS IS'' AND ANY 22b528cefcSMark Murray * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23b528cefcSMark Murray * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 24b528cefcSMark Murray * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL KTH OR ITS CONTRIBUTORS BE 25b528cefcSMark Murray * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 26b528cefcSMark Murray * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 27b528cefcSMark Murray * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 28b528cefcSMark Murray * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 29b528cefcSMark Murray * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 30b528cefcSMark Murray * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 31b528cefcSMark Murray * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ 32b528cefcSMark Murray 33b528cefcSMark Murray #include <config.h> 34*ae771770SStanislav Sedov #include <roken.h> 35c19800e8SDoug Rabson #ifdef TEST_STRPFTIME 36c19800e8SDoug Rabson #include "strpftime-test.h" 37c19800e8SDoug Rabson #endif 38b528cefcSMark Murray 39b528cefcSMark Murray enum { MAXSIZE = 26 }; 40b528cefcSMark Murray 41b528cefcSMark Murray static struct testcase { 42b528cefcSMark Murray time_t t; 43b528cefcSMark Murray struct { 44b528cefcSMark Murray const char *format; 45b528cefcSMark Murray const char *result; 46b528cefcSMark Murray } vals[MAXSIZE]; 47b528cefcSMark Murray } tests[] = { 48b528cefcSMark Murray {0, 49b528cefcSMark Murray { 50b528cefcSMark Murray {"%A", "Thursday"}, 51b528cefcSMark Murray {"%a", "Thu"}, 52b528cefcSMark Murray {"%B", "January"}, 53b528cefcSMark Murray {"%b", "Jan"}, 54b528cefcSMark Murray {"%C", "19"}, 55b528cefcSMark Murray {"%d", "01"}, 56b528cefcSMark Murray {"%e", " 1"}, 57b528cefcSMark Murray {"%H", "00"}, 58b528cefcSMark Murray {"%I", "12"}, 59b528cefcSMark Murray {"%j", "001"}, 60b528cefcSMark Murray {"%k", " 0"}, 61b528cefcSMark Murray {"%l", "12"}, 62b528cefcSMark Murray {"%M", "00"}, 63b528cefcSMark Murray {"%m", "01"}, 64b528cefcSMark Murray {"%n", "\n"}, 65b528cefcSMark Murray {"%p", "AM"}, 66b528cefcSMark Murray {"%S", "00"}, 67b528cefcSMark Murray {"%t", "\t"}, 68b528cefcSMark Murray {"%w", "4"}, 69b528cefcSMark Murray {"%Y", "1970"}, 70b528cefcSMark Murray {"%y", "70"}, 71b528cefcSMark Murray {"%U", "00"}, 72b528cefcSMark Murray {"%W", "00"}, 73b528cefcSMark Murray {"%V", "01"}, 74b528cefcSMark Murray {"%%", "%"}, 75b528cefcSMark Murray {NULL, NULL}} 76b528cefcSMark Murray }, 77b528cefcSMark Murray {90000, 78b528cefcSMark Murray { 79b528cefcSMark Murray {"%A", "Friday"}, 80b528cefcSMark Murray {"%a", "Fri"}, 81b528cefcSMark Murray {"%B", "January"}, 82b528cefcSMark Murray {"%b", "Jan"}, 83b528cefcSMark Murray {"%C", "19"}, 84b528cefcSMark Murray {"%d", "02"}, 85b528cefcSMark Murray {"%e", " 2"}, 86b528cefcSMark Murray {"%H", "01"}, 87b528cefcSMark Murray {"%I", "01"}, 88b528cefcSMark Murray {"%j", "002"}, 89b528cefcSMark Murray {"%k", " 1"}, 90b528cefcSMark Murray {"%l", " 1"}, 91b528cefcSMark Murray {"%M", "00"}, 92b528cefcSMark Murray {"%m", "01"}, 93b528cefcSMark Murray {"%n", "\n"}, 94b528cefcSMark Murray {"%p", "AM"}, 95b528cefcSMark Murray {"%S", "00"}, 96b528cefcSMark Murray {"%t", "\t"}, 97b528cefcSMark Murray {"%w", "5"}, 98b528cefcSMark Murray {"%Y", "1970"}, 99b528cefcSMark Murray {"%y", "70"}, 100b528cefcSMark Murray {"%U", "00"}, 101b528cefcSMark Murray {"%W", "00"}, 102b528cefcSMark Murray {"%V", "01"}, 103b528cefcSMark Murray {"%%", "%"}, 104b528cefcSMark Murray {NULL, NULL} 105b528cefcSMark Murray } 106b528cefcSMark Murray }, 107b528cefcSMark Murray {216306, 108b528cefcSMark Murray { 109b528cefcSMark Murray {"%A", "Saturday"}, 110b528cefcSMark Murray {"%a", "Sat"}, 111b528cefcSMark Murray {"%B", "January"}, 112b528cefcSMark Murray {"%b", "Jan"}, 113b528cefcSMark Murray {"%C", "19"}, 114b528cefcSMark Murray {"%d", "03"}, 115b528cefcSMark Murray {"%e", " 3"}, 116b528cefcSMark Murray {"%H", "12"}, 117b528cefcSMark Murray {"%I", "12"}, 118b528cefcSMark Murray {"%j", "003"}, 119b528cefcSMark Murray {"%k", "12"}, 120b528cefcSMark Murray {"%l", "12"}, 121b528cefcSMark Murray {"%M", "05"}, 122b528cefcSMark Murray {"%m", "01"}, 123b528cefcSMark Murray {"%n", "\n"}, 124b528cefcSMark Murray {"%p", "PM"}, 125b528cefcSMark Murray {"%S", "06"}, 126b528cefcSMark Murray {"%t", "\t"}, 127b528cefcSMark Murray {"%w", "6"}, 128b528cefcSMark Murray {"%Y", "1970"}, 129b528cefcSMark Murray {"%y", "70"}, 130b528cefcSMark Murray {"%U", "00"}, 131b528cefcSMark Murray {"%W", "00"}, 132b528cefcSMark Murray {"%V", "01"}, 133b528cefcSMark Murray {"%%", "%"}, 134b528cefcSMark Murray {NULL, NULL} 135b528cefcSMark Murray } 136b528cefcSMark Murray }, 137b528cefcSMark Murray {259200, 138b528cefcSMark Murray { 139b528cefcSMark Murray {"%A", "Sunday"}, 140b528cefcSMark Murray {"%a", "Sun"}, 141b528cefcSMark Murray {"%B", "January"}, 142b528cefcSMark Murray {"%b", "Jan"}, 143b528cefcSMark Murray {"%C", "19"}, 144b528cefcSMark Murray {"%d", "04"}, 145b528cefcSMark Murray {"%e", " 4"}, 146b528cefcSMark Murray {"%H", "00"}, 147b528cefcSMark Murray {"%I", "12"}, 148b528cefcSMark Murray {"%j", "004"}, 149b528cefcSMark Murray {"%k", " 0"}, 150b528cefcSMark Murray {"%l", "12"}, 151b528cefcSMark Murray {"%M", "00"}, 152b528cefcSMark Murray {"%m", "01"}, 153b528cefcSMark Murray {"%n", "\n"}, 154b528cefcSMark Murray {"%p", "AM"}, 155b528cefcSMark Murray {"%S", "00"}, 156b528cefcSMark Murray {"%t", "\t"}, 157b528cefcSMark Murray {"%w", "0"}, 158b528cefcSMark Murray {"%Y", "1970"}, 159b528cefcSMark Murray {"%y", "70"}, 160b528cefcSMark Murray {"%U", "01"}, 161b528cefcSMark Murray {"%W", "00"}, 162b528cefcSMark Murray {"%V", "01"}, 163b528cefcSMark Murray {"%%", "%"}, 164b528cefcSMark Murray {NULL, NULL} 165b528cefcSMark Murray } 166b528cefcSMark Murray }, 167b528cefcSMark Murray {915148800, 168b528cefcSMark Murray { 169b528cefcSMark Murray {"%A", "Friday"}, 170b528cefcSMark Murray {"%a", "Fri"}, 171b528cefcSMark Murray {"%B", "January"}, 172b528cefcSMark Murray {"%b", "Jan"}, 173b528cefcSMark Murray {"%C", "19"}, 174b528cefcSMark Murray {"%d", "01"}, 175b528cefcSMark Murray {"%e", " 1"}, 176b528cefcSMark Murray {"%H", "00"}, 177b528cefcSMark Murray {"%I", "12"}, 178b528cefcSMark Murray {"%j", "001"}, 179b528cefcSMark Murray {"%k", " 0"}, 180b528cefcSMark Murray {"%l", "12"}, 181b528cefcSMark Murray {"%M", "00"}, 182b528cefcSMark Murray {"%m", "01"}, 183b528cefcSMark Murray {"%n", "\n"}, 184b528cefcSMark Murray {"%p", "AM"}, 185b528cefcSMark Murray {"%S", "00"}, 186b528cefcSMark Murray {"%t", "\t"}, 187b528cefcSMark Murray {"%w", "5"}, 188b528cefcSMark Murray {"%Y", "1999"}, 189b528cefcSMark Murray {"%y", "99"}, 190b528cefcSMark Murray {"%U", "00"}, 191b528cefcSMark Murray {"%W", "00"}, 192b528cefcSMark Murray {"%V", "53"}, 193b528cefcSMark Murray {"%%", "%"}, 194b528cefcSMark Murray {NULL, NULL}} 195b528cefcSMark Murray }, 196b528cefcSMark Murray {942161105, 197b528cefcSMark Murray { 198b528cefcSMark Murray 199b528cefcSMark Murray {"%A", "Tuesday"}, 200b528cefcSMark Murray {"%a", "Tue"}, 201b528cefcSMark Murray {"%B", "November"}, 202b528cefcSMark Murray {"%b", "Nov"}, 203b528cefcSMark Murray {"%C", "19"}, 204b528cefcSMark Murray {"%d", "09"}, 205b528cefcSMark Murray {"%e", " 9"}, 206b528cefcSMark Murray {"%H", "15"}, 207b528cefcSMark Murray {"%I", "03"}, 208b528cefcSMark Murray {"%j", "313"}, 209b528cefcSMark Murray {"%k", "15"}, 210b528cefcSMark Murray {"%l", " 3"}, 211b528cefcSMark Murray {"%M", "25"}, 212b528cefcSMark Murray {"%m", "11"}, 213b528cefcSMark Murray {"%n", "\n"}, 214b528cefcSMark Murray {"%p", "PM"}, 215b528cefcSMark Murray {"%S", "05"}, 216b528cefcSMark Murray {"%t", "\t"}, 217b528cefcSMark Murray {"%w", "2"}, 218b528cefcSMark Murray {"%Y", "1999"}, 219b528cefcSMark Murray {"%y", "99"}, 220b528cefcSMark Murray {"%U", "45"}, 221b528cefcSMark Murray {"%W", "45"}, 222b528cefcSMark Murray {"%V", "45"}, 223b528cefcSMark Murray {"%%", "%"}, 224b528cefcSMark Murray {NULL, NULL} 225b528cefcSMark Murray } 226b528cefcSMark Murray } 227b528cefcSMark Murray }; 228b528cefcSMark Murray 229b528cefcSMark Murray int 230b528cefcSMark Murray main(int argc, char **argv) 231b528cefcSMark Murray { 232b528cefcSMark Murray int i, j; 233b528cefcSMark Murray int ret = 0; 234b528cefcSMark Murray 235b528cefcSMark Murray for (i = 0; i < sizeof(tests)/sizeof(tests[0]); ++i) { 236b528cefcSMark Murray struct tm *tm; 237b528cefcSMark Murray 238b528cefcSMark Murray tm = gmtime (&tests[i].t); 239b528cefcSMark Murray 240b528cefcSMark Murray for (j = 0; tests[i].vals[j].format != NULL; ++j) { 241b528cefcSMark Murray char buf[128]; 242b528cefcSMark Murray size_t len; 243b528cefcSMark Murray struct tm tm2; 244b528cefcSMark Murray char *ptr; 245b528cefcSMark Murray 246b528cefcSMark Murray len = strftime (buf, sizeof(buf), tests[i].vals[j].format, tm); 247b528cefcSMark Murray if (len != strlen (buf)) { 248c19800e8SDoug Rabson printf ("length of strftime(\"%s\") = %lu (\"%s\")\n", 249c19800e8SDoug Rabson tests[i].vals[j].format, (unsigned long)len, 250b528cefcSMark Murray buf); 251b528cefcSMark Murray ++ret; 252b528cefcSMark Murray continue; 253b528cefcSMark Murray } 254b528cefcSMark Murray if (strcmp (buf, tests[i].vals[j].result) != 0) { 255b528cefcSMark Murray printf ("result of strftime(\"%s\") = \"%s\" != \"%s\"\n", 256b528cefcSMark Murray tests[i].vals[j].format, buf, 257b528cefcSMark Murray tests[i].vals[j].result); 258b528cefcSMark Murray ++ret; 259b528cefcSMark Murray continue; 260b528cefcSMark Murray } 261b528cefcSMark Murray memset (&tm2, 0, sizeof(tm2)); 262b528cefcSMark Murray ptr = strptime (tests[i].vals[j].result, 263b528cefcSMark Murray tests[i].vals[j].format, 264b528cefcSMark Murray &tm2); 265b528cefcSMark Murray if (ptr == NULL || *ptr != '\0') { 266b528cefcSMark Murray printf ("bad return value from strptime(" 267b528cefcSMark Murray "\"%s\", \"%s\")\n", 268b528cefcSMark Murray tests[i].vals[j].result, 269b528cefcSMark Murray tests[i].vals[j].format); 270b528cefcSMark Murray ++ret; 271b528cefcSMark Murray } 272b528cefcSMark Murray strftime (buf, sizeof(buf), tests[i].vals[j].format, &tm2); 273b528cefcSMark Murray if (strcmp (buf, tests[i].vals[j].result) != 0) { 274b528cefcSMark Murray printf ("reverse of \"%s\" failed: \"%s\" vs \"%s\"\n", 275b528cefcSMark Murray tests[i].vals[j].format, 276b528cefcSMark Murray buf, tests[i].vals[j].result); 277b528cefcSMark Murray ++ret; 278b528cefcSMark Murray } 279b528cefcSMark Murray } 280b528cefcSMark Murray } 281c19800e8SDoug Rabson { 282c19800e8SDoug Rabson struct tm tm; 283c19800e8SDoug Rabson memset(&tm, 0, sizeof(tm)); 284c19800e8SDoug Rabson strptime ("200505", "%Y%m", &tm); 285c19800e8SDoug Rabson if (tm.tm_year != 105) 286c19800e8SDoug Rabson ++ret; 287c19800e8SDoug Rabson if (tm.tm_mon != 4) 288c19800e8SDoug Rabson ++ret; 289c19800e8SDoug Rabson } 290b528cefcSMark Murray if (ret) { 291b528cefcSMark Murray printf ("%d errors\n", ret); 292b528cefcSMark Murray return 1; 293b528cefcSMark Murray } else 294b528cefcSMark Murray return 0; 295b528cefcSMark Murray } 296