| /* 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" |