update needed after gnulib changed
Bruno Haible via "Developers list for Guile, the GNU extensibility library" <[email protected]> Sat, 01 Nov 2025 09:44:11 +0100
| Newsgroups | gmane.lisp.guile.devel |
|---|---|
| Organization | GNU |
| Message-ID | <13152850.hYdu0Ggh8K@nimes> |
Hi,
A backwards-incompatible change was made to Gnulib yesterday:
Date Modules Changes
2025-10-31 nstrftime The return type changed from size_t to ptrdiff_t.
The return value in case of failure changed from 0
to -1.
Guile needs an update accordingly. Find attached a proposed patch (untested).
Bruno
0001-libguile-Update-after-gnulib-changed.patch
(text/x-patch, 2.5 KB)
From d71f0eb0e186305f854efde35e7241e0473d6c24 Mon Sep 17 00:00:00 2001 From: Bruno Haible <[email protected]> Date: Sat, 1 Nov 2025 09:38:54 +0100 Subject: [PATCH] libguile: Update after gnulib changed. * libguile/stime.c (scm_strftime): Adapt to new calling convention of nstrftime. Remove previous ugly hack. --- libguile/stime.c | 26 ++++++++++---------------- 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/libguile/stime.c b/libguile/stime.c index 18af71350..0a2e02a5e 100644 --- a/libguile/stime.c +++ b/libguile/stime.c @@ -1,4 +1,4 @@ -/* Copyright 1995-2001,2003-2009,2011,2013-2014,2016-2020 +/* Copyright 1995-2001,2003-2009,2011,2013-2014,2016-2020,2025 Free Software Foundation, Inc. This file is part of Guile. @@ -658,28 +658,18 @@ SCM_DEFINE (scm_strftime, "strftime", 2, 0, 0, char *tbuf; int size = 50; char *fmt; - char *myfmt; size_t len; + ptrdiff_t ret; SCM result; SCM_VALIDATE_STRING (1, format); bdtime2c (stime, &t, SCM_ARG2, FUNC_NAME); /* Convert the format string to the locale encoding, as the underlying - 'strftime' C function expects. */ + 'nstrftime' C function expects. */ fmt = scm_to_locale_stringn (format, &len); - /* Ugly hack: strftime can return 0 if its buffer is too small, - but some valid time strings (e.g. "%p") can sometimes produce - a zero-byte output string! Workaround is to prepend a junk - character to the format string, so that valid returns are always - nonzero. */ - myfmt = scm_malloc (len+2); - *myfmt = (uint8_t) 'x'; - strncpy (myfmt + 1, fmt, len); - myfmt[len + 1] = 0; scm_remember_upto_here_1 (format); - free (fmt); tbuf = scm_malloc (size); { @@ -714,12 +704,16 @@ SCM_DEFINE (scm_strftime, "strftime", 2, 0, 0, /* Use `nstrftime ()' from Gnulib, which supports all GNU extensions supported by glibc. */ - while ((len = nstrftime (tbuf, size, myfmt, &t, 0, 0)) == 0) + while ((ret = nstrftime (tbuf, size, fmt, &t, 0, 0)) == -1 + && errno == ERANGE) { free (tbuf); size *= 2; tbuf = scm_malloc (size); } + if (ret < 0) + /* nstrftime failed. */ + strcpy (tbuf, "???"); #if !defined (HAVE_STRUCT_TM_TM_ZONE) if (have_zone) @@ -730,9 +724,9 @@ SCM_DEFINE (scm_strftime, "strftime", 2, 0, 0, #endif } - result = scm_from_locale_string (tbuf + 1); + result = scm_from_locale_string (tbuf); free (tbuf); - free (myfmt); + free (fmt); #if HAVE_STRUCT_TM_TM_ZONE free ((char *) t.tm_zone); #endif -- 2.51.0