bug-gnulib
[Top][All Lists]
Advanced

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

Re: Call to locale_charset within wcwidth


From: Gavin Smith
Subject: Re: Call to locale_charset within wcwidth
Date: Thu, 5 Feb 2015 18:40:27 +0000

On Sun, Feb 1, 2015 at 10:07 AM, Daiki Ueno <address@hidden> wrote:
> Eli Zaretskii <address@hidden> writes:
>
>> Perhaps we could call _configthreadlocale to see if the value of
>> setlocale can be cached?
>
> Yes, but then we would need to hook setlocale to invalidate the cache,
> and currently the setlocale module is not listed in the dependencies of
> localcharset.  I'm wondering if it is worth adding the dependency for
> this particular performance problem.  Perhaps it might be easier to add
> a new API to localcharset for single-threaded / single-locale consumer.
>

Here's a simple solution. The caller of the new function would call
locale_encoding themselves and save the result. Maybe somebody will
have a better idea. If this is too specialized to go into gnulib,
would it be easy for a project to use its own replacement functions
instead of the ones from gnulib?

*** wcwidth.c   2014-04-22 02:56:36.000000000 +0100
--- wcwidth.c-NEW       2015-02-01 14:53:41.000000000 +0000
***************
*** 27,37 ****
  #include "uniwidth.h"

  int
! wcwidth (wchar_t wc)
! #undef wcwidth
  {
    /* In UTF-8 locales, use a Unicode aware width function.  */
-   const char *encoding = locale_charset ();
    if (STREQ_OPT (encoding, "UTF-8", 'U', 'T', 'F', '-', '8', 0, 0, 0 ,0))
      {
        /* We assume that in a UTF-8 locale, a wide character is the same as a
--- 27,35 ----
  #include "uniwidth.h"

  int
! wcwidth_given_encoding (wchar_t wc, const char *encoding)
  {
    /* In UTF-8 locales, use a Unicode aware width function.  */
    if (STREQ_OPT (encoding, "UTF-8", 'U', 'T', 'F', '-', '8', 0, 0, 0 ,0))
      {
        /* We assume that in a UTF-8 locale, a wide character is the same as a
***************
*** 48,50 ****
--- 46,56 ----
  #endif
      }
  }
+
+ int
+ wcwidth (wchar_t wc)
+ #undef wcwidth
+ {
+   const char *encoding = locale_charset ();
+   return wcwidth_given_encoding (wc, encoding);
+ }



reply via email to

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