[Top][All Lists]

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

Re: xctime()

From: Bruno Haible
Subject: Re: xctime()
Date: Sun, 24 Jan 2010 20:51:58 +0100
User-agent: KMail/1.9.9

Hi Robert,

Robert Millan wrote:
> I implemented xctime for GNU isofsmk.  xctime is an alternative to ctime()
> that:
>   - Uses dynamic allocation
>   - Is thread-safe
>   - Returns localized strings

I agree that it's not a good idea to use ctime() or asctime(), because of
the problems mentioned in gnulib/doc/posix-functions/*ctime.texi.

> char *
> xctime (const time_t *time)
> {
>   struct tm *loctime;
>   char *str;
>   size_t len;
>   loctime = localtime (time);
>   len = strftime (NULL, INT32_MAX, "%c", loctime) + sizeof ("");
>   str = xmalloc (len);
>   strftime (str, len, "%c", loctime);
>   return str;
> }
> I find it much more comfortable than having to deal with strftime() every
> time.  If you're interested, I could make a Gnulib module out of it.

Hmm, if this is proposed for gnulib, I have 4 remarks:

  - Error handling: strftime can fail. Since you call xmalloc for the
    memory allocation, I think it would be reasonable to call error()
    in case strftime fails.

  - Flexibility: The three most often used formats are probably %c, %x, %X.
    Any function for date formatting should not have the format built-in.
    It should have a format indication as argument. But then you can also
    allow the user to pass an entire format string. And define shorthands
    as reminders like this:
      #define TIMEFORMAT_LOCALE_DATE "%x"

  - In the average case, you can get away with 1 strftime call instead of 2,
    if you preallocate a buffer on the stack:
      char buf[256];
      len = strftime (buf, sizeof (buf), "%c", loctime) + 1;
    In the case where 256 bytes are not enough, the function will need
    3 strftime calls instead of 1, but this case should be pretty rare
    (even in Chinese and GB18030 encoding, 64 characters should be enough
    for a date + time display).

  - sizeof ("") is confusing. You can write 1 instead.


reply via email to

[Prev in Thread] Current Thread [Next in Thread]