(linenum→info "unix/slp.c:2238")

glibc/2.7/locale/duplocale.c

    1: /* Duplicate handle for selection of locales.
    2:    Copyright (C) 1997, 2000, 2001, 2002, 2005 Free Software Foundation, Inc.
    3:    This file is part of the GNU C Library.
    4:    Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
    5: 
    6:    The GNU C Library is free software; you can redistribute it and/or
    7:    modify it under the terms of the GNU Lesser General Public
    8:    License as published by the Free Software Foundation; either
    9:    version 2.1 of the License, or (at your option) any later version.
   10: 
   11:    The GNU C Library is distributed in the hope that it will be useful,
   12:    but WITHOUT ANY WARRANTY; without even the implied warranty of
   13:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   14:    Lesser General Public License for more details.
   15: 
   16:    You should have received a copy of the GNU Lesser General Public
   17:    License along with the GNU C Library; if not, write to the Free
   18:    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   19:    02111-1307 USA.  */
   20: 
   21: #include <locale.h>
   22: #include <bits/libc-lock.h>
   23: #include <stdlib.h>
   24: #include <string.h>
   25: 
   26: #include <localeinfo.h>
   27: 
   28: 
   29: /* Lock for protecting global data.  */
   30: __libc_lock_define (extern , __libc_setlocale_lock attribute_hidden)
   31: 
   32: 
   33: __locale_t
   34: __duplocale (__locale_t dataset)
   35: {
   36:   /* This static object is returned for newlocale (LC_ALL_MASK, "C").  */
   37:   if (dataset == _nl_C_locobj_ptr)
   38:     return dataset;
   39: 
   40:   __locale_t result;
   41:   int cnt;
   42:   size_t names_len = 0;
   43: 
   44:   /* Calculate the total space we need to store all the names.  */
   45:   for (cnt = 0; cnt < __LC_LAST; ++cnt)
   46:     if (cnt != LC_ALL && dataset->__names[cnt] != _nl_C_name)
   47:       names_len += strlen (dataset->__names[cnt]) + 1;
   48: 
   49:   /* Get memory.  */
   50:   result = malloc (sizeof (struct __locale_struct) + names_len);
   51: 
   52:   if (result != NULL)
   53:     {
   54:       char *namep = (char *) (result + 1);
   55: 
   56:       /* We modify global data (the usage counts).  */
   57:       __libc_lock_lock (__libc_setlocale_lock);
   58: 
   59:       for (cnt = 0; cnt < __LC_LAST; ++cnt)
   60:         if (cnt != LC_ALL)
   61:           {
   62:             result->__locales[cnt] = dataset->__locales[cnt];
   63:             if (result->__locales[cnt]->usage_count < MAX_USAGE_COUNT)
   64:               ++result->__locales[cnt]->usage_count;
   65: 
   66:             if (dataset->__names[cnt] == _nl_C_name)
   67:               result->__names[cnt] = _nl_C_name;
   68:             else
   69:               {
   70:                 result->__names[cnt] = namep;
   71:                 namep = __stpcpy (namep, dataset->__names[cnt]) + 1;
   72:               }
   73:           }
   74: 
   75:       /* Update the special members.  */
   76:       result->__ctype_b = dataset->__ctype_b;
   77:       result->__ctype_tolower = dataset->__ctype_tolower;
   78:       result->__ctype_toupper = dataset->__ctype_toupper;
   79: 
   80:       /* It's done.  */
   81:       __libc_lock_unlock (__libc_setlocale_lock);
   82:     }
   83: 
   84:   return result;
   85: }
   86: weak_alias (__duplocale, duplocale)
Syntax (Markdown)