shithub: scc

Download patch

ref: 8598e0bb82f2722b96e7afa37922ba5107062692
parent: 48514a5765fbec60ae8f776d7bff7fad66cfd578
author: Naveen Narayanan <[email protected]>
date: Thu Aug 27 11:54:08 EDT 2020

libc: Fix strftime (time.h)

%U, conversion specifier, stipulates the first day of week 01 be a Sunday.
%W, conversion specifier, stipulates the first day of week 01 be a Monday.

--- a/src/libc/time/strftime.c
+++ b/src/libc/time/strftime.c
@@ -17,6 +17,33 @@
 
 static char *am_pm[] = {"AM", "PM"};
 
+static int
+first(int day, int year)
+{
+	int ny;
+
+	ny = _newyear(year);
+	if (ny == day)
+		return 0;
+	return 7 - ny + day;
+}
+
+static int
+weeknum(struct tm* tm, int day)
+{
+	int fday, val;
+
+	fday = first(day, tm->tm_year);
+	if (tm->tm_yday < fday) {
+		val = 0;
+	} else {
+		val = tm->tm_yday - fday;
+		val /= 7;
+		val++;
+	}
+	return val;
+}
+
 static size_t
 sval(char *s, size_t siz, char **strs, int abrev, int idx, int max)
 {
@@ -210,14 +237,10 @@
 			val = tm->tm_wday+1;
 			goto number;
 		case 'U':
-			val = tm->tm_yday / 7;
-			if (_newyear(tm->tm_year) == SAT)
-				val++;
+			val = weeknum(tm, SUN);
 			goto number;
 		case 'W':
-			val = tm->tm_yday / 7;
-			if (_newyear(tm->tm_year) == MON)
-				val++;
+			val = weeknum(tm, MON);
 			goto number;
 		case 'w':
 			width = 1;