156 lines
4.1 KiB
C
156 lines
4.1 KiB
C
/****************************************************************
|
|
* *
|
|
* Copyright 2001, 2013 Fidelity Information Services, Inc *
|
|
* *
|
|
* This source code contains the intellectual property *
|
|
* of its copyright holder(s), and is made available *
|
|
* under a license. If you do not know the terms of *
|
|
* the license, please stop and do not read further. *
|
|
* *
|
|
****************************************************************/
|
|
|
|
/* int gtm_bintim(char *toscan, jnl_proc_time *timep)
|
|
*
|
|
* Converts an absolute or relative time to the UNIX internal format (seconds
|
|
* past 1970)
|
|
*
|
|
* Input:
|
|
* toscan ASCII string containing an absolute or relative time
|
|
* specification (see below).
|
|
*
|
|
* timep pointer to a variable which will hold the absolute or
|
|
* relative time. *timep's value should be interpreted
|
|
* as follows:
|
|
* *timep > 0 absolute time
|
|
* *timep <= 0 relative time
|
|
*
|
|
* Returns: 0 = success
|
|
* -1 = failure
|
|
*
|
|
* ASCII time format:
|
|
* dd-mmm-yyyy [hh:mm[:ss[:cc]]] absolute time
|
|
* -- hh:mm[:ss[:cc]] absolute time (w/today's date)
|
|
*
|
|
* dd hh:mm[:ss[:cc]] relative time
|
|
*
|
|
*
|
|
*/
|
|
|
|
#include "mdef.h"
|
|
|
|
#include "gtm_time.h"
|
|
|
|
#include "gtm_ctype.h"
|
|
#include "gtm_string.h"
|
|
#include "gtm_stdio.h"
|
|
#include "gdsroot.h"
|
|
#include "gtm_facility.h"
|
|
#include "fileinfo.h"
|
|
#include "gdsbt.h"
|
|
#include "gdsfhead.h"
|
|
#include "filestruct.h"
|
|
#include "jnl.h" /* jnl_proc_time needs this. jnl.h needs some of the above */
|
|
#include "have_crit.h"
|
|
#include "gtm_bintim.h"
|
|
|
|
#define monthalphas "abcdefgjlmnoprstuvyABCDEFGJLMNOPRSTUVY"
|
|
|
|
static int getmon(char *month);
|
|
|
|
int gtm_bintim(char *toscan, jnl_proc_time *timep)
|
|
{
|
|
time_t now, mktime_ret;
|
|
struct tm time_tm, *now_tm;
|
|
int num, sec, min, hour, day, year;
|
|
int len = STRLEN(toscan), matched = 0;
|
|
char month[256];
|
|
|
|
num = SSCANF(toscan, "%d %d", &day, &hour);
|
|
if (2 == num)
|
|
{ /* delta time format. note: this is the same code as in VMS gtm_bintim.c */
|
|
num = SSCANF(toscan, "%d %d:%d:%d%n", &day, &hour, &min, &sec, &matched);
|
|
if (matched < len)
|
|
{
|
|
num = SSCANF(toscan, "%d %d:%d:%d:%*d%n", &day, &hour, &min, &sec, &matched);
|
|
if (matched < len)
|
|
{
|
|
sec = 0;
|
|
num = SSCANF(toscan, "%d %d:%d%n", &day, &hour, &min, &matched);
|
|
if (matched < len)
|
|
return -1;
|
|
}
|
|
}
|
|
*timep = -((day * 86400) + (hour * 3600) + (min * 60) + sec);
|
|
return 0;
|
|
} else /* absolute time format */
|
|
{
|
|
*month = '\0';
|
|
now = time((time_t *) 0);
|
|
GTM_LOCALTIME(now_tm, &now);
|
|
num = SSCANF(toscan, "%d-%[" monthalphas "]-%d %d:%d:%d%n", &day, month, &year, &hour, &min, &sec, &matched);
|
|
if (matched < len)
|
|
{
|
|
num = SSCANF(toscan, "%d-%[" monthalphas "]-%d %d:%d:%d:%*d%n",
|
|
&day, month, &year, &hour, &min, &sec, &matched);
|
|
if (matched < len)
|
|
{
|
|
sec = 0;
|
|
num = SSCANF(toscan, "%d-%[" monthalphas "]-%d %d:%d%n", &day, month, &year, &hour, &min, &matched);
|
|
if (matched < len)
|
|
{
|
|
hour = min = sec = 0;
|
|
num = SSCANF(toscan, "%d-%[" monthalphas "]-%d%n", &day, month, &year, &matched);
|
|
if (matched < len)
|
|
{
|
|
day = now_tm->tm_mday;
|
|
year = now_tm->tm_year + 1900;
|
|
num = SSCANF(toscan, "-- %d:%d:%d%n", &hour, &min, &sec, &matched);
|
|
if (matched < len)
|
|
{
|
|
num = SSCANF(toscan, "-- %d:%d:%d:%*d%n", &hour, &min, &sec, &matched);
|
|
if (matched < len)
|
|
{
|
|
sec = 0;
|
|
num = SSCANF(toscan, "-- %d:%d%n", &hour, &min, &matched);
|
|
if (matched < len)
|
|
return -1;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
time_tm.tm_sec = sec;
|
|
time_tm.tm_min = min;
|
|
time_tm.tm_hour = hour;
|
|
if (*month)
|
|
time_tm.tm_mon = getmon(month);
|
|
else
|
|
time_tm.tm_mon = now_tm->tm_mon;
|
|
time_tm.tm_mday = day;
|
|
time_tm.tm_year = year-1900;
|
|
time_tm.tm_isdst = -1;
|
|
GTM_MKTIME(mktime_ret, &time_tm);
|
|
if ((time_t)-1 == mktime_ret)
|
|
return -1;
|
|
*timep = (jnl_proc_time)mktime_ret;
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
static int getmon(char *month)
|
|
{
|
|
char *p;
|
|
int i;
|
|
static char *m[] = { "jan", "feb", "mar", "apr", "may", "jun",
|
|
"jul", "aug", "sep", "oct", "nov", "dec" };
|
|
|
|
for (p = month; *p; p++)
|
|
if (ISUPPER_ASCII(*p))
|
|
*p = TOLOWER(*p);
|
|
for (i = 0; i < 12; i++)
|
|
if (!strcmp(month,m[i]))
|
|
return i;
|
|
return -1;
|
|
}
|