[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-devel:11156] Re: Slink-JP Y2K problem (Re: Y2K squash party at this weekend (Re: Re: 書籍))



At Thu, 16 Dec 1999 17:50:46 +0900,
Atsuhito Kohda <kohda@xxxxxxxxxxxxxxxxxxxx> wrote:

> > というわけで ざっとですけど ひととおり(*)チェックしました。
> > http://www.debian.or.jp/y2k/ にあります。
> 
> Y2K 問題といわれても理解できてないのですが(^^;
> mnews と tkdesk-ja がリストにあるようです。どう
> したら良いのでしょうか?
> 
> mnews は PL5 のドキュメントに確かに PL4 までは
> 対応してないと書いてあった記憶はあります。
> 問答無用で PL5 を作るのでしょうか?

そうです。upstream で fix されてればそれで作りなおしてください。
 
> tkdesk は 1.2 になってますが対応してるのかどうか
> 知りません。slink の tcl/tk は 7.6/4.2-ja だった
> と思いますが、これで作れるかどうかも判ってません
> が、緊急事態なんでしょうか?

tkdesk-ja は表示が変になるだけのような感じなので
それほど critical ではないかも…

ちなみに slink-jp の tkdesk-ja のソースを見ると

libdesk/dsk_ls.c;

char *file_time (filetime)
time_t filetime;
{
    time_t curtime;
    struct tm *filetmp, *curtmp, filetm, curtm;
    static char timestr[32];

    time (&curtime);
    filetmp = gmtime (&filetime);
    filetm.tm_year = filetmp->tm_year;
    filetm.tm_yday = filetmp->tm_yday;
    curtmp = gmtime (&curtime);
    curtm.tm_year = curtmp->tm_year;
    curtm.tm_yday = curtmp->tm_yday;

    strncpy (timestr, ctime (&filetime) + 4, 12);
    if ((filetm.tm_year == curtm.tm_year &&
         (curtm.tm_yday - filetm.tm_yday) < 182) ||
        (filetm.tm_year == curtm.tm_year - 1 &&
         filetm.tm_yday > (182 + curtm.tm_yday)))
        timestr[12] = '\0';
    else {
        timestr[6] = '\0';
        strcat (timestr, " 19");		/* <-- [1] */
        strcat (timestr, itoa (filetm.tm_year));
    }

    return timestr;
} /* file_time */

[1] のところで何もかんがえずに 19 にしてます。
gmtime(3)は 2000年は tm_year を 100 にしますから (tm_yearは1900年からの年数)
2000 年は 19100 となりますね。
# しかも 182日後?

libdesk/misc.c; 

int dsk_localtime_Cmd (clientData, interp, argc, argv)
    ClientData clientData;
    Tcl_Interp *interp;
    int argc;
    char *argv[];
{
    time_t t;
    struct tm *ts;
    char buf[10];

    t = time (NULL);
    ts = localtime (&t);

    sprintf (buf, "%02d ", ts->tm_sec);
    Tcl_AppendResult (interp, "sec ", buf, NULL);
    sprintf (buf, "%02d ", ts->tm_min);
    Tcl_AppendResult (interp, "min ", buf, NULL);
    sprintf (buf, "%02d ", ts->tm_hour);
    Tcl_AppendResult (interp, "hour ", buf, NULL);

    sprintf (buf, "%d ", ts->tm_mday);
    Tcl_AppendResult (interp, "mday ", buf, NULL);
    sprintf (buf, "%d ", ts->tm_mon);
    Tcl_AppendResult (interp, "mon ", buf, NULL);
    sprintf (buf, "%d ", ts->tm_year % 100);		/* <-- [2] */
    Tcl_AppendResult (interp, "year ", buf, NULL);
    
    sprintf (buf, "%d ", ts->tm_wday);
    Tcl_AppendResult (interp, "wday ", buf, NULL);
    sprintf (buf, "%d ", ts->tm_yday);
    Tcl_AppendResult (interp, "yday ", buf, NULL);
    sprintf (buf, "%d ", ts->tm_isdst);
    Tcl_AppendResult (interp, "isdst ", buf, NULL);

    return (TCL_OK);
} /* dsk_localtime_Cmd */

[2] のところで 100 でわったあまりにしているので
2000年になると 00 になります。桁数が問題ではないのなら
ここは ts->tm_year + 1900 を使った方がよいと思います。
# この結果がどう使われているかまでは見ていません。

-- 
鵜飼文敏