/* generic error function */
#define DTDURATION_ERROR error(sprintf("%s - input date/time series required", __CALLER__))
/* parse args for dtduration and dtperiod */
dt_durper_parse_args(nargs, d1, t1, d2, t2)
{
local usediff, dateonly, timeonly;
usediff = dateonly = timeonly = FALSE;
if (nargs < 4)
{
if (nargs < 3)
{
if (nargs < 2)
{
if (nargs < 1)
{
DTDURATION_ERROR;
}
if (isdatetime(d1))
{
usediff = TRUE;
t1 = d1[.., 2..2..end];
d1 = d1[.., 1..2..end];
}
else if (isdate(d1))
{
dateonly = TRUE;
usediff = TRUE;
}
else if (istime(d1))
{
timeonly = TRUE;
usediff = TRUE;
}
else
{
DTDURATION_ERROR;
}
}
else
{
/* two args */
if (isdatetime(d1))
{
if (isdatetime(t1))
{
/* two dt series */
t2 = t1[.., 2..2..end];
d2 = t1[.., 1..2..end];
}
else if (isdate(t1))
{
d2 = refseries(t1);
t2 = 0;
}
else if (istime(t1))
{
d2 = -1;
t2 = t1;
}
else
{
DTDURATION_ERROR;
}
t1 = d1[.., 2..2..end];
d1 = d1[.., 1..2..end];
}
else if (isdate(d1))
{
if (isdatetime(t1))
{
t2 = t1[.., 2..2..end];
d2 = t1[.., 1..2..end];
t1 = 0;
}
else if (isdate(t1))
{
dateonly = TRUE;
d2 = refseries(t1);
t2 = 0;
t1 = 0;
}
else if (istime(t1))
{
/* single date and time series */
usediff = TRUE;
}
}
else if (istime(d1))
{
if (isdatetime(t1))
{
t2 = t1[.., 2..2..end];
d2 = t1[.., 1..2..end];
t2 = d1;
d1 = -1;
}
else if (isdate(t1))
{
/* assume single time and date */
usediff = TRUE;
/* swap */
d2 = refseries(d1);
d1 = refseries(t1);
t1 = refseries(d2);
// (d1, t1) = (t1, d1);
}
else if (istime(t1))
{
timeonly = TRUE;
t2 = refseries(t1);
t1 = refseries(d1);
d1 = -1;
d2 = -1;
}
}
else
{
DTDURATION_ERROR;
}
}
}
else
{
/* three args */
DTDURATION_ERROR;
}
}
return(d1, t1, d2, t2, usediff, dateonly, timeonly);
}