Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/usr.bin/make Allow providing a utc value to :{gm, local}time



details:   https://anonhg.NetBSD.org/src/rev/4ecc497576b2
branches:  trunk
changeset: 820782:4ecc497576b2
user:      sjg <sjg%NetBSD.org@localhost>
date:      Sat Jan 14 22:58:04 2017 +0000

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

Reviewed by: christos

diffstat:

 usr.bin/make/make.1                 |  18 +++++++++----
 usr.bin/make/unit-tests/varmisc.exp |   2 +
 usr.bin/make/unit-tests/varmisc.mk  |  13 +++++++++-
 usr.bin/make/var.c                  |  45 +++++++++++++++++++++++-------------
 4 files changed, 54 insertions(+), 24 deletions(-)

diffs (206 lines):

diff -r 7395f3e84a43 -r 4ecc497576b2 usr.bin/make/make.1
--- a/usr.bin/make/make.1       Sat Jan 14 22:24:43 2017 +0000
+++ b/usr.bin/make/make.1       Sat Jan 14 22:58:04 2017 +0000
@@ -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 @@
 .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 ,
diff -r 7395f3e84a43 -r 4ecc497576b2 usr.bin/make/unit-tests/varmisc.exp
--- a/usr.bin/make/unit-tests/varmisc.exp       Sat Jan 14 22:24:43 2017 +0000
+++ b/usr.bin/make/unit-tests/varmisc.exp       Sat Jan 14 22:58:04 2017 +0000
@@ -17,4 +17,6 @@
 FALSE
 do not evaluate or expand :? if discarding
 is set
+year=2016 month=04 day=01
+date=20160401
 exit status 0
diff -r 7395f3e84a43 -r 4ecc497576b2 usr.bin/make/unit-tests/varmisc.mk
--- a/usr.bin/make/unit-tests/varmisc.mk        Sat Jan 14 22:24:43 2017 +0000
+++ b/usr.bin/make/unit-tests/varmisc.mk        Sat Jan 14 22:58:04 2017 +0000
@@ -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 @@
 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}}
+
diff -r 7395f3e84a43 -r 4ecc497576b2 usr.bin/make/var.c
--- a/usr.bin/make/var.c        Sat Jan 14 22:24:43 2017 +0000
+++ b/usr.bin/make/var.c        Sat Jan 14 22:58:04 2017 +0000
@@ -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 @@
 }
 
 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 @@
 /* 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 @@
     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 @@
                     * 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 @@
            }
        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 @@
            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 @@
                                goto get_numeric;
                            default:
                                if (isdigit((unsigned char)tstr[3])) {
-                                   char *ep;
 
                                get_numeric:
                                    parsestate.varSpace =



Home | Main Index | Thread Index | Old Index