Module Name:    src
Committed By:   sjg
Date:           Sat Jan 14 22:58:04 UTC 2017

Modified Files:
        src/usr.bin/make: make.1 var.c
        src/usr.bin/make/unit-tests: varmisc.exp varmisc.mk

Log Message:
Allow providing a utc value to :{gm,local}time

Reviewed by: christos


To generate a diff of this commit:
cvs rdiff -u -r1.263 -r1.264 src/usr.bin/make/make.1
cvs rdiff -u -r1.208 -r1.209 src/usr.bin/make/var.c
cvs rdiff -u -r1.4 -r1.5 src/usr.bin/make/unit-tests/varmisc.exp
cvs rdiff -u -r1.5 -r1.6 src/usr.bin/make/unit-tests/varmisc.mk

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

Modified files:

Index: src/usr.bin/make/make.1
diff -u src/usr.bin/make/make.1:1.263 src/usr.bin/make/make.1:1.264
--- src/usr.bin/make/make.1:1.263	Fri Aug 26 23:37:54 2016
+++ src/usr.bin/make/make.1	Sat Jan 14 22:58:04 2017
@@ -1,4 +1,4 @@
-.\"	$NetBSD: make.1,v 1.263 2016/08/26 23:37:54 dholland Exp $
+.\"	$NetBSD: make.1,v 1.264 2017/01/14 22:58:04 sjg Exp $
 .\"
 .\" Copyright (c) 1990, 1993
 .\"	The Regents of the University of California.  All rights reserved.
@@ -29,7 +29,7 @@
 .\"
 .\"	from: @(#)make.1	8.4 (Berkeley) 3/19/94
 .\"
-.Dd August 26, 2016
+.Dd January 14, 2017
 .Dt MAKE 1
 .Os
 .Sh NAME
@@ -1204,18 +1204,24 @@ safely through recursive invocations of
 .Nm .
 .It Cm \&:R
 Replaces each word in the variable with everything but its suffix.
-.It Cm \&:gmtime
+.It Cm \&:gmtime[=utc]
 The value is a format string for
 .Xr strftime 3 ,
-using the current
+using
 .Xr gmtime 3 .
+If a
+.Va utc
+value is not provided or is 0, the current time is used.
 .It Cm \&:hash
 Compute a 32-bit hash of the value and encode it as hex digits.
-.It Cm \&:localtime
+.It Cm \&:localtime[=utc]
 The value is a format string for
 .Xr strftime 3 ,
-using the current
+using
 .Xr localtime 3 .
+If a
+.Va utc
+value is not provided or is 0, the current time is used.
 .It Cm \&:tA
 Attempt to convert variable to an absolute path using
 .Xr realpath 3 ,

Index: src/usr.bin/make/var.c
diff -u src/usr.bin/make/var.c:1.208 src/usr.bin/make/var.c:1.209
--- src/usr.bin/make/var.c:1.208	Fri Jun  3 01:21:59 2016
+++ src/usr.bin/make/var.c	Sat Jan 14 22:58:04 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: var.c,v 1.208 2016/06/03 01:21:59 sjg Exp $	*/
+/*	$NetBSD: var.c,v 1.209 2017/01/14 22:58:04 sjg Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -69,14 +69,14 @@
  */
 
 #ifndef MAKE_NATIVE
-static char rcsid[] = "$NetBSD: var.c,v 1.208 2016/06/03 01:21:59 sjg Exp $";
+static char rcsid[] = "$NetBSD: var.c,v 1.209 2017/01/14 22:58:04 sjg Exp $";
 #else
 #include <sys/cdefs.h>
 #ifndef lint
 #if 0
 static char sccsid[] = "@(#)var.c	8.3 (Berkeley) 3/19/94";
 #else
-__RCSID("$NetBSD: var.c,v 1.208 2016/06/03 01:21:59 sjg Exp $");
+__RCSID("$NetBSD: var.c,v 1.209 2017/01/14 22:58:04 sjg Exp $");
 #endif
 #endif /* not lint */
 #endif
@@ -2381,12 +2381,12 @@ VarHash(char *str)
 }
 
 static char *
-VarStrftime(const char *fmt, int zulu)
+VarStrftime(const char *fmt, int zulu, time_t utc)
 {
     char buf[BUFSIZ];
-    time_t utc;
 
-    time(&utc);
+    if (!utc)
+	time(&utc);
     if (!*fmt)
 	fmt = "%c";
     strftime(buf, sizeof(buf), fmt, zulu ? gmtime(&utc) : localtime(&utc));
@@ -2483,6 +2483,8 @@ VarStrftime(const char *fmt, int zulu)
 /* we now have some modifiers with long names */
 #define STRMOD_MATCH(s, want, n) \
     (strncmp(s, want, n) == 0 && (s[n] == endc || s[n] == ':'))
+#define STRMOD_MATCHX(s, want, n) \
+    (strncmp(s, want, n) == 0 && (s[n] == endc || s[n] == ':' || s[n] == '='))
 
 static char *
 ApplyModifiers(char *nstr, const char *tstr,
@@ -2494,12 +2496,14 @@ ApplyModifiers(char *nstr, const char *t
     const char     *cp;    	/* Secondary pointer into str (place marker
 				 * for tstr) */
     char	   *newStr;	/* New value to return */
+    char	   *ep;
     char	    termc;	/* Character which terminated scan */
     int             cnt;	/* Used to count brace pairs when variable in
 				 * in parens or braces */
     char	delim;
     int		modifier;	/* that we are processing */
     Var_Parse_State parsestate; /* Flags passed to helper functions */
+    time_t	utc;		/* for VarStrftime */
 
     delim = '\0';
     parsestate.oneBigWord = FALSE;
@@ -2896,8 +2900,6 @@ ApplyModifiers(char *nstr, const char *t
 		     * integer for :[N], or two integers
 		     * separated by ".." for :[start..end].
 		     */
-		    char *ep;
-
 		    VarSelectWords_t seldata = { 0, 0 };
 
 		    seldata.start = strtol(estr, &ep, 0);
@@ -2956,9 +2958,15 @@ ApplyModifiers(char *nstr, const char *t
 	    }
 	case 'g':
 	    cp = tstr + 1;	/* make sure it is set */
-	    if (STRMOD_MATCH(tstr, "gmtime", 6)) {
-		newStr = VarStrftime(nstr, 1);
-		cp = tstr + 6;
+	    if (STRMOD_MATCHX(tstr, "gmtime", 6)) {
+		if (tstr[6] == '=') {
+		    utc = strtoul(&tstr[7], &ep, 10);
+		    cp = ep;
+		} else {
+		    utc = 0;
+		    cp = tstr + 6;
+		}
+		newStr = VarStrftime(nstr, 1, utc);
 		termc = *cp;
 	    } else {
 		goto default_case;
@@ -2976,9 +2984,15 @@ ApplyModifiers(char *nstr, const char *t
 	    break;
 	case 'l':
 	    cp = tstr + 1;	/* make sure it is set */
-	    if (STRMOD_MATCH(tstr, "localtime", 9)) {
-		newStr = VarStrftime(nstr, 0);
-		cp = tstr + 9;
+	    if (STRMOD_MATCHX(tstr, "localtime", 9)) {
+		if (tstr[9] == '=') {
+		    utc = strtoul(&tstr[10], &ep, 10);
+		    cp = ep;
+		} else {
+		    utc = 0;
+		    cp = tstr + 9;
+		}
+		newStr = VarStrftime(nstr, 0, utc);
 		termc = *cp;
 	    } else {
 		goto default_case;
@@ -3027,7 +3041,6 @@ ApplyModifiers(char *nstr, const char *t
 				goto get_numeric;
 			    default:
 				if (isdigit((unsigned char)tstr[3])) {
-				    char *ep;
 
 				get_numeric:
 				    parsestate.varSpace =

Index: src/usr.bin/make/unit-tests/varmisc.exp
diff -u src/usr.bin/make/unit-tests/varmisc.exp:1.4 src/usr.bin/make/unit-tests/varmisc.exp:1.5
--- src/usr.bin/make/unit-tests/varmisc.exp:1.4	Mon Oct 12 17:09:29 2015
+++ src/usr.bin/make/unit-tests/varmisc.exp	Sat Jan 14 22:58:04 2017
@@ -17,4 +17,6 @@ false
 FALSE
 do not evaluate or expand :? if discarding
 is set
+year=2016 month=04 day=01
+date=20160401
 exit status 0

Index: src/usr.bin/make/unit-tests/varmisc.mk
diff -u src/usr.bin/make/unit-tests/varmisc.mk:1.5 src/usr.bin/make/unit-tests/varmisc.mk:1.6
--- src/usr.bin/make/unit-tests/varmisc.mk:1.5	Mon Oct 12 17:09:29 2015
+++ src/usr.bin/make/unit-tests/varmisc.mk	Sat Jan 14 22:58:04 2017
@@ -1,8 +1,9 @@
-# $Id: varmisc.mk,v 1.5 2015/10/12 17:09:29 sjg Exp $
+# $Id: varmisc.mk,v 1.6 2017/01/14 22:58:04 sjg Exp $
 #
 # Miscellaneous variable tests.
 
-all: unmatched_var_paren D_true U_true D_false U_false Q_lhs Q_rhs NQ_none
+all: unmatched_var_paren D_true U_true D_false U_false Q_lhs Q_rhs NQ_none \
+	strftime
 
 unmatched_var_paren:
 	@echo ${foo::=foo-text}
@@ -40,3 +41,11 @@ Q_rhs:
 NQ_none:
 	@echo do not evaluate or expand :? if discarding
 	@echo ${VSET:U${1:L:?${True}:${False}}}
+
+April1= 1459494000
+
+# slightly contorted syntax to use utc via variable
+strftime:
+	@echo ${year=%Y month=%m day=%d:L:gmtime=1459494000}
+	@echo date=${%Y%m%d:L:${gmtime=${April1}:L}}
+

Reply via email to