[email protected]
[Top] [All Lists]

Re: lib/39392 (Document that strftime() is broken by design)

Subject: Re: lib/39392 Document that strftime() is broken by design
From: Robert Elz
Date: Tue, 4 May 2010 11:05:04 +0000 UTC
The following reply was made to PR lib/39392; it has been noted by GNATS.

From: Robert Elz <[email protected]>
To: [email protected]
Cc: 
Subject: Re: lib/39392 (Document that strftime() is broken by design)
Date: Tue, 04 May 2010 18:02:04 +0700

 Just for the sake of the PR (and in case anyone else ever looks here),
 note that the workaround for this problem is trivial - it is absurdly
 simple to make sure that the result cannot be empty (in cases of no
 error) and simply deal with it...   Maybe the man page should mention
 this as well, or perhaps not.
 
 That is, using the %p example given,
 
        n = strftime(buf, sizeof buf, " %p", tmp);
        if (n == 0) {
                /* certainly an error */
        }
        p_length = n - 1;
        p_value = buf + 1;
 
 Another PR might be reasonable for date(1) to make it use this kind of
 workaround instead of issuing spurious error messages (for "date" rather
 that copying stuff and inserting leading spaces, just leave the command
 line '+' in the string passed to strftime, then delete it from the result
 before printing).
 
 A patch to fix date is appended, in case it is useful for anyone.  This
 is against date.c version 1.50 (which is what I happened to have lying
 around) - if that's not what's in current, adapting this should be trivial.
 
 kre
 
 --- date.c.ORIG        2010-05-04 17:57:45.000000000 +0700
 +++ date.c     2010-05-04 17:56:44.000000000 +0700
 @@ -118,11 +118,11 @@
        if (!rflag && time(&tval) == -1)
                err(EXIT_FAILURE, "time");
  
 -      format = "%a %b %e %H:%M:%S %Z %Y";
 +      format = "+%a %b %e %H:%M:%S %Z %Y";
  
        /* allow the operands in any order */
        if (*argv && **argv == '+') {
 -              format = *argv + 1;
 +              format = *argv;
                ++argv;
        }
  
 @@ -132,14 +132,14 @@
        }
  
        if (*argv && **argv == '+')
 -              format = *argv + 1;
 +              format = *argv;
  
        if ((buf = malloc(bufsiz = 1024)) == NULL)
                goto bad;
        while (strftime(buf, bufsiz, format, localtime(&tval)) == 0)
                if ((buf = realloc(buf, bufsiz <<= 1)) == NULL)
                        goto bad;
 -      (void)printf("%s\n", buf);
 +      (void)printf("%s\n", buf + 1);
        free(buf);
        return 0;
  bad:
 
 

<Prev in Thread] Current Thread [Next in Thread>