/*****************************************************
 使っているコンパイラの日付処理が2038問題を抱えているか
 簡単なテストルーチンです。
  1.1971年〜 2106年迄　１日毎ににlocaltimeを呼び出してみる
  2.stimeで2100年にしてもてtimeで読んでみる
 だけです。
******************************************************/
#include <stdio.h>
#include <time.h>
#include <limits.h>
#define _DAY1 (24uL*60uL*60uL)
int DaysInYear(int y) /*西暦y年は何日あるか*/
{
 if( (y%4)!=0) return 365;  /*4で割れなければ必ず１年は365日*/
 if( (y%400)==0) return 366;/*400で割れた年は 閏*/
 if( (y%100)==0) return 365;/*100で割れた年は 365日*/
 return 366;                /*でなければ閏*/
}
int DaysInMonth(int y,int m) /*西暦y年m月は何日あるか*/
{                     
 if(DaysInYear(y)==365)    /*1  2  3  4  5  6  7  8  9 10 11 12*/
  {const static char tbl[]={31,28,31,30,31,30,31,31,30,31,30,31};
   return tbl[m-1];
  }else
  {static const char tbl[]={31,29,31,30,31,30,31,31,30,31,30,31};
   return tbl[m-1];
  }
}
int YDAYtoMM(int y,int d) /*西暦y年の元旦から何日目は何月か*/
{  int m=1;
   while(d>=DaysInMonth(y,m))d-=DaysInMonth(y,m++);
   return m;
}
int YDAYtoDD(int y,int d) /*西暦y年の元旦から何日目は月の何日か*/
{  int m=1;
   while(d>=DaysInMonth(y,m))d-=DaysInMonth(y,m++);
   return d+1;
}

int main()
{
struct tm tm1;
time_t time1,savet; 
int  y,d;
int flag=0,ey,ed;
 if(sizeof tm1 == 32/CHAR_BIT )
   { printf("time_tは%dbit環境です\n",(sizeof(time_t))*CHAR_BIT);
     printf("%s\n","判定は出来ませんが、まず大丈夫でしょう");
     return 1;
   }
 if((time_t)-1 > 0)  printf("%s\n","time_tは符号無し整数環境です");

 time1=_timezone +(time_t)DaysInYear(1970)*_DAY1;  
 for(y=1971;y<2106;y++)
  {
  printf("%4d",y);
    for(d=0;d<DaysInYear(y);d++,time1+=_DAY1)
    {
     tm1=*localtime(&time1);
     if(tm1.tm_year+1900!=y 
     || tm1.tm_mday  != YDAYtoDD(y,d)
     || tm1.tm_mon +1!= YDAYtoMM(y,d) )  
     if(flag==0) { flag=2;ey=y,ed=d; }
    }
  printf("%s","\b\b\b\b");
  }
 if(flag)
   printf("localtimeは%d年%d月%d日から正しくない\n",
                      ey,YDAYtoMM(ey,ed),YDAYtoDD(ey,ed));
   
  printf("%s\n","--今から日付をctimeで2100年１月１日に変更してみます--!!");
  {char buf[8]; fgets(buf,7,stdin);}
  time(&savet);
  time1=_timezone + (47482uL*_DAY1);
  stime(&time1);  time(&time1);
  printf("ctime=%s\n",  ctime(&time1));
  stime(&savet);
 if( (unsigned long)time1-(unsigned long)(47482uL*_DAY1) > 3)
   {
    printf("%s\n","stimeで2100年を設定出来ないかtimeが正しくない");
    return 3;
   }
 return flag;
}

