Return TypeFunction nameArguments
hzEcodehzCron::Advance(hzXDate&,unsigned int,)

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

Function Logic:

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

Function body:

hzEcode hzCron::Advance (hzXDate& date, unsigned int factor)
{
   _hzfunc("hzCron::Advance(hzXDate)") ;
   hzSDate     fr ;
   hzSDate     to ;
   hzSDate     sd ;
   uint32_t    Y ;
   uint32_t    M ;
   uint32_t    D ;
   uint32_t    dow ;
   uint32_t    alt ;
   bool        bExcl ;
   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() ;
       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) ; }
       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) ; }
       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
       {
           switch  (m_Period)
           {
           case HZPERIOD_MONTH:
               M++ ; break ;
           case HZPERIOD_MONTH1: case HZPERIOD_MONTH2:
               alt = M % 2; M += alt ? alt : 2; break ;
           case HZPERIOD_QTR1: case HZPERIOD_QTR2: case HZPERIOD_QTR3:
               alt = M % 3; M += alt ? alt : 3; break ;
           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 ;
           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);
       }
       bExcl = false ;
       if (m_frMth)
       {
           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 ;
}