Module Name:    src
Committed By:   rillig
Date:           Sun Apr 21 21:59:48 UTC 2024

Modified Files:
        src/usr.bin/make: var.c

Log Message:
make: trim down code for parsing the :gmtime and :localtime modifiers

The :gmtime and :localtime modifiers are not used often and thus are not
time-critical. Exchange the custom code that parses an integer from a
substring for an additional memory allocation.

Thanks sjg@ for suggesting to avoid the custom parsing code.


To generate a diff of this commit:
cvs rdiff -u -r1.1103 -r1.1104 src/usr.bin/make/var.c

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/var.c
diff -u src/usr.bin/make/var.c:1.1103 src/usr.bin/make/var.c:1.1104
--- src/usr.bin/make/var.c:1.1103	Sun Apr 21 08:56:49 2024
+++ src/usr.bin/make/var.c	Sun Apr 21 21:59:48 2024
@@ -1,4 +1,4 @@
-/*	$NetBSD: var.c,v 1.1103 2024/04/21 08:56:49 rillig Exp $	*/
+/*	$NetBSD: var.c,v 1.1104 2024/04/21 21:59:48 rillig Exp $	*/
 
 /*
  * Copyright (c) 1988, 1989, 1990, 1993
@@ -137,7 +137,7 @@
 #include "metachar.h"
 
 /*	"@(#)var.c	8.3 (Berkeley) 3/19/94" */
-MAKE_RCSID("$NetBSD: var.c,v 1.1103 2024/04/21 08:56:49 rillig Exp $");
+MAKE_RCSID("$NetBSD: var.c,v 1.1104 2024/04/21 21:59:48 rillig Exp $");
 
 /*
  * Variables are defined using one of the VAR=value assignments.  Their
@@ -2515,26 +2515,6 @@ TryParseTime(const char **pp, time_t *ou
 	return true;
 }
 
-static bool
-Substring_ParseTime(Substring s, time_t *out_time)
-{
-	const char *p;
-	unsigned long n;
-
-	n = 0;
-	for (p = s.start; p != s.end && ch_isdigit(*p); p++) {
-		unsigned long next = 10 * n + ((unsigned)*p - '0');
-		if (next < n)
-			return false;
-		n = next;
-	}
-	if (p == s.start || p != s.end)
-		return false;
-
-	*out_time = (time_t)n;	/* ignore possible truncation for now */
-	return true;
-}
-
 /* :gmtime and :localtime */
 static ApplyModifierResult
 ApplyModifier_Time(const char **pp, ModChain *ch)
@@ -2552,21 +2532,22 @@ ApplyModifier_Time(const char **pp, ModC
 	if (args[0] == '=') {
 		const char *p = args + 1;
 		LazyBuf buf;
+		FStr arg;
 		if (!ParseModifierPartSubst(&p, true, '\0', ch->expr->emode,
 		    ch, &buf, NULL, NULL))
 			return AMR_CLEANUP;
+		arg = LazyBuf_DoneGet(&buf);
 		if (ModChain_ShouldEval(ch)) {
-			Substring arg = LazyBuf_Get(&buf);
-			if (!Substring_ParseTime(arg, &t)) {
+			const char *arg_p = arg.str;
+			if (!TryParseTime(&arg_p, &t) || *arg_p != '\0') {
 				Parse_Error(PARSE_FATAL,
-				    "Invalid time value \"%.*s\"",
-				    (int)Substring_Length(arg), arg.start);
-				LazyBuf_Done(&buf);
+				    "Invalid time value \"%s\"", arg.str);
+				FStr_Done(&arg);
 				return AMR_CLEANUP;
 			}
 		} else
 			t = 0;
-		LazyBuf_Done(&buf);
+		FStr_Done(&arg);
 		*pp = p;
 	} else {
 		t = 0;

Reply via email to