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

version» Context lines:

pike.git/lib/modules/Calendar.pmod/YMD.pike:62:    int n; // number of this in the period       int jd; // julian day of first day    int yd; // day of year (1..)    int m; // [*] month of year (1..12?), like    int md; // [*] day of month (1..)    int wy; // [*] week year    int w; // [*] week of week year (1..)    int wd; // [*] day of week (1..7?)    -  int mnd=CALUNKNOWN; // days in current month +  int mnd=CALUNKNOWN; // [*] days in current month    int utco=CALUNKNOWN; // [*] distance to UTC    string tzn=0; // timezone name    - // // ^^^ might be uninitialized (CALUNKNOWN) +  // [*]: might be uninitialized (CALUNKNOWN)       .Ruleset rules;    constant is_ymd=1;      // ----------------------------------------   // basic Y-M-D stuff   // ----------------------------------------       void create_now()    {
pike.git/lib/modules/Calendar.pmod/YMD.pike:102:    else if (uxo==0)    utco=mutco,tzn=mtzn; // reuse, it *is* start of day    }       void make_month() // set m and md from y and yd    {    int myd;    [m,md,mnd,myd]=month_from_yday(y,yd);    }    -  void make_week() // set w from y and yd +  void make_week() // set wy, w and wd from jd    {    int wnd,wjd;    [wy,w,wd,wnd,wjd]=week_from_julian_day(jd);    }       int __hash() { return jd; }      // --- query      //! method float fraction_no()
pike.git/lib/modules/Calendar.pmod/YMD.pike:457:       string format_ymd_xshort()    {    if (m==CALUNKNOWN) make_month();    return sprintf("%02d%02d%02d",((yd < 1)?y-1:y)%100,m,md);    }       string format_iso_week()    {    if (w==CALUNKNOWN) make_week(); -  return sprintf("%04d-W%02d",y,w); +  return sprintf("%04d-W%02d",wy,w);    }       string format_iso_week_short()    {    if (w==CALUNKNOWN) make_week(); -  return sprintf("%04d%02d",y,w); +  return sprintf("%04d%02d",wy,w);    }       string format_week()    {    return sprintf("%04d-%s",y,week_name());    }       string format_week_short()    {    return sprintf("%04d%s",y,week_name());
pike.git/lib/modules/Calendar.pmod/YMD.pike:609:    if (yd==1 && t->is_year)    return Year("ymd_y",rules,y,yjd,t->n*n)    ->autopromote();      // months are even on years    if (t->is_year || t->is_month)    {    if (md==CALUNKNOWN) make_month();    if (md==1)    return Month("ymd_yjmw",rules,y,yjd,jd,m, -  t->number_of_months()*n,wd,w) +  t->number_of_months()*n,wd,w,wy)    ->autopromote();    }      // weeks are not    if (t->is_week)    {    if (wd==CALUNKNOWN) make_week();    if (wd==1) return Week("ymd_yjwm",rules,y,yjd,jd,w,t->n*n,md,m,mnd);    }      // fallback on days    if (t->is_ymd)    return Day("ymd_ydmw",rules,y,yjd,jd,yd, -  n*t->number_of_days(),m,md,w,wd,mnd); +  n*t->number_of_days(),m,md,wy,w,wd,mnd);       error("set_size: incompatible class %O\n",    object_program(t));    }       static TimeRange _add(int _n,TimeRange step)    {    if (step->is_ymd)    return _move(_n,step);    if (step->is_timeofday)
pike.git/lib/modules/Calendar.pmod/YMD.pike:1123:    create_now();    return;    }    else switch (args[0])    {    case "ymd_y":    rules=args[1];    y=args[2];    jd=yjd=args[3];    n=args[4]; -  m=md=w=wd=CALUNKNOWN; +  m=md=wy=w=wd=CALUNKNOWN;    yd=1;    return;    case "ymd_yn":    rules=args[1];    y=args[2];    jd=yjd=julian_day_from_year(y);    n=args[3]; -  m=md=w=wd=CALUNKNOWN; +  m=md=wy=w=wd=CALUNKNOWN;    yd=1;    return;    default:    if (intp(args[0]) && sizeof(args)==1)    {    rules=default_rules;    y=args[0];    jd=yjd=julian_day_from_year(y);    n=1; -  m=md=w=wd=CALUNKNOWN; +  m=md=wy=w=wd=CALUNKNOWN;    yd=1;    return;    }    else if (stringp(args[0]))    {    y=default_rules->language[f_year_number_from_name](args[0]);    rules=default_rules;    jd=yjd=julian_day_from_year(y);    n=1; -  m=md=w=wd=CALUNKNOWN; +  m=md=wy=w=wd=CALUNKNOWN;    yd=1;    return;    }    break;       }    rules=default_rules;    ::create(@args);    }       void create_julian_day(int|float _jd)    {    if (floatp(_jd))    create_unixtime_default((int)((jd-2440588)*86400));    else    {    [y,yjd]=year_from_julian_day(_jd);    jd=yjd;    n=1;    md=yd=m=1; -  wd=w=CALUNKNOWN; // unknown +  wy=w=wd=CALUNKNOWN; // unknown    }    }       TimeRange beginning()    {    return Year("ymd_y",rules,y,yjd,0);    }       TimeRange end()    {
pike.git/lib/modules/Calendar.pmod/YMD.pike:1415:    }    else    switch (args[0])    {    case "ymd_ym":    rules=args[1];    y=args[2];    m=args[3];    n=args[4];    md=1; -  w=wd=CALUNKNOWN; +  wy=w=wd=CALUNKNOWN;    [y,m,nd,yd]=year_month_from_month(y,m);    yjd=julian_day_from_year(y);    jd=yjd+yd-1;    if (n!=1) nd=CALUNKNOWN;    nw=CALUNKNOWN;    return;    case "ymd_yjmw":    rules=args[1];    y=args[2];    yjd=args[3];    jd=args[4];    yd=1+jd-yjd;    m=args[5];    n=args[6];    wd=args[7];    w=args[8]; -  +  wy=args[9];    md=1;    nw=nd=CALUNKNOWN;    return;    case "ymd_jd":    rules=args[1];    create_julian_day(args[2]);    n=args[3];    return;    default:    if (intp(args[0]) && sizeof(args)==2)
pike.git/lib/modules/Calendar.pmod/YMD.pike:1468:    create_unixtime_default((int)((jd-2440588)*86400));    else    {    int zmd;    [y,yjd]=year_from_julian_day(jd=_jd);    [m,zmd,nd,yd]=month_from_yday(y,1+jd-yjd);    jd=yd+yjd-1;       n=1;    md=1; -  nw=wd=w=CALUNKNOWN; // unknown +  nw=wd=w=wy=CALUNKNOWN; // unknown    }    }       string _sprintf(int t,mapping m)    {   // return sprintf("month y=%d yjd=%d m=%d jd=%d yd=%d n=%d nd=%d",   // y,yjd,m,jd,yd,n,number_of_days());    switch (t)    {    case 'O':
pike.git/lib/modules/Calendar.pmod/YMD.pike:1514:    if (mo->y==y)    return sprintf("%s..%s %s",    month_shortname(),    mo->month_shortname(),    year_name());    return nice_print()+" .. "+month(-1)->nice_print();    }       cDay beginning()    { -  return Month("ymd_yjmw",rules,y,yjd,jd,m,0,wd,w) +  return Month("ymd_yjmw",rules,y,yjd,jd,m,0,wd,w,wy)    ->autopromote();    }       cDay end()    {    return Month("ymd_ym",rules,y,m+n,0)    ->autopromote();    }      // --- month position and distance
pike.git/lib/modules/Calendar.pmod/YMD.pike:1538:    if (to->is_timeofday)    return hour()->distance(to);       if (to->is_ymd)    {    if (to->is_month || to->is_year)    {    int n1=months_to_month(to->y,to->is_year?1:to->m);    if (n1<0)    error("distance: negative distance (%d months)\n",n1); -  return Month("ymd_yjmw",rules,y,yjd,jd,m,n1,wd,w) +  return Month("ymd_yjmw",rules,y,yjd,jd,m,n1,wd,w,wy)    ->autopromote();    }       int d1=jd;    int d2=to->jd;    if (d2<d1)    error("distance: negative distance (%d days)\n",d2-d1); -  return Day("ymd_ydmw",rules,y,yjd,jd,yd,d2-d1,m,1,w,wd,mnd) +  return Day("ymd_ydmw",rules,y,yjd,jd,yd,d2-d1,m,1,wy,w,wd,mnd)    ->autopromote();    }       error("distance: Incompatible type %O\n",to);    }       static void convert_from(TimeRange other)    {    ::convert_from(other);    if (other->number_of_months)
pike.git/lib/modules/Calendar.pmod/YMD.pike:1639:    ->number_of_weeks();    }       int number_of_months()    {    return n;    }       cMonth set_ruleset(.Ruleset r)    { -  return Month("ymd_yjmw",r,y,yjd,jd,m,n,wd,w); +  return Month("ymd_yjmw",r,y,yjd,jd,m,n,wd,w,wy);    }      // --- needs to be defined       static int months_to_month(int y,int m);   }      // ----------------------------------------------------------------   //! class Week   //! The Calendar week represents a standard time period of
pike.git/lib/modules/Calendar.pmod/YMD.pike:1740:    case "ymd_jd":    rules=args[1];    create_julian_day(args[2]);    n=args[3];    return;    default:    if (intp(args[0]) && sizeof(args)==2)    {    create("ymd_yw",default_rules,args[0],args[1],1);    if (y!=args[0]) -  error("month %d doesn't exist in %d\n",args[1],args[0]); +  error("Week %d doesn't exist in %d\n",args[1],args[0]);    return;    }    break;    }       rules=default_rules;    ::create(@args);    }       void create_julian_day(int|float _jd)
pike.git/lib/modules/Calendar.pmod/YMD.pike:1848:    return Week("ymd_yjwm",rules,y,yjd,jd,w,n1,md,m,mnd)    ->autopromote();    }       if (to->julian_day)    {    int d1=jd;    int d2=to->julian_day();    if (d2<d1)    error("distance: negative distance (%d days)\n",d2-d1); -  return Day("ymd_ydmw",rules,y,yjd,jd,yd,d2-d1,m,md,w,1,mnd) +  return Day("ymd_ydmw",rules,y,yjd,jd,yd,d2-d1,m,md,wy,w,1,mnd)    ->autopromote();    }       error("distance: Incompatible type %O\n",to);    }       static void convert_from(TimeRange other)    {    ::convert_from(other);    if (other->number_of_weeks)
pike.git/lib/modules/Calendar.pmod/YMD.pike:2025:    {    case "ymd_ydmw":    rules=args[1];    y=args[2];    yjd=args[3];    jd=args[4];    yd=args[5];    n=args[6];    m=args[7];    md=args[8]; -  w=args[9]; -  wd=args[10]; -  mnd=args[11]; +  wy=args[9]; +  w=args[10]; +  wd=args[11]; +  mnd=args[12];    nw=CALUNKNOWN;    return;    case "ymd_yd":    rules=args[1];    y=args[2];    yjd=args[3];    jd=args[4];    yd=args[5];    n=args[6]; -  wd=nw=md=m=w=CALUNKNOWN; +  wy=wd=nw=md=m=w=CALUNKNOWN;    return;    case "ymd_jd":    rules=args[1];    create_julian_day(args[2]);    n=args[3]; -  wd=nw=md=m=w=CALUNKNOWN; +  wy=wd=nw=md=m=w=CALUNKNOWN;    return;    case "unix_r":    case "julian_r":    case "unix":    case "julian":    break;    default:    rules=default_rules; -  wd=nw=md=m=w=CALUNKNOWN; +  wy=wd=nw=md=m=w=CALUNKNOWN;    n=1;    switch (sizeof(args))    {    case 1:    if (intp(args[0]))    {    create_julian_day(args[0]);    return;    }    break;
pike.git/lib/modules/Calendar.pmod/YMD.pike:2110:    }    }       rules=default_rules;    ::create(@args);    }       void create_julian_day(int|float _jd)    {    n=1; -  nw=md=m=wd=w=CALUNKNOWN; // unknown +  nw=md=m=wd=w=wy=CALUNKNOWN; // unknown       if (floatp(_jd))    {    create_unixtime_default((int)((jd-2440588)*86400));    }    else    {    [y,yjd]=year_from_julian_day(jd=_jd);    yd=1+jd-yjd;    }
pike.git/lib/modules/Calendar.pmod/YMD.pike:2175:       string nice_print_period()    {   // return nice_print()+" n="+n+"";    if (!n) return nice_print()+" "+minute()->nice_print()+" sharp";    return nice_print()+" .. "+day(-1)->nice_print();    }       cDay beginning()    { -  return Day("ymd_ydmw",rules,y,yjd,jd,yd,0,m,md,w,wd,mnd); +  return Day("ymd_ydmw",rules,y,yjd,jd,yd,0,m,md,wy,w,wd,mnd);    }       cDay end()    {    return Day("ymd_jd",rules,jd+n,0)    ->autopromote();    }       static void convert_from(TimeRange other)    {
pike.git/lib/modules/Calendar.pmod/YMD.pike:2278:    TimeRange distance(TimeRange to)    {    if (to->is_timeofday)    return hour()->distance(to);    if (to->is_ymd)    {    int d1=jd;    int d2=to->jd;    if (d2<d1)    error("distance: negative distance (%d days)\n",d2-d1); -  return Day("ymd_ydmw",rules,y,yjd,jd,yd,d2-d1,m,md,w,wd,mnd) +  return Day("ymd_ydmw",rules,y,yjd,jd,yd,d2-d1,m,md,wy,w,wd,mnd)    ->autopromote();    }       error("distance: Incompatible type %O\n",to);    }      // --- Day to other YMD       int number_of_days()    {
pike.git/lib/modules/Calendar.pmod/YMD.pike:2312:    if (n<=1) return nw=1;       return nw=    Week("julian_r",jd,rules)    ->range(Week("julian_r",jd+n-1,rules))    ->number_of_weeks();    }       cDay set_ruleset(.Ruleset r)    { -  return Day("ymd_ydmw",r,y,yjd,jd,yd,n,m,md,w,wd,mnd); +  return Day("ymd_ydmw",r,y,yjd,jd,yd,n,m,md,wy,w,wd,mnd);    }      // backwards compatible with calendar I    string iso_name() { return format_ymd(); }    string iso_short_name() { return format_ymd_short(); }   }      function(mixed...:cDay) Day=cDay;      //------------------------------------------------------------------------