Module Name:    src
Committed By:   ginsbach
Date:           Wed Jul  8 19:48:20 UTC 2015

Modified Files:
        src/lib/libc/time: strptime.c

Log Message:
Add macros to clarify what (parse) state is needed to calculate 'missing'
tm fields.


To generate a diff of this commit:
cvs rdiff -u -r1.41 -r1.42 src/lib/libc/time/strptime.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/lib/libc/time/strptime.c
diff -u src/lib/libc/time/strptime.c:1.41 src/lib/libc/time/strptime.c:1.42
--- src/lib/libc/time/strptime.c:1.41	Wed Jul  8 18:44:09 2015
+++ src/lib/libc/time/strptime.c	Wed Jul  8 19:48:20 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: strptime.c,v 1.41 2015/07/08 18:44:09 ginsbach Exp $	*/
+/*	$NetBSD: strptime.c,v 1.42 2015/07/08 19:48:20 ginsbach Exp $	*/
 
 /*-
  * Copyright (c) 1997, 1998, 2005, 2008 The NetBSD Foundation, Inc.
@@ -31,7 +31,7 @@
 
 #include <sys/cdefs.h>
 #if defined(LIBC_SCCS) && !defined(lint)
-__RCSID("$NetBSD: strptime.c,v 1.41 2015/07/08 18:44:09 ginsbach Exp $");
+__RCSID("$NetBSD: strptime.c,v 1.42 2015/07/08 19:48:20 ginsbach Exp $");
 #endif
 
 #include "namespace.h"
@@ -68,6 +68,12 @@ __weak_alias(strptime_l, _strptime_l)
 #define	S_MDAY		(1 << 3)
 #define	S_WDAY		(1 << 4)
 
+#define HAVE_MDAY(s)	(s & S_MDAY)
+#define HAVE_MON(s)	(s & S_MON)
+#define HAVE_WDAY(s)	(s & S_WDAY)
+#define HAVE_YDAY(s)	(s & S_YDAY)
+#define HAVE_YEAR(s)	(s & S_YEAR)
+
 static char gmt[] = { "GMT" };
 static char utc[] = { "UTC" };
 /* RFC-822/RFC-2822 */
@@ -161,8 +167,7 @@ literal:
 		 */
 		case 'c':	/* Date and time, using the locale's format. */
 			new_fmt = _TIME_LOCALE(loc)->d_t_fmt;
-			state |= S_WDAY | S_MON | S_MDAY |
-			    S_YEAR;
+			state |= S_WDAY | S_MON | S_MDAY | S_YEAR;
 			goto recurse;
 
 		case 'D':	/* The date as "%m/%d/%y". */
@@ -475,8 +480,7 @@ literal:
 				continue;
 			case '+':
 				neg = 0;
-				state |= S_WDAY | S_MON |  S_MDAY |
-				    S_YEAR;
+				state |= S_WDAY | S_MON | S_MDAY | S_YEAR;
 				break;
 			case '-':
 				neg = 1;
@@ -581,8 +585,8 @@ literal:
 		}
 	}
 
-	if (!(state & S_YDAY) && (state & S_YEAR)) {
-		if ((state & (S_MON | S_MDAY)) == (S_MON | S_MDAY)) {
+	if (!HAVE_YDAY(state) && HAVE_YEAR(state)) {
+		if (HAVE_MON(state) && HAVE_MDAY(state)) {
 			tm->tm_yday =  start_of_month[is_leap_year(tm->tm_year +
 			    TM_YEAR_BASE)][tm->tm_mon] + (tm->tm_mday - 1);
 			state |= S_YDAY;
@@ -590,7 +594,7 @@ literal:
 			/* Set the date to the first Sunday (or Monday)
 			 * of the specified week of the year.
 			 */
-			if (!(state & S_WDAY)) {
+			if (!HAVE_WDAY(state)) {
 				tm->tm_wday = day_offset;
 				state |= S_WDAY;
 			}
@@ -602,9 +606,9 @@ literal:
 		}
 	}
 
-	if ((state & (S_YEAR | S_YDAY)) == (S_YEAR | S_YDAY)) {
+	if (HAVE_YDAY(state) && HAVE_YEAR(state)) {
 		int isleap;
-		if (!(state & S_MON)) {
+		if (!HAVE_MON(state)) {
 			i = 0;
 			isleap = is_leap_year(tm->tm_year + TM_YEAR_BASE);
 			while (tm->tm_yday >= start_of_month[isleap][i])
@@ -617,13 +621,13 @@ literal:
 			tm->tm_mon = i - 1;
 			state |= S_MON;
 		}
-		if (!(state & S_MDAY)) {
+		if (!HAVE_MDAY(state)) {
 			isleap = is_leap_year(tm->tm_year + TM_YEAR_BASE);
 			tm->tm_mday = tm->tm_yday -
 			    start_of_month[isleap][tm->tm_mon] + 1;
 			state |= S_MDAY;
 		}
-		if (!(state & S_WDAY)) {
+		if (!HAVE_WDAY(state)) {
 			i = 0;
 			week_offset = first_wday_of(tm->tm_year);
 			while (i++ <= tm->tm_yday) {

Reply via email to