+static int
+parse_date_field(const char *str_to_parse, int str_to_parse_s, int start_pos,
+ char *dest, int *next_pos)
+{
+ unsigned char found_value = 0;
+ unsigned char found_column = 0;
+ int i;
+
+ for (i=0; i<2; i++)
+ {
+ if ((i+start_pos) >= str_to_parse_s) /* don't exit boundaries of the string.. */
+ break;
+ if (str_to_parse[i+start_pos] == ':')
+ found_column = 1;
+ else
+ {
+ found_value = 1;
+ dest[i] = str_to_parse[i+start_pos];
+ }
+ }
+ if (found_value == 0)
+ return 0;
+ *next_pos = i + start_pos;
+ if (found_column == 0)
+ ++(*next_pos);
+ return 1;
+}
+
+static int
+split_date(char *year, char *month, char *day,
+ char *hour, char *minute, char *second,
+ const char *str_to_parse)
+{
+ int i;
+ unsigned char found_column = 0;
+ int str_to_parse_s = strlen(str_to_parse);
+
+ /* Check the length of the string */
+ if ((str_to_parse_s > 19) || /* YYYY:MM:DD:HH:MM:SS */
+ (str_to_parse_s < 4)) /* YYYY*/
+ return 0;
+
+ /* Clear the buffers */
+ memset(year, 0, 4);
+ memset(month, 0, 2);
+ memset(day, 0, 2);
+ memset(hour, 0, 2);
+ memset(minute, 0, 2);
+ memset(second, 0, 2);
+
+ /* parse the year YYYY */
+ found_column = 0;
+ for (i=0; i<5; i++)
+ {
+ if (i >= str_to_parse_s)
+ break;
+ if (str_to_parse[i] == ':')
+ {
+ found_column = 1;
+ break;
+ }
+ else
+ year[i] = str_to_parse[i];
+ }
+ if (found_column == 1)
+ ++i;
+
+ /* parse the month if it exists */
+ if (! parse_date_field(str_to_parse, str_to_parse_s, i, month, &i))
+ return 1;
+
+ if (! parse_date_field(str_to_parse, str_to_parse_s, i, day, &i))
+ return 1;
+
+ if (! parse_date_field(str_to_parse, str_to_parse_s, i, hour, &i))
+ return 1;
+
+ if (! parse_date_field(str_to_parse, str_to_parse_s, i, minute, &i))
+ return 1;
+
+ parse_date_field(str_to_parse, str_to_parse_s, i, second, &i);
+
+ /* if we are here, format should be ok. */
+ return 1;
+}
+
+static time_t
+parse_date_string(const char *str_to_parse)
+{
+ char year[5];
+ char month[3];
+ char day[3];
+ char hour[3];
+ char minute[3];
+ char second[3];
+ struct tm t;
+ time_t temp_time;
+
+ memset(year, 0, 5);
+ memset(month, 0, 3);
+ memset(day, 0, 3);
+ memset(hour, 0, 3);
+ memset(minute, 0, 3);
+ memset(second, 0, 3);
+
+ if (split_date(year, month, day, hour, minute, second, str_to_parse) == 1)
+ {
+ memset((void *)&t, 0, sizeof(struct tm));
+ t.tm_isdst = -1;
+ t.tm_mday = 1;
+ if (!((parse_number(year, 1900, 2037, &(t.tm_year)) == -1) ||
+ (parse_number(month, 1, 12, &(t.tm_mon)) == -1) ||
+ (parse_number(day, 1, 31, &(t.tm_mday)) == -1) ||
+ (parse_number(hour, 0, 9999, &(t.tm_hour)) == -1) ||
+ (parse_number(minute, 0, 59, &(t.tm_min)) == -1) ||
+ (parse_number(second, 0, 59, &(t.tm_sec)) == -1)))
+ {
+ t.tm_year -= 1900;
+ --(t.tm_mon);
+ temp_time = mktime(&t);
+ if (temp_time != -1)
+ return temp_time;
+ }
+ }
+ exit_error(PARAMETER_PROBLEM,
+ "invalid date `%s' specified, should be YYYY[:MM[:DD[:hh[:mm[:ss]]]]] format", str_to_parse);
+}
+