add back #452876 patch lost on previous commit, Daniel
authorDaniel Veillard <veillard@src.gnome.org>
Tue, 8 Apr 2008 17:05:41 +0000 (17:05 +0000)
committerDaniel Veillard <veillard@src.gnome.org>
Tue, 8 Apr 2008 17:05:41 +0000 (17:05 +0000)
svn path=/trunk/; revision=1466

libexslt/date.c

index 2276778..fef6044 100644 (file)
@@ -2143,7 +2143,7 @@ static double
 exsltDateWeekInYear (const xmlChar *dateTime)
 {
     exsltDateValPtr dt;
-    long fdiy, fdiw, ret;
+    long diy, diw, year, ret;
 
     if (dateTime == NULL) {
 #ifdef WITH_TIME
@@ -2161,20 +2161,26 @@ exsltDateWeekInYear (const xmlChar *dateTime)
        }
     }
 
-    fdiy = DAY_IN_YEAR(1, 1, dt->value.date.year);
-    
+    diy = DAY_IN_YEAR(dt->value.date.day, dt->value.date.mon,
+                      dt->value.date.year);
+
     /*
      * Determine day-in-week (0=Sun, 1=Mon, etc.) then adjust so Monday
      * is the first day-in-week
      */
-    fdiw = (_exsltDateDayInWeek(fdiy, dt->value.date.year) + 6) % 7;
-
-    ret = (DAY_IN_YEAR(dt->value.date.day, dt->value.date.mon,
-                      dt->value.date.year) + fdiw) / 7;
+    diw = (_exsltDateDayInWeek(diy, dt->value.date.year) + 6) % 7;
 
     /* ISO 8601 adjustment, 3 is Thu */
-    if (fdiw <= 3)
-       ret += 1;
+    diy += (3 - diw);
+    if(diy < 1) {
+       year = dt->value.date.year - 1;
+       if(year == 0) year--;
+       diy = DAY_IN_YEAR(31, 12, year) + diy;
+    } else if (diy > DAY_IN_YEAR(31, 12, dt->value.date.year)) {
+       diy -= DAY_IN_YEAR(31, 12, dt->value.date.year);
+    }
+
+    ret = ((diy - 1) / 7) + 1;
 
     exsltDateFreeDate(dt);