/* * convert calendar and hourly elements to julian day */ double cal_and_time_to_jul(int y, int m, int d, int hour, int min, double sec) { return jul_and_time_to_jul (cal_to_jul(y, m, d), hour, min, sec); }
/* * parse a date given either in calendar or numerical format */ int parse_date(const char* s, Dates_format preferred, int absolute, double *jul, Dates_format *recognized) { int i, n; int ky, km, kd; static Dates_format trials [] = {FMT_nohint, FMT_iso, FMT_european, FMT_us}; Int_token tab [5]; long j; double sec; /* first guess : is it a date in calendar format ? */ n = parse_calendar_date(s, tab, &sec); switch (n) { /* we consider hours, minutes and seconds as optional items */ case -1 : /* parse error */ break; case 3 : tab[3].value = 0; /* adding hours */ tab[3].digits = 1; case 4 : tab[4].value = 0; /* adding minutes */ tab[4].digits = 1; case 5 : sec = 0.0; /* adding seconds */ case 6 : /* we now have a complete date */ /* try the user's choice first */ trials[0] = preferred; for (i = 0; i < 4; i++) { if (trials[i] == FMT_iso) { /* YYYY-MM-DD */ ky = 0; km = 1; kd = 2; } else if (trials[i] == FMT_european) { /* DD/MM/(YY)YY */ ky = 2; km = 1; kd = 0; } else if (trials[i] == FMT_us) { /* MM/DD/(YY)YY */ ky = 2; km = 0; kd = 1; } else { /* the user didn't choose a calendar format */ continue; } if (check_date(tab[ky], tab[km], tab[kd], &j) == RETURN_SUCCESS) { *jul = jul_and_time_to_jul(j, tab[3].value, tab[4].value, sec); if (!absolute) { *jul -= get_ref_date(); } *recognized = trials[i]; return RETURN_SUCCESS; } } break; default : /* probably a julian date */ break; } return RETURN_FAILURE; }
/* * parse a date given either in calendar or numerical format */ int parse_date(const char* s, int century, int wy, Dates_format preferred, double *jul, Dates_format *recognized) { int i, n; int ky, km, kd; static Dates_format trials [] = {FMT_nohint, FMT_iso, FMT_european, FMT_us}; Int_token tab [5]; long j; double sec; const char *after; /* first guess : is it a date in calendar format ? */ n = parse_calendar_date(s, tab, &sec); switch (n) { /* we consider hours, minutes and seconds as optional items */ case -1 : /* parse error */ break; case 3 : tab[3].value = 0; /* adding hours */ tab[3].digits = 1; case 4 : tab[4].value = 0; /* adding minutes */ tab[4].digits = 1; case 5 : sec = 0.0; /* adding seconds */ case 6 : /* we now have a complete date */ /* try the user's choice first */ trials[0] = preferred; for (i = 0; i < 4; i++) { if (trials[i] == FMT_iso) { /* YYYY-MM-DD */ ky = 0; km = 1; kd = 2; } else if (trials[i] == FMT_european) { /* DD/MM/(YY)YY */ ky = 2; km = 1; kd = 0; } else if (trials[i] == FMT_us) { /* MM/DD/(YY)YY */ ky = 2; km = 0; kd = 1; } else { /* the user didn't choose a calendar format */ continue; } if (check_date(century, wy, tab[ky], tab[km], tab[kd], &j) == EXIT_SUCCESS) { *jul = jul_and_time_to_jul(j, tab[3].value, tab[4].value, sec); *recognized = trials[i]; return EXIT_SUCCESS; } } break; default : /* probably a julian date (integer if n == 1, real otherwise) */ break; } /* second guess : is it a date in numerical format ? */ if (parse_float(s, jul, &after) == EXIT_SUCCESS) { while (isspace(*after)) { after++; } if (*after == '\0') { if (preferred == FMT_seconds) { *recognized = FMT_seconds; *jul /= 86400.0; } else { *recognized = FMT_days; } return EXIT_SUCCESS; } } return EXIT_FAILURE; }