Back to index

glibc  2.9
Functions
duplocale.c File Reference
#include <locale.h>
#include <bits/libc-lock.h>
#include <stdlib.h>
#include <string.h>
#include <localeinfo.h>

Go to the source code of this file.

Functions

 __libc_rwlock_define (extern, __libc_setlocale_lock attribute_hidden) __locale_t __duplocale(__locale_t dataset)

Function Documentation

__libc_rwlock_define ( extern  ,
__libc_setlocale_lock  attribute_hidden 
)

Definition at line 30 of file duplocale.c.

{
  /* This static object is returned for newlocale (LC_ALL_MASK, "C").  */
  if (dataset == _nl_C_locobj_ptr)
    return dataset;

  __locale_t result;
  int cnt;
  size_t names_len = 0;

  /* Calculate the total space we need to store all the names.  */
  for (cnt = 0; cnt < __LC_LAST; ++cnt)
    if (cnt != LC_ALL && dataset->__names[cnt] != _nl_C_name)
      names_len += strlen (dataset->__names[cnt]) + 1;

  /* Get memory.  */
  result = malloc (sizeof (struct __locale_struct) + names_len);

  if (result != NULL)
    {
      char *namep = (char *) (result + 1);

      /* We modify global data (the usage counts).  */
      __libc_rwlock_wrlock (__libc_setlocale_lock);

      for (cnt = 0; cnt < __LC_LAST; ++cnt)
       if (cnt != LC_ALL)
         {
           result->__locales[cnt] = dataset->__locales[cnt];
           if (result->__locales[cnt]->usage_count < MAX_USAGE_COUNT)
             ++result->__locales[cnt]->usage_count;

           if (dataset->__names[cnt] == _nl_C_name)
             result->__names[cnt] = _nl_C_name;
           else
             {
              result->__names[cnt] = namep;
              namep = __stpcpy (namep, dataset->__names[cnt]) + 1;
             }
         }

      /* Update the special members.  */
      result->__ctype_b = dataset->__ctype_b;
      result->__ctype_tolower = dataset->__ctype_tolower;
      result->__ctype_toupper = dataset->__ctype_toupper;

      /* It's done.  */
      __libc_rwlock_unlock (__libc_setlocale_lock);
    }

  return result;
}

Here is the call graph for this function: