/* BZ #5451 */ #include <time.h> #include <stdio.h> #include <stdlib.h> static char *templ_filename; // Writes template given as parameter to file, // specified as the argument static void output_to_template_file (const char *str) { FILE *fd = fopen (templ_filename, "w"); if (fd == NULL) { printf ("Can not open file for writing\n"); exit (1); } fprintf (fd, "%s\n", str); fclose (fd); } // Calls getdate() function with specified parameter, // specified as the argument, also checks the contents of // file with template and prints the result static int process_getdate_on (const char *str) { struct tm *res; char templ[1000]; FILE *fd = fopen (templ_filename, "r"); if (fd == NULL) { printf ("Can not open file for reading\n"); exit (1); } if (fgets (templ, 1000, fd) == NULL) { printf ("Can not read file\n"); exit (1); } fclose (fd); res = getdate (str); if (res == NULL) { printf ("Failed on getdate(\"%s\"), template is: %s", str, templ); printf ("Error number: %d\n\n", getdate_err); return 1; } printf ("Success on getdate(\"%s\"), template is: %s\n", str, templ); printf ("Result is\n"); printf ("Seconds: %d\n", res->tm_sec); printf ("Minutes: %d\n", res->tm_min); printf ("Hour: %d\n", res->tm_hour); printf ("Day of month: %d\n", res->tm_mday); printf ("Month of year: %d\n", res->tm_mon); printf ("Years since 1900: %d\n", res->tm_year); printf ("Day of week: %d\n", res->tm_wday); printf ("Day of year: %d\n", res->tm_yday); printf ("Daylight Savings flag: %d\n\n", res->tm_isdst); return 0; } static int do_test (int argc, char *argv[]) { templ_filename = argv[1]; setenv ("DATEMSK", templ_filename, 1); /* * The following 4 testcases reproduce the problem: * 1. Templates "%S" and "%M" are not processed, * when used without "%H" template */ int res = 0; output_to_template_file ("%M"); res |= process_getdate_on ("1"); output_to_template_file ("%M %H"); res |= process_getdate_on ("1 2"); output_to_template_file ("%S"); res |= process_getdate_on ("1"); output_to_template_file ("%S %H"); res |= process_getdate_on ("1 2"); /* * The following 9 testcases reproduce the problem: * 2. Templates "%Y", "%y", "%d", "%C", "%C %y" * are not processed separately */ output_to_template_file ("%Y"); process_getdate_on ("2001"); output_to_template_file ("%Y %m"); res |= process_getdate_on ("2001 3"); output_to_template_file ("%y"); res |= process_getdate_on ("70"); output_to_template_file ("%y %m"); res |= process_getdate_on ("70 3"); output_to_template_file ("%d"); res |= process_getdate_on ("06"); output_to_template_file ("%d %m"); res |= process_getdate_on ("25 3"); output_to_template_file ("%C"); res |= process_getdate_on ("20"); output_to_template_file ("%C %y %m"); res |= process_getdate_on ("20 3 2"); output_to_template_file ("%C %y"); res |= process_getdate_on ("20 5"); /* * The following testcase reproduces the problem: * 3. When template is "%Y %m", day of month is not set * to 1 as standard requires */ output_to_template_file ("%Y %m"); res |= process_getdate_on ("2008 3"); return res; } #define PREPARE(argc, argv) \ if (argc < 2) \ { \ puts ("Command line: progname template_filename_full_path"); \ exit (1); \ } \ add_temp_file (argv[1]) #define TEST_FUNCTION do_test (argc, argv) #include "../test-skeleton.c"