| Return Type | Function name | Arguments |
|---|---|---|
| hzEcode | hzCron::Advance | (hzXDate&,unsigned int,) |
Declared in file: hzCron.h
Defined in file : hzCron.cpp
Function Logic:
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 ;
}