Return TypeFunction nameArguments
hzEcodehzCron::Retard(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_NOINIT 4:factor<1 5:m_error 6:Return E_ARGUMENT 7:!date.IsSet() 8:hzXDate::SysDateTime 9:factor 10:hzXDate::Year Y hzXDate::Month M hzXDate::Dow dow 11:m_Period==HZPERIOD_DAY 12:alt hzXDate::altdate 13:m_Period==HZPERIOD_MONSAT 14:alt hzXDate::altdate 15:m_Period==HZPERIOD_WEEKDAY 16:alt hzXDate::altdate 17:m_Period==HZPERIOD_EMON 18:alt hzXDate::altdate 19:m_Period==HZPERIOD_ETUE 20:alt hzXDate::altdate 21:m_Period==HZPERIOD_EWED 22:alt hzXDate::altdate 23:m_Period==HZPERIOD_ETHR 24:alt hzXDate::altdate 25:m_Period==HZPERIOD_EFRI 26:alt hzXDate::altdate 27:m_Period==HZPERIOD_ESAT 28:alt hzXDate::altdate 29:m_Period==HZPERIOD_ESUN 30:alt hzXDate::altdate 31:m_Period==HZPERIOD_ALT_MON 32:alt alt hzXDate::altdate 33:m_Period==HZPERIOD_ALT_TUE 34:alt alt hzXDate::altdate 35:m_Period==HZPERIOD_ALT_WED 36:alt alt hzXDate::altdate 37:m_Period==HZPERIOD_ALT_THR 38:alt alt hzXDate::altdate 39:m_Period==HZPERIOD_ALT_FRI 40:alt alt hzXDate::altdate 41:m_Period==HZPERIOD_ALT_SAT 42:alt alt hzXDate::altdate 43:m_Period==HZPERIOD_ALT_SUN 44:alt alt hzXDate::altdate 45:m_Period 46:HZPERIOD_MONTH 47:items 48:HZPERIOD_MONTH1 49:HZPERIOD_MONTH2 50:alt M 51:HZPERIOD_QTR1 52:HZPERIOD_QTR2 53:HZPERIOD_QTR3 54:alt M 55:HZPERIOD_HYEAR1 56:HZPERIOD_HYEAR2 57:HZPERIOD_HYEAR3 58:HZPERIOD_HYEAR4 59:HZPERIOD_HYEAR5 60:HZPERIOD_HYEAR6 61:alt M 62:HZPERIOD_YEAR1 63:HZPERIOD_YEAR2 64:HZPERIOD_YEAR3 65:HZPERIOD_YEAR4 66:HZPERIOD_YEAR5 67:HZPERIOD_YEAR6 68:HZPERIOD_YEAR7 69:HZPERIOD_YEAR8 70:HZPERIOD_YEAR9 71:HZPERIOD_YEAR10 72:HZPERIOD_YEAR11 73:HZPERIOD_YEAR12 74:items 75:M<1 76:items M 77:hzXDate::SetDate IsHoliday 78:!IsHoliday(date,m_exclhols) 79:items 80:Return E_OK

Function body:

hzEcode hzCron::Retard (hzXDate& date, unsigned int factor)
{
   _hzfunc("hzCron::Advance(hzXDate)") ;
   uint32_t    Y ;
   uint32_t    M ;
   uint32_t    dow ;
   uint32_t    alt ;
   if (!m_bActive)
   {
       date.Clear() ;
       m_error = "Interval not active" ;
       return E_NOINIT ;
   }
   if (factor < 1)
   {
       m_error = "Factor must be 1 or more" ;
       return E_ARGUMENT ;
   }
   if (!date.IsSet())
       date.SysDateTime() ;
   do
   {
       Y = date.Year() ;
       M = date.Month() ;
       dow = date.Dow() ;
       if      (m_Period == HZPERIOD_DAY)      { alt = 1; date.altdate(DAY, -alt) ; }
       //  Mon - Sat",
       else if (m_Period == HZPERIOD_MONSAT)   { alt = dow==0? 2: 1; date.altdate(DAY, -alt) ; }
       //  Weekdays only
       else if (m_Period == HZPERIOD_WEEKDAY)  { alt = dow>4? dow - 4: dow ? 1: 3; date.altdate(DAY, -alt) ; }
       else if (m_Period == HZPERIOD_EMON)     { alt = dow>0? dow : 7; date.altdate(DAY, -alt) ; }
       else if (m_Period == HZPERIOD_ETUE)     { alt = dow>1? dow - 1: dow + 6; date.altdate(DAY, -alt) ; }
       else if (m_Period == HZPERIOD_EWED)     { alt = dow>2? dow - 2: dow + 5; date.altdate(DAY, -alt) ; }
       else if (m_Period == HZPERIOD_ETHR)     { alt = dow>3? dow - 3: dow + 4; date.altdate(DAY, -alt) ; }
       else if (m_Period == HZPERIOD_EFRI)     { alt = dow>4? dow - 4: dow + 3; date.altdate(DAY, -alt) ; }
       else if (m_Period == HZPERIOD_ESAT)     { alt = dow>5? dow - 5: dow + 2; date.altdate(DAY, -alt) ; }
       else if (m_Period == HZPERIOD_ESUN)     { alt = dow + 1; date.altdate(DAY, -alt) ; }
       else if (m_Period == HZPERIOD_ALT_MON)  { alt = dow>0? dow : 7; alt += 7; date.altdate(DAY, -alt) ; }
       else if (m_Period == HZPERIOD_ALT_TUE)  { alt = dow>1? dow - 1: dow + 6; alt += 7; date.altdate(DAY, -alt) ; }
       else if (m_Period == HZPERIOD_ALT_WED)  { alt = dow>2? dow - 2: dow + 5; alt += 7; date.altdate(DAY, -alt) ; }
       else if (m_Period == HZPERIOD_ALT_THR)  { alt = dow>3? dow - 3: dow + 4; alt += 7; date.altdate(DAY, -alt) ; }
       else if (m_Period == HZPERIOD_ALT_FRI)  { alt = dow>4? dow - 4: dow + 3; alt += 7; date.altdate(DAY, -alt) ; }
       else if (m_Period == HZPERIOD_ALT_SAT)  { alt = dow>5? dow - 5: dow + 2; alt += 7; date.altdate(DAY, -alt) ; }
       else if (m_Period == HZPERIOD_ALT_SUN)  { alt = dow + 1; 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 < 1)
               { Y-- ; M += 12;}
           date.SetDate(Y, M, 1);
       }
       if (!IsHoliday(date, m_exclhols))
           factor-- ;
   }
   while (factor) ;
   return E_OK ;
}