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

version» Context lines:

pike.git/lib/modules/Calendar.pmod/Timezone.pmod:194:   object runtime_timezone_compiler=0;      static private Ruleset.Timezone _magic_timezone(string tz)   {    float d;    string z;       if (!runtime_timezone_compiler)    runtime_timezone_compiler=Runtime_timezone_compiler();    +  int t=time(1); +  float t1=time(t);    object p=runtime_timezone_compiler->find_zone(tz); -  +  float t2=time(t); +  werror("%O\n",t2-t1);    if (p) return p;       if (sscanf(tz,"%s+%f",z,d)==2)    return _make_new_timezone(z,d);    if (sscanf(tz,"%s-%f",z,d)==2)    return _make_new_timezone(z,-d);    if ((z=_military_tz[tz])) return `[](z);    return ::`[](replace(tz,"-/+"/1,"__p"/1));   }   
pike.git/lib/modules/Calendar.pmod/Timezone.pmod:450:    return 0; // no       return 0;    }       string dump(int lastoffset,multiset ys)    {    string t;    array z=(array)ys;    int l=is_leap_year(z[0]); +  +  if (dayrule=="0" && time==0 && offset==0 && s=="") +  return sprintf("%-40s, // %s", " ZEROSHIFT",comment); +     foreach (z[1..],int y) if (is_leap_year(y)!=l) { l=2; break; }    switch (timetype)    {    case "s": t=sprintf("UO%+d",time); break;    case "u": t=""+time; break;    case "w": t=sprintf("UO%+d",(time-lastoffset)); break;    default: error("illegal state\n");    }    string r=dayrule;    if (l!=2)
pike.git/lib/modules/Calendar.pmod/Timezone.pmod:536:    Shift last=Shift(({"0","?",0,"u",0,"?"}));    Shift first=last;    string res="";       if (!r2[NUL_YEAR]) r2[NUL_YEAR]=({last});       int y=min(@indices(rules));    for (;y<=INF_YEAR; y++)    [r2[y],last]=mkperiods(rules[y],last,first);    +  werror("%O\n",last); +     res+=    TZrules_init+    "import __Calendar_mkzone;\n"    " inherit TZRules;\n" -  " static array(array(string|int)) jd_year_periods(int jd)\n" +  " array(array(string|int)) jd_year_periods(int jd)\n"    " {\n"    " [int y,int yjd,int leap]=gregorian_yjd(jd);\n"    " switch (y)\n"    " {\n";       string s="",t;       int y,mn=min(@indices(rules-(<NUL_YEAR>)));       for (y=INF_YEAR;sizeof(r2);y--)
pike.git/lib/modules/Calendar.pmod/Timezone.pmod:612:    array resa=res/"\n";    resa[-2]=replace(resa[-2],", ","});");       t+=resa[..sizeof(resa)-2]*"\n"+"\n";    s=t+s;    }    res+=(s+    " }\n"    " }\n");    +  res+=("\n" +  "array(string) rule_s=\n"); +  +  multiset tzname=(<>); +  foreach (values(rules),array(Shift)|object(Shift) s) +  if (arrayp(s)) foreach (s,Shift s) tzname[s->s]=1; +  else tzname[s->s]=1; +  +  res+=("({"+map((array)tzname, +  lambda(string s) { return sprintf("%O",s); })*"," +  +"});\n"); +     return res;    }       int join_periods(array s,array t,int y0,int y1)    {    if (equal(s,t))    return 1;    if (sizeof(s)!=sizeof(t)) return 0;    if (s[0]!=t[0]) return 0;    // try promote
pike.git/lib/modules/Calendar.pmod/Timezone.pmod:807:    {    if (!a[5]) a[5]=rule_shift(a);       string s="";    sscanf(a[3],"%s#%*[ \t]%s",a[3],s);    a[3]="from "+reverse(array_sscanf(reverse(a[3]),"%*[ \t]%s")[0]);    a[7]=s;    }       array last=rules[-1]; -  int n=sizeof(rules); +     foreach (reverse(rules)[1..],array a)    {    res+=sprintf(" if (ux>=%s) // %s %s\n"    " return %s || (%s=%s);\n",    a[5],a[3],last[7],last[6],last[6],last[4]); -  n--; +     last=a;    }    if (last[7]!="")    res+=sprintf(" // %s\n",last[7]);    res+=sprintf(" return %s || (%s=%s);\n",    last[6],last[6],last[4]);       res+=("}\n");    -  +  multiset tzname=(<>); +  foreach (rules,array a) +  if (search(a[2],"%s")==-1) +  tzname[a[2]]=1; +  else +  { +  program r=find_rule(a[1]); +  foreach (r(0,a[2])->rule_s,string s) +  tzname[sprintf(a[2],s)]=1; +  } +  +  res+=("array(string) zone_s=({"+map((array)tzname, +  lambda(string s) { return sprintf("%O",s); })*"," +  +"});\n"); +  +  res+="array(int) shifts=({"; +  foreach (rules[..sizeof(rules)-2],array a) +  { +  res+=a[5]+","; +  } +  res+="});\n"; +  +     return res;    }    }       string base_path=combine_path(__FILE__,"../tzdata/");    array files=    ({    "africa",    "antarctica",    "asia",
pike.git/lib/modules/Calendar.pmod/Timezone.pmod:868:    {    function(string:mixed) f;    mixed `[](string s) { return f(s); }    void create(function(string:mixed) _f) { f=_f; }    }       mapping mkzonemod=    (["TZrules":Dummymodule(find_rule),    "TZRules":TZRules,    "TZHistory":TZHistory, -  "Ruleset":Ruleset]); +  "Ruleset":Ruleset, +  "ZEROSHIFT":({0,0,0,""})]);    -  + #define RTTZC_DEBUG +     object find_zone(string s)    {   #ifdef RTTZC_DEBUG    werror("Searching for zone %O\n",s);   #endif    if (zone_cache[s]) return zone_cache[s];       if (!all_rules) all_rules=get_all_rules();    -  + #ifdef RTTZC_DEBUG +  int t=time(1); +  float t1=time(t); + #endif +     Zone z=Zone(s);    int n=0;    for (;;)    {    n=search(all_rules,s,n);   #ifdef RTTZC_DEBUG    werror("hit at: %O\n",n);   #endif    if (n==-1)    return ([])[0];    int i=max(n-100,0)-1,j;    do i=search(all_rules,"\nZone",(j=i)+1); while (i<n && i!=-1);    -  if (j<n && i!=-1 && +  if (j<n &&    sscanf(all_rules[j..j+8000],"\nZone%*[ \t]%[^ \t]%*[ \t]%s\n%s",    string a,string b,string q)==5 &&    a==s)    {    z->add(b);    foreach (q/"\n",string line)    if (sscanf(line,"%*[ \t]%[-0-9]%s",a,b)==3 && strlen(a))    z->add(a+b);    else    break; // end of zone    break;    }    i=max(n-100,0)-1;    do i=search(all_rules,"\nLink",(j=i)+1); while (i<n && i!=-1); -  if (j<n && i!=-1 && +  if (j<n &&    sscanf(all_rules[j..j+100],"\nLink%*[ \t]%[^ \t]%*[ \t]%[^ \t\n]",    string a,string b)==4 &&    b==s)    return find_zone(a);    n++;    }    string c=z->dump();      #ifdef RTTZC_DEBUG -  +  float t2=time(t); +  werror("find %O: %O\n",s,t2-t1); + #endif +  + #ifdef RTTZC_DEBUG    werror("%s\n",c);   #endif       add_constant("__Calendar_mkzone",mkzonemod);       program p=compile_string(c);    object zo=p();    if (zo->thezone) zo=zo->thezone;    -  + #ifdef RTTZC_DEBUG +  float t3=time(t); +  werror("compile %O: %O\n",s,t3-t2); + #endif +     return zone_cache[s]=zo;    }       program find_rule(string s)    {    s=UNFIXID(s);    if (rule_cache[s]) return rule_cache[s];   #ifdef RTTZC_DEBUG    werror("Searching for rule %O\n",s);   #endif       if (!all_rules) all_rules=get_all_rules();    -  + #ifdef RTTZC_DEBUG +  int t=time(1); +  float t1=time(t); + #endif +     Rule r=Rule(s);    int n=0;    for (;;)    {    n=search(all_rules,s,n);   #ifdef RTTZC_DEBUG    werror("hit at: %O\n",n);   #endif    if (n==-1)    return ([])[0]; -  string t=all_rules[n-20..n+8000]; // dummy limit to speed up +     -  if (sscanf(t,"%*s\nRule%*[ \t]%[^ \t]%*[ \t]%s\n%s", -  string a,string b,t)==6 && a==s) +  int i=max(n-100,0)-1,j; +  do i=search(all_rules,"\nRule",(j=i)+1); while (i<n && i!=-1); +  +  if (j<n && +  sscanf(all_rules[j..j+8000],"\nRule%*[ \t]%[^ \t]%*[ \t]%s\n%s", +  string a,string b,string q)==5 && a==s)    {    r->add(b); -  foreach (t/"\n",string line) + #ifdef RTTZC_DEBUG +  float tf=time(t); +  werror("find %O at: %O\n",s,tf-t1); + #endif +  foreach (q/"\n",string line)    if (sscanf(line,"Rule%*[ \t]%[^ \t]%*[ \t]%s",a,b)==4 &&    a==s)    r->add(b);    else    break; // end of zone -  + #ifdef RTTZC_DEBUG +  float tf=time(t); +  werror("done %O at: %O\n",s,tf-t1); + #endif    break;    }    n++;    }    string c=r->dump();      #ifdef RTTZC_DEBUG    werror("%s\n",c);   #endif -  + #ifdef RTTZC_DEBUG +  float t2=time(t); +  werror("find %O: %O\n",s,t2-t1); + #endif       add_constant("__Calendar_mkzone",mkzonemod);       program p=compile_string(c); -  +  + #ifdef RTTZC_DEBUG +  float t3=time(t); +  werror("compile %O: %O\n",s,t3-t2); + #endif +     return rule_cache[s]=p;    }          int main(int ac,array(string) am)    {    map(am[1..],find_zone);    return 0;    }