Apply rules to see if the supplied date is a running day

Return TypeFunction nameArguments
hzEcodehzCron::TestDate(hzSDate&,)

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

Function Logic:

0:START 1:unknown 2:m_error 3:Return E_NOINIT 4:m_Period 5:HZPERIOD_NEVER 6:Return E_RANGE 7:HZPERIOD_RANDOM 8:Return E_OK 9:HZPERIOD_DAY 10:Return E_OK 11:HZPERIOD_MONSAT 12:Return dow==6?E_RANGE:E_OK 13:HZPERIOD_WEEKDAY 14:Return dow<5?E_OK:E_RANGE 15:HZPERIOD_EMON 16:Return dow==0?E_OK:E_RANGE 17:HZPERIOD_ETUE 18:Return dow==1?E_OK:E_RANGE 19:HZPERIOD_EWED 20:Return dow==2?E_OK:E_RANGE 21:HZPERIOD_ETHR 22:Return dow==3?E_OK:E_RANGE 23:HZPERIOD_EFRI 24:Return dow==4?E_OK:E_RANGE 25:HZPERIOD_ESAT 26:Return dow==5?E_OK:E_RANGE 27:HZPERIOD_ESUN 28:Return dow==6?E_OK:E_RANGE 29:HZPERIOD_ALT_MON 30:HZPERIOD_ALT_TUE 31:HZPERIOD_ALT_WED 32:HZPERIOD_ALT_THR 33:HZPERIOD_ALT_FRI 34:HZPERIOD_ALT_SAT 35:HZPERIOD_ALT_SUN 36:unknown 37:Return E_OK 38:Return E_RANGE

Function body:

hzEcode hzCron::TestDate (hzSDate& D)
{
   //  Apply rules to see if the supplied date is a running day
   //  
   //  Arguments: 1) D Short form date
   //  
   //  Returns: E_NOINIT If this hzCron is not initialized
   //     E_RANGE  If the date is out of range
   //     E_OK  If the supplied date is a running day
   _hzfunc("hzCron::TestDate") ;
   hzXDate     tmp ;               //  Current system time and date
   uint32_t    _mon ;              //  First/last Monday
   uint32_t    _tue ;              //  First/last Tuesday
   uint32_t    _wed ;              //  First/last Wednesday
   uint32_t    _thr ;              //  First/last Thursday
   uint32_t    _fri ;              //  First/last Friday
   uint32_t    _sat ;              //  First/last Saturday
   uint32_t    _sun ;              //  First/last Sunday
   uint32_t    dow = D.Dow() ;     //  Day of week of test date
   uint32_t    day = D.Day() ;     //  Day of month of test date
   uint32_t    mon = D.Month() ;   //  Month of year of test date
   uint32_t    mlen ;              //  Length of month
   if (!m_bActive)
   {
       m_error = "Interval not validated/initialized" ;
       return E_NOINIT ;
   }
   switch  (m_Period)
   {
   case HZPERIOD_NEVER:    return E_RANGE ;
   case HZPERIOD_RANDOM:   return E_OK ;
   case HZPERIOD_DAY:      return E_OK ;
   case HZPERIOD_MONSAT:   return dow == 6? E_RANGE : E_OK ;
   case HZPERIOD_WEEKDAY:  return dow < 5? E_OK : E_RANGE ;
   case HZPERIOD_EMON:     return dow == 0? E_OK : E_RANGE ;
   case HZPERIOD_ETUE:     return dow == 1? E_OK : E_RANGE ;
   case HZPERIOD_EWED:     return dow == 2? E_OK : E_RANGE ;
   case HZPERIOD_ETHR:     return dow == 3? E_OK : E_RANGE ;
   case HZPERIOD_EFRI:     return dow == 4? E_OK : E_RANGE ;
   case HZPERIOD_ESAT:     return dow == 5? E_OK : E_RANGE ;
   case HZPERIOD_ESUN:     return dow == 6? E_OK : E_RANGE ;
   case HZPERIOD_ALT_MON:      //  Every other Monday
   case HZPERIOD_ALT_TUE:      //  Every other Tuesday
   case HZPERIOD_ALT_WED:      //  Every other Wednesday
   case HZPERIOD_ALT_THR:      //  Every other Thursday
   case HZPERIOD_ALT_FRI:      //  Every other Friday
   case HZPERIOD_ALT_SAT:      //  Every other Saturday
   case HZPERIOD_ALT_SUN:      //  Every other Sunday
       if (m_Era.IsSet() && !((D.NoDays() - m_Era.NoDays()) % 14))
           return E_OK ;
       return E_RANGE ;
   default:
       break ;
   }
   //  Check if we are in a month in which it will run
   if (m_Period == HZPERIOD_MONTH1 && (!(mon % 2)))return E_RANGE ;
   if (m_Period == HZPERIOD_MONTH2 && (mon % 2))       return E_RANGE ;
   if (m_Period == HZPERIOD_QTR1 && (mon % 3)!= 1) return E_RANGE ;
   if (m_Period == HZPERIOD_QTR2 && (mon % 3)!= 2) return E_RANGE ;
   if (m_Period == HZPERIOD_QTR3 && (mon % 3)!= 0) return E_RANGE ;
   if (m_Period == HZPERIOD_HYEAR1 && (mon % 6)!= 1)   return E_RANGE ;
   if (m_Period == HZPERIOD_HYEAR2 && (mon % 6)!= 2)   return E_RANGE ;
   if (m_Period == HZPERIOD_HYEAR3 && (mon % 6)!= 3)   return E_RANGE ;
   if (m_Period == HZPERIOD_HYEAR4 && (mon % 6)!= 4)   return E_RANGE ;
   if (m_Period == HZPERIOD_HYEAR5 && (mon % 6)!= 5)   return E_RANGE ;
   if (m_Period == HZPERIOD_HYEAR6 && (mon % 6)!= 0)   return E_RANGE ;
   if (m_Period == HZPERIOD_YEAR1 && mon != 1)         return E_RANGE ;
   if (m_Period == HZPERIOD_YEAR2 && mon != 2)         return E_RANGE ;
   if (m_Period == HZPERIOD_YEAR3 && mon != 3)         return E_RANGE ;
   if (m_Period == HZPERIOD_YEAR4 && mon != 4)         return E_RANGE ;
   if (m_Period == HZPERIOD_YEAR5 && mon != 5)         return E_RANGE ;
   if (m_Period == HZPERIOD_YEAR6 && mon != 6)         return E_RANGE ;
   if (m_Period == HZPERIOD_YEAR7 && mon != 7)         return E_RANGE ;
   if (m_Period == HZPERIOD_YEAR8 && mon != 8)         return E_RANGE ;
   if (m_Period == HZPERIOD_YEAR9 && mon != 9)         return E_RANGE ;
   if (m_Period == HZPERIOD_YEAR10 && mon != 10)   return E_RANGE ;
   if (m_Period == HZPERIOD_YEAR11 && mon != 11)   return E_RANGE ;
   if (m_Period == HZPERIOD_YEAR12 && mon != 12)   return E_RANGE ;
   //  We are in a month that it will run so check if rules will allow run on supplied date
   if (m_Rule == HZMONTHRULE_ERA_DERIVE && day != m_Era.Day()) return E_RANGE ;
   if (m_Rule == HZMONTHRULE_FIRST_DAY && day != 1)        return E_RANGE ;
   mlen = monlen(D.Year(), mon) ;
   if (m_Rule == HZMONTHRULE_LAST_DAY && day != mlen)
       return E_RANGE ;
   tmp.SetDate(D.Year(), mon, 1);
   switch (tmp.Dow())
   {
   case 0: _mon = 1; _tue = 2; _wed = 3; _thr = 4; _fri = 5; _sat = 6; _sun = 7; break ;
   case 1: _mon = 7; _tue = 1; _wed = 2; _thr = 3; _fri = 4; _sat = 5; _sun = 6; break ;
   case 2: _mon = 6; _tue = 7; _wed = 1; _thr = 2; _fri = 3; _sat = 4; _sun = 5; break ;
   case 3: _mon = 5; _tue = 6; _wed = 7; _thr = 1; _fri = 2; _sat = 3; _sun = 4; break ;
   case 4: _mon = 4; _tue = 5; _wed = 6; _thr = 7; _fri = 1; _sat = 2; _sun = 3; break ;
   case 5: _mon = 3; _tue = 4; _wed = 5; _thr = 6; _fri = 7; _sat = 1; _sun = 2; break ;
   case 6: _mon = 2; _tue = 3; _wed = 4; _thr = 5; _fri = 6; _sat = 7; _sun = 1; break ;
   }
   if (m_Rule == HZMONTHRULE_FIRST_WEEK_DAY && day != _mon)        //  First of month
   if (m_Rule == HZMONTHRULE_FIRST_WORK_DAY && day != _mon)        //  First work day of month (must impliment national holidays)
   if (m_Rule == HZMONTHRULE_1ST_MON && day != _mon)   return E_RANGE ;
   if (m_Rule == HZMONTHRULE_1ST_TUE && day != _tue)   return E_RANGE ;
   if (m_Rule == HZMONTHRULE_1ST_WED && day != _wed)   return E_RANGE ;
   if (m_Rule == HZMONTHRULE_1ST_THR && day != _thr)   return E_RANGE ;
   if (m_Rule == HZMONTHRULE_1ST_FRI && day != _fri)   return E_RANGE ;
   if (m_Rule == HZMONTHRULE_1ST_SAT && day != _sat)   return E_RANGE ;
   if (m_Rule == HZMONTHRULE_1ST_SUN && day != _sun)   return E_RANGE ;
   if (m_Rule == HZMONTHRULE_2ND_MON && day != (_mon+7))   return E_RANGE ;
   if (m_Rule == HZMONTHRULE_2ND_TUE && day != (_tue+7))   return E_RANGE ;
   if (m_Rule == HZMONTHRULE_2ND_WED && day != (_wed+7))   return E_RANGE ;
   if (m_Rule == HZMONTHRULE_2ND_THR && day != (_thr+7))   return E_RANGE ;
   if (m_Rule == HZMONTHRULE_2ND_FRI && day != (_fri+7))   return E_RANGE ;
   if (m_Rule == HZMONTHRULE_2ND_SAT && day != (_sat+7))   return E_RANGE ;
   if (m_Rule == HZMONTHRULE_2ND_SUN && day != (_sun+7))   return E_RANGE ;
   if (m_Rule == HZMONTHRULE_3RD_MON && day != (_mon+14))  return E_RANGE ;
   if (m_Rule == HZMONTHRULE_3RD_TUE && day != (_tue+14))  return E_RANGE ;
   if (m_Rule == HZMONTHRULE_3RD_WED && day != (_wed+14))  return E_RANGE ;
   if (m_Rule == HZMONTHRULE_3RD_THR && day != (_thr+14))  return E_RANGE ;
   if (m_Rule == HZMONTHRULE_3RD_FRI && day != (_fri+14))  return E_RANGE ;
   if (m_Rule == HZMONTHRULE_3RD_SAT && day != (_sat+14))  return E_RANGE ;
   if (m_Rule == HZMONTHRULE_3RD_SUN && day != (_sun+14))  return E_RANGE ;
   if (m_Rule == HZMONTHRULE_4TH_MON && day != (_mon+21))  return E_RANGE ;
   if (m_Rule == HZMONTHRULE_4TH_TUE && day != (_tue+21))  return E_RANGE ;
   if (m_Rule == HZMONTHRULE_4TH_WED && day != (_wed+21))  return E_RANGE ;
   if (m_Rule == HZMONTHRULE_4TH_THR && day != (_thr+21))  return E_RANGE ;
   if (m_Rule == HZMONTHRULE_4TH_FRI && day != (_fri+21))  return E_RANGE ;
   if (m_Rule == HZMONTHRULE_4TH_SAT && day != (_sat+21))  return E_RANGE ;
   if (m_Rule == HZMONTHRULE_4TH_SUN && day != (_sun+21))  return E_RANGE ;
   tmp.SetDate(D.Year(), mon, monlen(D.Year(), mon)) ;
   switch (tmp.Dow())
   {
   case 0: _mon = mlen   ; _tue = mlen-6; _wed = mlen-5; _thr = mlen-4; _fri = mlen-3; _sat = mlen-2; _sun = mlen-1; break ;
   case 1: _mon = mlen-1; _tue = mlen   ; _wed = mlen-6; _thr = mlen-5; _fri = mlen-4; _sat = mlen-3; _sun = mlen-2; break ;
   case 2: _mon = mlen-2; _tue = mlen-1; _wed = mlen   ; _thr = mlen-6; _fri = mlen-5; _sat = mlen-4; _sun = mlen-3; break ;
   case 3: _mon = mlen-3; _tue = mlen-2; _wed = mlen-1; _thr = mlen   ; _fri = mlen-6; _sat = mlen-5; _sun = mlen-4; break ;
   case 4: _mon = mlen-4; _tue = mlen-5; _wed = mlen-6; _thr = mlen-1; _fri = mlen   ; _sat = mlen-6; _sun = mlen-5; break ;
   case 5: _mon = mlen-5; _tue = mlen-4; _wed = mlen-5; _thr = mlen-6; _fri = mlen-1; _sat = mlen   ; _sun = mlen-6; break ;
   case 6: _mon = mlen-6; _tue = mlen-5; _wed = mlen-4; _thr = mlen-3; _fri = mlen-2; _sat = mlen-1; _sun = mlen   ; break ;
   }
   //  if (m_Rule == HZMONTHRULE_LAST_WEEK_DAY,  // Last weekday of month
   //  if (m_Rule == HZMONTHRULE_LAST_WORK_DAY,  // Last workday of month
   if (m_Rule == HZMONTHRULE_LAST_MON && day != _mon)  return E_RANGE ;
   if (m_Rule == HZMONTHRULE_LAST_TUE && day != _tue)  return E_RANGE ;
   if (m_Rule == HZMONTHRULE_LAST_WED && day != _wed)  return E_RANGE ;
   if (m_Rule == HZMONTHRULE_LAST_THR && day != _thr)  return E_RANGE ;
   if (m_Rule == HZMONTHRULE_LAST_FRI && day != _fri)  return E_RANGE ;
   if (m_Rule == HZMONTHRULE_LAST_SAT && day != _sat)  return E_RANGE ;
   if (m_Rule == HZMONTHRULE_LAST_SUN && day != _sun)  return E_RANGE ;
   return E_OK ;
}