7 #define SIZE 128 // default buffer size for generated dates
9 static const char *
ERROR_DATE =
"\?\?-\?\?\?-\?\?\?\?";
11 static const char *
MON[12] = {
18 static const char *
Month[12] = {
19 "January",
"February",
"March",
20 "April",
"May",
"June",
21 "July",
"August",
"September",
22 "October",
"November",
"December"
27 31, 29, 31, 30, 31, 30,
28 31, 31, 30, 31, 30, 31
34 for (
const char *d = strchr(str, determ); d; d = strchr(d+1, determ)) count++;
40 for (
int i = 0; i<12; i++) {
52 if (
two_char(date_string,
'.')) determ =
'.';
53 else if (
two_char(date_string,
'/')) determ =
'/';
54 else if (
two_char(date_string,
'-')) determ =
'-';
56 if (determ ==
' ')
return false;
59 int nums[3] = { 0, 0, 0 };
64 for (
int indi = 0; indi <= len; indi++) {
65 if (date_string[indi] == determ || indi == len) {
66 token[index++] =
'\0';
71 nums[count++] = atoi(token);
76 token[index++] = date_string[indi];
92 if (length > 4 || length < 1)
94 for (indi = 0, num = 1; indi < length && num == 1; indi++) {
95 if (!isdigit(Str[indi])) {
107 bool is_set()
const {
return set_; }
125 for (
int indi = 0, index = 0; index <=
length; index++) {
126 if (index == length || isspace(date_string[index]) || strchr(
"(),", date_string[index])) {
127 if (indi == 0)
continue;
132 if (!month) month.
set(num);
139 if (!month && num <= 12) { month.
set(num); }
140 else if (!day && num <= 31) { day.
set(num); }
141 else if (!year) { year.
set(num); }
145 else token[indi++] = date_string[index];
148 if (!day || !month || !year ||
151 *monthPtr = month.
value();
152 *dayPtr = day.
value();
153 *yearPtr = year.
value();
161 return str0len(str) >= 11 && str[2] ==
'-' && str[6] ==
'-';
169 if (other_date[length - 1] ==
'\n') {
170 char *dup = nulldup(other_date);
176 static char gdate[
SIZE];
179 int day = -1, month = -1, year = -1;
183 strncpy(gdate, other_date, 11);
190 if (!ok) ok =
find_date(other_date, &month, &day, &year);
193 warningf(146,
"Unknown date format: %s, cannot convert.", other_date);
194 strcpy(gdate, ERROR_DATE);
198 if (day <= 0 || month <= 0 || year <= 0 || month > 12 || day >
days_in_month[month]) {
199 warningf(147,
"Wrong date format: %s", other_date);
200 strcpy(gdate, ERROR_DATE);
203 if (year<100) year += 1900;
204 sprintf(gdate,
"%02d-%s-%d", day, MON[month - 1], year);
220 (void)gettimeofday(&tp, &tzp);
222 strcpy(line, ctime(&(tp.tv_sec)));
224 int len = strlen(line);
225 if (line[len-1] ==
'\n') {
234 static char date[2*
SIZE];
238 const int MONTH_POS = 4;
239 const int MONTH_LEN = 3;
240 const int DAY_POS = MONTH_POS+MONTH_LEN+1;
242 const char *monthname =
"";
244 char part[MONTH_LEN+1];
245 memcpy(part, input+MONTH_POS, MONTH_LEN);
249 if (month) monthname = Month[month-1];
255 sscanf(input+DAY_POS,
"%d %s %d", &day, time, &year);
258 sprintf(date,
"%s %d, %d %s", monthname, day, year, time);
267 #define TEST_EXPECT_CONVERT(input,expect,CONVERT,ASSERTION) ASSERTION(CONVERT(input), expect);
269 #define TEST_EXPECT_GENBANK_DATE(input,expect) TEST_EXPECT_CONVERT(input, expect, genbank_date, TEST_EXPECT_EQUAL)
270 #define TEST_EXPECT_GENBANK_DATE__BROKEN(input,expect) TEST_EXPECT_CONVERT(input, expect, genbank_date, TEST_EXPECT_EQUAL__BROKEN)
271 #define TEST_EXPECT_GCG_DATE(input,expect) TEST_EXPECT_CONVERT(input, expect, gcg_date, TEST_EXPECT_EQUAL)
272 #define TEST_EXPECT_GCG_DATE__BROKEN(input,expect) TEST_EXPECT_CONVERT(input, expect, gcg_date, TEST_EXPECT_EQUAL__BROKEN)
274 #define TEST_EXPECT_INVALID_ANYDATE(input,finder) \
276 int day_, month_, year_; \
277 ASSERT_RESULT(bool, false, \
278 finder(input, &month_, &day_, &year_)); \
281 #define TEST_EXPECT_INVALID_LONGDATE(input) TEST_EXPECT_INVALID_ANYDATE(input, find_date_long_form)
283 #define TEST_EXPECT_FIND_ANYDATE(input,d,m,y,finder) \
285 char *dup_ = ARB_strdup(input); \
286 int day_, month_, year_; \
287 TEST_EXPECT(finder(dup_, &month_, &day_, &year_)); \
288 TEST_EXPECT_EQUAL(day_, d); \
289 TEST_EXPECT_EQUAL(month_, m); \
290 TEST_EXPECT_EQUAL(year_, y); \
294 #define TEST_EXPECT_FIND_____DATE(input,d,m,y) TEST_EXPECT_FIND_ANYDATE(input, d, m, y, find_date)
295 #define TEST_EXPECT_FIND_LONGDATE(input,d,m,y) TEST_EXPECT_FIND_ANYDATE(input, d, m, y, find_date_long_form)
302 TEST_EXPECT_FIND_____DATE(
"19-APR-99", 19, 4, 99);
303 TEST_EXPECT_FIND_____DATE(
"22-JUN-65", 22, 6, 65);
304 TEST_EXPECT_FIND_____DATE(
"5-SEP-10", 5, 9, 10);
305 TEST_EXPECT_FIND_____DATE(
"05-SEP-10", 5, 9, 10);
307 TEST_EXPECT_FIND_____DATE(
"19-APR-1999", 19, 4, 1999);
308 TEST_EXPECT_FIND_____DATE(
"22-JUN-1965", 22, 6, 1965);
309 TEST_EXPECT_FIND_____DATE(
"5-SEP-2010", 5, 9, 2010);
310 TEST_EXPECT_FIND_____DATE(
"05-SEP-2010", 5, 9, 2010);
314 TEST_EXPECT_FIND_LONGDATE(
"05 Sep 2010", 5, 9, 2010);
315 TEST_EXPECT_FIND_LONGDATE(
"Sep, 05 2010", 5, 9, 2010);
316 TEST_EXPECT_FIND_LONGDATE(
"Sep 05 2010", 5, 9, 2010);
318 TEST_EXPECT_FIND_LONGDATE(
"Mon Apr 19 25:46:19 CEST 99", 19, 4, 99);
319 TEST_EXPECT_FIND_LONGDATE(
"Tue Jun 22 05:11:00 CEST 65", 22, 6, 65);
320 TEST_EXPECT_FIND_LONGDATE(
"Wed Sep 5 19:46:25 CEST 10", 5, 9, 10);
321 TEST_EXPECT_FIND_LONGDATE(
"Wed Sep 05 19:46:25 CEST 10", 5, 9, 10);
323 TEST_EXPECT_FIND_LONGDATE(
"Mon Apr 19 25:46:19 CEST 1999", 19, 4, 1999);
324 TEST_EXPECT_FIND_LONGDATE(
"Tue Jun 22 05:11:00 CEST 1965", 22, 6, 1965);
325 TEST_EXPECT_FIND_LONGDATE(
"Wed Sep 5 19:46:25 CEST 2010", 5, 9, 2010);
326 TEST_EXPECT_FIND_LONGDATE(
"Wed Sep 05 19:46:25 CEST 2010", 5, 9, 2010);
327 TEST_EXPECT_FIND_LONGDATE(
"Wed Sep 05 19:46:25 2010", 5, 9, 2010);
329 TEST_EXPECT_FIND_LONGDATE(
"Sun Oct 31 08:37:14 2010", 31, 10, 2010);
333 TEST_EXPECT_GENBANK_DATE(
"19 Apr 1999",
"19-APR-1999");
334 TEST_EXPECT_GENBANK_DATE(
"19-APR-1999",
"19-APR-1999");
335 TEST_EXPECT_GENBANK_DATE(
"22-JUN-1965",
"22-JUN-1965");
336 TEST_EXPECT_GENBANK_DATE(
"5-SEP-2010",
"05-SEP-2010");
337 TEST_EXPECT_GENBANK_DATE(
"05-SEP-2010",
"05-SEP-2010");
338 TEST_EXPECT_GENBANK_DATE(
"crap", ERROR_DATE);
340 TEST_EXPECT_GENBANK_DATE(
"Mon Apr 19 25:46:19 CEST 1999",
"19-APR-1999");
341 TEST_EXPECT_GENBANK_DATE(
"Tue Jun 22 05:11:00 CEST 1965",
"22-JUN-1965");
342 TEST_EXPECT_GENBANK_DATE(
"Wed Sep 5 19:46:25 CEST 2010",
"05-SEP-2010");
343 TEST_EXPECT_GENBANK_DATE(
"Wed Sep 05 19:46:25 CEST 2010",
"05-SEP-2010");
344 TEST_EXPECT_GENBANK_DATE(
"Wed Sep 31 19:46:25 CEST 2010", ERROR_DATE);
346 TEST_EXPECT_GENBANK_DATE(
"Sun Oct 31 08:37:14 2010",
"31-OCT-2010");
347 TEST_EXPECT_GENBANK_DATE(
"Sun 10 31 08:37:14 2010",
"31-OCT-2010");
348 TEST_EXPECT_GENBANK_DATE(
"Sun 31 10 08:37:14 2010",
"31-OCT-2010");
349 TEST_EXPECT_GENBANK_DATE(
"Sun Oct 32 08:37:14 2010", ERROR_DATE);
351 TEST_EXPECT_GENBANK_DATE(
"Fri Dec 31 08:37:14 2010",
"31-DEC-2010");
352 TEST_EXPECT_GENBANK_DATE(
"Fri 12 31 08:37:14 2010",
"31-DEC-2010");
353 TEST_EXPECT_GENBANK_DATE(
"Fri 31 12 08:37:14 2010",
"31-DEC-2010");
354 TEST_EXPECT_GENBANK_DATE(
"Fri 13 31 08:37:14 2010", ERROR_DATE);
355 TEST_EXPECT_GENBANK_DATE(
"Fri 31 13 08:37:14 2010", ERROR_DATE);
357 TEST_EXPECT_GENBANK_DATE(
"Tue Feb 28 08:37:14 2011",
"28-FEB-2011");
358 TEST_EXPECT_GENBANK_DATE(
"Tue Feb 29 08:37:14 2011",
"29-FEB-2011");
359 TEST_EXPECT_GENBANK_DATE(
"Tue Feb 30 08:37:14 2011", ERROR_DATE);
365 TEST_EXPECT_GCG_DATE(
"Mon Apr 19 25:46:19 99",
"April 19, 99 25:46:19");
367 TEST_EXPECT_GCG_DATE(
"Mon Apr 19 25:46:19 1999",
"April 19, 1999 25:46:19");
368 TEST_EXPECT_GCG_DATE(
"Tue Jun 22 05:11:00 1965",
"June 22, 1965 05:11:00");
369 TEST_EXPECT_GCG_DATE(
"Wed Sep 5 19:46:25 2010",
"September 5, 2010 19:46:25");
370 TEST_EXPECT_GCG_DATE(
"Wed Sep 05 19:46:25 2010",
"September 5, 2010 19:46:25");
CONSTEXPR_INLINE int str0len(const char *str)
CONSTEXPR_INLINE bool str_iequal(const char *s1, const char *s2)
static unsigned char days_in_month[12+1]
void warningf(int warning_num, const char *warning_messagef,...) __ATTR__FORMAT(2)
static int isdatenum(char *Str)
int ismonth(const char *str)
bool is_genbank_date(const char *str)
const char * genbank_date(const char *other_date)
static __ATTR__USERESULT bool find_date_long_form(const char *date_string, int *monthPtr, int *dayPtr, int *yearPtr)
bool two_char(const char *str, char determ)
#define TEST_REJECT_NULL(n)
const char * gcg_date(const char *input)
#define __ATTR__REDUCED_OPTIMIZE
static const char * ERROR_DATE
static const char * Month[12]
static __ATTR__USERESULT bool find_date(const char *date_string, int *month, int *day, int *year)
#define IF_ASSERTION_USED(x)
const char * today_date()
#define __ATTR__USERESULT
#define TEST_EXPECT_DIFFERENT(expr, want)
static const char * MON[12]
#define TEST_EXPECT_EQUAL(expr, want)