pike.git / lib / modules / Calendar.pmod / Badi.pmod

version» Context lines:

pike.git/lib/modules/Calendar.pmod/Badi.pmod:2:      //! This is the Badi calendar,   //! used in the Baha'i religion.      inherit Calendar.YMD:YMD;      #include "constants.h"      string calendar_name() { return "Badi"; }    - private static mixed __initstuff=lambda() + private protected mixed __initstuff=lambda()   {    f_week_day_shortname_from_number="badi_week_day_shortname_from_number";    f_week_day_name_from_number="badi_week_day_name_from_number";    f_year_name_from_number="badi_year_name_from_number";    f_week_day_number_from_name="badi_week_day_number_from_name";       f_month_day_name_from_number="badi_month_day_name_from_number";    f_month_name_from_number="badi_month_name_from_number";    f_month_shortname_from_number="badi_month_shortname_from_number";    f_month_number_from_name="badi_month_number_from_name";    f_week_name_from_number="week_name_from_number";    f_year_number_from_name="badi_year_number_from_name";    dwim_year=([ "past_lower":0, "past_upper":0,    "current_century":0, "past_century":0 ]);   }();    - static int year_leap_year(int y) + protected int year_leap_year(int y)   {    // the beginning of the year is the day of the spring equinox    // leap years are those where an extra day is needed to get up to the next    // spring equinox.    // for now this rule is not in effect and the start of the year is march    // 21st. leap years are thus compatible with the gregorian calendar for the    // time being.    y+=1844;    return (!(((y)%4) || (!((y)%100) && ((y)%400))));   }      // [y,yjd] - static array year_from_julian_day(int jd) + protected array year_from_julian_day(int jd)   {    // in order to avoid coming up with a formula for leapyears in the bahai    // calendar we add the necessary offsets to the data so we can use the take    // the gregorian formula    // gregorian year starts 286 days later march 21st -> january 1st    int d=jd+286-1721426;       int century=(4*d+3)/146097;    int century_jd=(century*146097)/4;    int century_day=d-century_jd;    int century_year=(100*century_day+75)/36525;       return    ({    (century*100+century_year+1)-1844, // but 1844 years earlier    1721426-286+century_year*365+century_year/4+century_jd,    });   }    - static int julian_day_from_year(int y) + protected int julian_day_from_year(int y)   {    // FIXME: verify for leapyears (esp: 56 (1900) and 100, ...)    // same as above    y+=1843; // above we are adding days and subtracting years,    // going back we need to subtract days and add years.    return 1721426-286+y*365+y/4-y/100+y/400;   }    - static int compat_week_day(int n) + protected int compat_week_day(int n)   {    // this is specific to the gregorian calendar.    // we just stick with the value as it is    return n;   }    - static array(int) year_month_from_month(int y,int m) + protected array(int) year_month_from_month(int y,int m)   {   // [y,m,ndays,myd]       y+=(m-1)/19;    m=1+(m-1)%19;       switch (m)    {    case 1..17: return ({y,m,19,(m-1)*19+1});    case 18: return ({y,m,23+year_leap_year(y),(m-1)*19+1});    case 19: return ({y,m,19,347+year_leap_year(y)});    }       error("Month out of range.\n");   }    - static array(int) month_from_yday(int y,int yd) + protected array(int) month_from_yday(int y,int yd)   {   // [month,day-of-month,ndays,month-year-day]    if (yd<1)    return month_from_yday(--y, yd+365+year_leap_year(y));    int ly = year_leap_year(y);    switch (yd)    {    case 1..323: return ({(yd+18)/19, (yd+18)%19+1, 19, ((yd+18)/19-1)*19+1});    case 324..342: return ({18, (yd+18)%19+1, 23+ly, ((yd+18)/19-1)*19+1 });    case 343..346: return ({18, yd%19+19, 23+ly, ((yd)/19-1)*19+1 });    case 347: if(ly) return ({18, yd%19+19, 23+ly, ((yd)/19-1)*19+1 });    case 348..365: return ({19, yd-346-ly, 19, 347+ly});    case 366: if(ly) return ({19, yd-346-ly, 19, 347+ly});    }    error("yday out of range.\n");   }    - static array(int) week_from_julian_day(int jd) + protected array(int) week_from_julian_day(int jd)   {   // [year,week,day-of-week,ndays,week-julian-day]       [int y,int yjd]=year_from_julian_day(jd);    int yday=jd-yjd+1;    int wjd=jd-(jd+2)%7; // +2 is the offset from the julian day week    // starting on monday.       int k=4+(yjd-2)%7;    int w=(yday+k-1)/7;
pike.git/lib/modules/Calendar.pmod/Badi.pmod:136:    {   // handle the case that the week is in the next year    y++;    w=1;    }       //werror("jd %d: y%O yjd%O yday%O, k%O w%O wjd%O, wd%O:%O\n",jd,y,yjd,yday,k,w,wjd, 1+(jd+2)%7, 1+(1+yjd+yday)%7);    return ({y,w,1+(1+yjd+yday)%7,7,wjd});   }    - static array(int) week_from_week(int y,int w) + protected array(int) week_from_week(int y,int w)   {   // [year,week,1 (wd),ndays,week-julian-day]       int yjd=julian_day_from_year(y);    int wjd=-6+yjd-(yjd+3)%7;   // int wjd=-7+yjd-(yjd+2)%7;       werror("%t: %O, %O, %O, %O\n", this, y, w, wjd, wjd+w*7);    if (w<1 || w>52) // may or may not be out of this year    return week_from_julian_day(wjd+w*7);       return ({y,w,1,7,wjd+w*7});   // fixme   }      // identical to gregorian - static int year_remaining_days(int y,int yday) + protected int year_remaining_days(int y,int yday)   {    return 365+year_leap_year(y)-yday;   }      //! function method int daystart_offset()   //! Returns the offset to the start of the time range object   //!   int daystart_offset()   {    return -21600; // 6 hours earlier
pike.git/lib/modules/Calendar.pmod/Badi.pmod:177:   {    inherit YMD::cFraction;       TimeRange make_base()    {    base=Day("unix_r",ux-daystart_offset(),rules);    if (len) base=base->range(Day("unix_r",ux-daystart_offset()+len,rules));    return base;    }    -  static void make_local() +  protected void make_local()    {    ::make_local();    ls+=daystart_offset();    }   }      class cSecond   {    inherit YMD::cSecond;       TimeRange make_base()    {    base=Day("unix_r",ux-daystart_offset(),rules);    if (len) base=base->range(Day("unix_r",ux-daystart_offset()+len,rules));    return base;    }    -  static void make_local() +  protected void make_local()    {    ::make_local();    ls+=daystart_offset();    }   }      class cMinute   {    inherit YMD::cMinute;       TimeRange make_base()    {    base=Day("unix_r",ux-daystart_offset(),rules);    if (len) base=base->range(Day("unix_r",ux-daystart_offset()+len,rules));    return base;    }    -  static void make_local() +  protected void make_local()    {    ::make_local();    ls+=daystart_offset();    }      /*    int unix_time()    {    int offset=daystart_offset();    int minuteoffset=offset%60;
pike.git/lib/modules/Calendar.pmod/Badi.pmod:244:   {    inherit YMD::cHour;       TimeRange make_base()    {    base=Day("unix_r",ux-daystart_offset(),rules);    if (len) base=base->range(Day("unix_r",ux-daystart_offset()+len,rules));    return base;    }    -  static void make_local() +  protected void make_local()    {    ::make_local();    ls+=daystart_offset();    }      /*    int unix_time()    {    int houroffset=daystart_offset()%3600;    if(houroffset>1800)
pike.git/lib/modules/Calendar.pmod/Badi.pmod:317:    month_day_name(),month_shortname(), month_no(),    year_name());    }   }      class cWeek   {    inherit YMD::cWeek;       // identical to gregorian -  static int weeks_to_week(int y2,int w2) +  protected int weeks_to_week(int y2,int w2)    {    [int y3,int w3,int wd2,int nd2,int jd2]=week_from_week(y2,w2);    werror("%t: %O, %O, %O, %O, %O\n", this, y2, w2, jd2, jd, (jd2-jd)/7);    return (jd2-jd)/7;    }       int unix_time()    {    return ::unix_time()+daystart_offset();    }
pike.git/lib/modules/Calendar.pmod/Badi.pmod:339:    int number_of_days()    {    return 7*n;    }   }      class cMonth   {    inherit YMD::cMonth;    -  static int months_to_month(int y2,int m2) +  protected int months_to_month(int y2,int m2)    {    return (y2-y)*19+(m2-m);    }       int unix_time()    {    return ::unix_time()+daystart_offset();    }       string nice_print()
pike.git/lib/modules/Calendar.pmod/Badi.pmod:475:    }   }      class Vahid   {    inherit YMD;    constant is_vahid=1;    int v; // vahid    int vjd; // julian day of the first day of the vahid    -  static void create(mixed ...args) +  protected void create(mixed ...args)    {    if (!sizeof(args))    {    create_now();    v=y/19+1;    y=v*19-18;    return;    }    else switch (args[0])    {