Problems with INN-2.2.3 and SuSE6.4
Tom Kacvinsky
tjk at ams.org
Mon Dec 11 04:23:03 UTC 2000
Oopsie! My first stab didn't catch things like yyYear = 2001, $4 = 100.
Here is better take (with results below). Again, note the dependence on yyYear
being initialized to 1900 + (years since 1900). yyIn corresponds to $4.
Tom
-- Cut here --
#include <stdlib.h>
typedef struct year_struct {
int fouryear;
int year;
} year;
int main () {
int yyYear = 2000 ;
int yyIn = 99 ;
int i;
year Years[] = {
{2000, 97}, {2000, 98}, {2000, 99}, {2000, 100}, {2000, 101}, {2001, 99},
{2001, 100}, {2001, 101}, {2002, 101}, {2002, 102}, {2098, 198}, {2099, 199}
};
for (i = 0; i < 12; i++ ) {
yyIn = Years[i].year ;
yyYear = Years[i].fouryear ;
if (yyIn > 199) {
yyYear = yyIn ;
} else {
if ( yyIn >= 100) {
yyYear = 1900 + yyIn ;
} else {
yyYear = yyIn + (yyYear / 100 + (yyYear % 100 - yyIn) / 50) * 100 ;
}
}
printf ("Four digit year: %d, Short Year: %d, Result: %d.\n", Years[i].fouryear, Years[i].year, yyYear) ;
}
return (0) ;
}
sun06> ./year
Four digit year: 2000, Short Year: 97, Result: 1997.
Four digit year: 2000, Short Year: 98, Result: 1998.
Four digit year: 2000, Short Year: 99, Result: 1999.
Four digit year: 2000, Short Year: 100, Result: 2000.
Four digit year: 2000, Short Year: 101, Result: 2001.
Four digit year: 2001, Short Year: 99, Result: 1999.
Four digit year: 2001, Short Year: 100, Result: 2000.
Four digit year: 2001, Short Year: 101, Result: 2001.
Four digit year: 2002, Short Year: 101, Result: 2001.
Four digit year: 2002, Short Year: 102, Result: 2002.
Four digit year: 2098, Short Year: 198, Result: 2098.
Four digit year: 2099, Short Year: 199, Result: 2099.
On Sun, 10 Dec 2000, Tom Kacvinsky wrote:
>
> Hi,
>
> When the code Russ quotes is invoked, yyYear is 2000 (yyYear is initialized to
> tm->tm_year + 1900 later in the code, which [on a Solaris box] is 1900 + 100 =
> 2000). With $4 = 99, the code works and yyYear is set to 1999. When $4 = 100,
> the year returned is 1900. It looks like the code is broken in case $4 = 100.
> I think it is broken when $4 = 101, even. Think about it. As the code is
> written when $4 > 100, the year returned is 101. Why should we worry about
> this? Because the news clients that are writing out 100 for the year 2000 are
> most likely going to write out 101 for the year 2001.
>
> We probably need to consider 3 caes:
>
> case 1: 0 <= $4 < 100
>
> case 2: 100 <= $4 <= 199
>
> case 3: 199 < $4
>
> I chose 199 as the cutoff because by 2099, one would hope that clients no longer
> write out 20xx as 1xx, and 2099 is the last year of the form 20xx that can be
> erroneously written as 1xx. I hope that makes sense! I have been trying ot
> find a terse wording of this for the last 1/2 hour. Blame the mathematician in
> me!
>
> Something like this:
>
> if ($4 > 199) {
> yyYear = $4;
> } else {
> yyYear = $4 + (yyYear / 100 + (yyYear % 100 - $4) / 50) * 100;
> if ($4 >= 100)
> yyYear = yyYear + 100;
> }
>
> Below is some sample code, and the results. Please note, I do not know if
> yyYear will always be initialized to 1900 + (numbers of years since 1900). This
> is the weak link in the code below.
>
> Tom
>
> -- cut here --
> #include <stdlib.h>
>
>
> typedef struct year_struct {
> int fouryear;
> int year;
> } year;
>
> int main () {
>
> int yyYear = 2000 ;
> int yyIn = 99 ;
> int i;
>
> year Years[] = {{2000,97}, {2000,98}, {2000,99}, {2000,100}, {2000,101}, {2001,101}, {2002,102}, {2098,198}, {2099,199}};
>
> for (i = 0; i < 9; i++ ) {
> yyIn = Years[i].year ;
> yyYear = Years[i].fouryear ;
>
>
> if (yyIn > 199) {
> /* assume year is YYYY format, so need not to add 1900 */
> yyYear = yyIn ;
> } else {
>
> /* assume year is YY format, so need to add 1900 */
> yyYear = yyIn + (yyYear / 100 + (yyYear % 100 - yyIn) / 50) * 100 ;
>
> if ( yyIn >= 100)
> yyYear = yyYear + 100 ;
>
> }
>
> printf ("Four digit year: %d, Short Year: %d, Result: %d.\n", Years[i].fouryear, Years[i].year, yyYear) ;
>
> }
>
> return (0) ;
>
> }
>
> sun06> ./year
> Four digit year: 2000, Short Year: 97, Result: 1997.
> Four digit year: 2000, Short Year: 98, Result: 1998.
> Four digit year: 2000, Short Year: 99, Result: 1999.
> Four digit year: 2000, Short Year: 100, Result: 2000.
> Four digit year: 2000, Short Year: 101, Result: 2001.
> Four digit year: 2001, Short Year: 101, Result: 2001.
> Four digit year: 2002, Short Year: 102, Result: 2002.
> Four digit year: 2098, Short Year: 198, Result: 2098.
> Four digit year: 2099, Short Year: 199, Result: 2099.
>
> Tom
>
> >
> > Hm. Looking at parsedate.y in 2.3, there are actually a whole bunch of
> > places that should be handling this:
> >
> > if ($4 > 100) {
> > /* assume year is YYYY format, so need not to add 1900 */
> > yyYear = $4;
> > } else {
> > /* assume year is YY format, so need to add 1900 */
> > yyYear = $4 + (yyYear / 100 + (yyYear % 100 - $4) / 50) * 100;
> > }
> >
> > I'm not sure why it's not doing what you want. Hurm. Although I also
> > have no idea what that formula is really doing, since it's not obviously
> > just adding 1900.
> >
> >
>
>
>
>
>
>
More information about the inn-workers
mailing list