From the supplied date, advance to the Nth next valid date & time for the cron entry, where N is the supplied factor. Skip over excluded periods or dates.

Return TypeFunction nameArguments
hzEcodehzCron::Advance(hzXDate&,uint32_t,)

Declared in file: hzCron.h
Defined in file : hzCron.cpp

Function Logic:

0:START 1:unknown 2:items m_error 3:Return E_RANGE 4:unknown 5:items m_error 6:Return E_RANGE 7:unknown 8:items m_error 9:Return E_RANGE 10:unknown 11:items m_error 12:Return E_RANGE 13:unknown 14:m_error 15:Return E_ARGUMENT 16:unknown 17:items 18:factor 19:Y M D dow 20:unknown 21:alt items 22:m_Period==HZPERIOD_MONSAT 23:items items 24:m_Period==HZPERIOD_WEEKDAY 25:items items 26:m_Period==HZPERIOD_EMON 27:7 28:alt items 29:m_Period==HZPERIOD_ETUE 30:items items 31:m_Period==HZPERIOD_EWED 32:items items 33:m_Period==HZPERIOD_ETHR 34:items items 35:m_Period==HZPERIOD_EFRI 36:items items 37:m_Period==HZPERIOD_ESAT 38:items items 39:m_Period==HZPERIOD_ESUN 40:items items 41:m_Period==HZPERIOD_ALT_MON 42:7 43:alt alt items 44:m_Period==HZPERIOD_ALT_TUE 45:items alt items 46:m_Period==HZPERIOD_ALT_WED 47:items alt items 48:m_Period==HZPERIOD_ALT_THR 49:items alt items 50:m_Period==HZPERIOD_ALT_FRI 51:items alt items 52:m_Period==HZPERIOD_ALT_SAT 53:items alt items 54:m_Period==HZPERIOD_ALT_SUN 55:items alt items 56:m_Period 57:HZPERIOD_MONTH 58:items 59:HZPERIOD_MONTH1 60:HZPERIOD_MONTH2 61:M 62:alt items 63:HZPERIOD_QTR1 64:HZPERIOD_QTR2 65:HZPERIOD_QTR3 66:M 67:alt items 68:HZPERIOD_HYEAR1 69:HZPERIOD_HYEAR2 70:HZPERIOD_HYEAR3 71:HZPERIOD_HYEAR4 72:HZPERIOD_HYEAR5 73:HZPERIOD_HYEAR6 74:M 75:alt items 76:HZPERIOD_YEAR1 77:HZPERIOD_YEAR2 78:HZPERIOD_YEAR3 79:HZPERIOD_YEAR4 80:HZPERIOD_YEAR5 81:HZPERIOD_YEAR6 82:HZPERIOD_YEAR7 83:HZPERIOD_YEAR8 84:HZPERIOD_YEAR9 85:HZPERIOD_YEAR10 86:HZPERIOD_YEAR11 87:HZPERIOD_YEAR12 88:items 89:unknown 90:items M 91:items 92:bExcl 93:unknown 94:items items items 95:unknown 96:bExcl 97:unknown 98:unknown 99:bExcl 100:unknown 101:bExcl 102:unknown 103:items 104:Return E_OK

Function body:

hzEcode hzCron::Advance (hzXDate& date)uint32_t factor, 
{
   //  From the supplied date, advance to the Nth next valid date & time for the cron entry, where N is the supplied factor. Skip over
   //  excluded periods or dates.
   //  
   //  Arguments: 1) date Full date and time. If this is not set it will be set to the current date and time.
   //     2) factor No of intervals to advance
   //  
   //  Returns: E_ARGUMENT If the number of intervals to advance is zero
   //     E_NOINIT If this hzCron is not active or cannot be advanced
   //     E_OK  If this hzCron set the date of the next occurance
   _hzfunc("hzCron::Advance(hzXDate)") ;
   hzSDate     fr ;        //  From start of exclusion period
   hzSDate     to ;        //  To end of exclusion period
   hzSDate     sd ;        //  System date
   uint32_t    Y ;         //  Year
   uint32_t    M ;         //  Month
   uint32_t    D ;         //  Day of month
   uint32_t    dow ;       //  Day of week
   uint32_t    alt ;       //  Days to advance
   bool        bExcl ;     //  Date is excluded
   if (!m_bActive)                     { date.Clear() ; m_error = "Interval not active" ; return E_RANGE ; }
   if (m_Period == HZPERIOD_NEVER)     { date.Clear() ; m_error = "Interval has no periodicity" ; return E_RANGE ; }
   if (m_Period == HZPERIOD_INVALID)   { date.Clear() ; m_error = "Interval has invalid periodicity" ; return E_RANGE ; }
   if (m_Period == HZPERIOD_RANDOM)    { date.Clear() ; m_error = "Interval is chaotic" ; return E_RANGE ; }
   if (!factor)
       { m_error = "Factor must be 1 or more" ; return E_ARGUMENT ; }
   if (!date.IsSet())
       date.SysDateTime() ;
   do
   {
       Y = date.Year() ;
       M = date.Month() ;
       D = date.Day() ;
       dow = date.Dow() ;
       //  Every day
       if      (m_Period == HZPERIOD_DAY)      { alt = 1; date.altdate(DAY, alt) ; }
       //  Mon - Sat",
       else if (m_Period == HZPERIOD_MONSAT)   { alt = dow==5? 2: 1; date.altdate(DAY, alt) ; }
       //  Weekdays only
       else if (m_Period == HZPERIOD_WEEKDAY)  { alt = dow==4? 3: dow==5? 2: 1; date.altdate(DAY, alt) ; }
       //  Every [Monday - Sunday]
       else if (m_Period == HZPERIOD_EMON)     { alt = 7-dow; date.altdate(DAY, alt) ; }
       else if (m_Period == HZPERIOD_ETUE)     { alt = dow==1? 7: dow<1? 1: 8-dow; date.altdate(DAY, alt) ; }
       else if (m_Period == HZPERIOD_EWED)     { alt = dow==2? 7: dow<2? 2-dow: 9-dow; date.altdate(DAY, alt) ; }
       else if (m_Period == HZPERIOD_ETHR)     { alt = dow==3? 7: dow<3? 3-dow: 10-dow;date.altdate(DAY, alt) ; }
       else if (m_Period == HZPERIOD_EFRI)     { alt = dow==4? 7: dow<4? 4-dow: 11-dow;date.altdate(DAY, alt) ; }
       else if (m_Period == HZPERIOD_ESAT)     { alt = dow==5? 7: dow<5? 5-dow: 6; date.altdate(DAY, alt) ; }
       else if (m_Period == HZPERIOD_ESUN)     { alt = dow==6? 7: 6-dow; date.altdate(DAY, alt) ; }
       //  Every other [Monday - Sunday]
       else if (m_Period == HZPERIOD_ALT_MON)  { alt = 7-dow; alt += 7; date.altdate(DAY, alt) ; }
       else if (m_Period == HZPERIOD_ALT_TUE)  { alt = dow==1? 7: dow<1? 1: 8-dow; alt += 7; date.altdate(DAY, alt) ; }
       else if (m_Period == HZPERIOD_ALT_WED)  { alt = dow==2? 7: dow<2? 2-dow: 9-dow; alt += 7; date.altdate(DAY, alt) ; }
       else if (m_Period == HZPERIOD_ALT_THR)  { alt = dow==3? 7: dow<3? 3-dow: 10-dow;alt += 7; date.altdate(DAY, alt) ; }
       else if (m_Period == HZPERIOD_ALT_FRI)  { alt = dow==4? 7: dow<4? 4-dow: 11-dow;alt += 7; date.altdate(DAY, alt) ; }
       else if (m_Period == HZPERIOD_ALT_SAT)  { alt = dow==5? 7: dow<5? 5-dow: 6; alt += 7; date.altdate(DAY, alt) ; }
       else if (m_Period == HZPERIOD_ALT_SUN)  { alt = dow==6? 7: 6-dow; alt += 7; date.altdate(DAY, alt) ; }
       else
       {
           //  Periodicities that are multiples of months
           switch  (m_Period)
           {
           //  Monthly
           case HZPERIOD_MONTH:
               M++ ; break ;
           //  Bi-monthly [odd/even]
           case HZPERIOD_MONTH1: case HZPERIOD_MONTH2:
               alt = M % 2; M += alt ? alt : 2; break ;
           //  Quarterly [month1 - month3]
           case HZPERIOD_QTR1: case HZPERIOD_QTR2: case HZPERIOD_QTR3:
               alt = M % 3; M += alt ? alt : 3; break ;
           //  Half yearly [month1 - month6]
           case HZPERIOD_HYEAR1: case HZPERIOD_HYEAR2: case HZPERIOD_HYEAR3: case HZPERIOD_HYEAR4: case HZPERIOD_HYEAR5: case HZPERIOD_HYEAR6:
               alt = M % 6; M += alt ? alt : 6; break ;
           //  Every [Jan - Dec]
           case HZPERIOD_YEAR1: case HZPERIOD_YEAR2: case HZPERIOD_YEAR3: case HZPERIOD_YEAR4: case HZPERIOD_YEAR5: case HZPERIOD_YEAR6:
           case HZPERIOD_YEAR7: case HZPERIOD_YEAR8: case HZPERIOD_YEAR9: case HZPERIOD_YEAR10: case HZPERIOD_YEAR11: case HZPERIOD_YEAR12:
               Y++ ; break ;
           }
           if (M > 12)
               { Y++ ; M -= 12;}
           date.SetDate(Y, M, 1);
       }
       //  Have arrived at a possible date. Check if this is not excluded. If it is we do not decrement the factor
       bExcl = false ;
       if (m_frMth)
       {
           //  An exclusion period is in force
           sd.SetDate(date.Year(), date.Month(), date.Day()) ;
           fr.SetDate(date.Year(), m_frMth, m_frDay) ;
           to.SetDate(date.Year(), m_toMth, m_toDay) ;
           if (sd >&eq; fr && sd <&eq; to)
               bExcl = true ;
       }
       if (!m_frMth && m_toMth)
       {
           if (M == m_toMth && D == m_toDay)
               bExcl = true ;
       }
       if (IsHoliday(date, m_exclhols))
           bExcl = true ;
       if (!bExcl)
           factor-- ;
   }
   while (factor) ;
   return E_OK ;
}