diff --git a/lib/modules/Calendar.pmod/Event.pmod b/lib/modules/Calendar.pmod/Event.pmod index ecd8edb15e1fdca40384bc53fa50eae3eab57323..8d027058ea9664347d8b5d724bd6417d5631bf2e 100644 --- a/lib/modules/Calendar.pmod/Event.pmod +++ b/lib/modules/Calendar.pmod/Event.pmod @@ -155,18 +155,21 @@ class Day_Event // find TimeRange next(TimeRange from,void|int(0..1) including) { - int jd=(int)(from->julian_day())+!including; - jd=scan_jd(from->calendar(),jd,1); - if (jd==NODAY) return 0; + int jd; + if (including) jd=(int)(from->julian_day()); + else jd=(int)(from->end()->julian_day()); + jd=scan_jd(from->calendar(),jd-nd+1,1); return (from->calendar()->Day)("julian_r",jd,from->ruleset())*nd; } TimeRange previous(TimeRange from,void|int(0..1) including) { - float|int jd=from->julian_day(); - if (floatp(jd)) jd=(int)ceil(jd); - if (!including) jd--; - jd=scan_jd(from->calendar(),jd,-1); + int jd; + if (including) jd=(int)(from->end()->julian_day()); + else jd=(floatp(from->julian_day()) + ?(int)floor(from->julian_day()) + :(from->julian_day()-1)); + jd=scan_jd(from->calendar(),jd+nd-1,-1); if (jd==NODAY) return 0; return (from->calendar()->Day)("julian_r",jd,from->ruleset())*nd; } @@ -446,8 +449,7 @@ class Gregorian_Fixed mn=_mn; yd=M_YD[mn]+md; -// if (sizeof(_n)) nd=_n[0]; - nd=1; + if (sizeof(_n)) nd=_n[0]; } int scan_jd(Calendar realm,int jd,int(-1..1) direction) @@ -455,18 +457,24 @@ class Gregorian_Fixed [int y,int yjd,int leap]=gregorian_yjd(jd); int njd; - if (leap && yd>59) - njd=yjd+yd; - else - njd=yjd+yd-1; // yd start with 1 - - if (direction==1) + for (;;) { - if (njd>=jd) return njd; - return scan_jd(realm,yjd+365+leap,1); + if (leap && yd>59) + njd=yjd+yd; + else + njd=yjd+yd-1; // yd start with 1 + + if (direction==1) + { + if (njd>=jd) return njd; + [y,yjd,leap]=gregorian_year(y+1); + } + else + { + if (njd<=jd) return njd; + [y,yjd,leap]=gregorian_year(y-1); + } } - if (njd<=jd) return njd; - return scan_jd(realm,yjd-1,-1); } string describe()