View Raw SPL
/* 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);
}