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

glibc/2.7/intl/textdomain.c

    1: /* Implementation of the textdomain(3) function.
    2:    Copyright (C) 1995-1998, 2000, 2001, 2002 Free Software Foundation, Inc.
    3:    This file is part of the GNU C Library.
    4: 
    5:    The GNU C Library is free software; you can redistribute it and/or
    6:    modify it under the terms of the GNU Lesser General Public
    7:    License as published by the Free Software Foundation; either
    8:    version 2.1 of the License, or (at your option) any later version.
    9: 
   10:    The GNU C Library is distributed in the hope that it will be useful,
   11:    but WITHOUT ANY WARRANTY; without even the implied warranty of
   12:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   13:    Lesser General Public License for more details.
   14: 
   15:    You should have received a copy of the GNU Lesser General Public
   16:    License along with the GNU C Library; if not, write to the Free
   17:    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   18:    02111-1307 USA.  */
   19: 
   20: #ifdef HAVE_CONFIG_H
   21: # include <config.h>
   22: #endif
   23: 
   24: #include <stdlib.h>
   25: #include <string.h>
   26: 
   27: #ifdef _LIBC
   28: # include <libintl.h>
   29: #else
   30: # include "libgnuintl.h"
   31: #endif
   32: #include "gettextP.h"
   33: 
   34: #ifdef _LIBC
   35: /* We have to handle multi-threaded applications.  */
   36: # include <bits/libc-lock.h>
   37: #else
   38: /* Provide dummy implementation if this is outside glibc.  */
   39: # define __libc_rwlock_define(CLASS, NAME)
   40: # define __libc_rwlock_wrlock(NAME)
   41: # define __libc_rwlock_unlock(NAME)
   42: #endif
   43: 
   44: /* The internal variables in the standalone libintl.a must have different
   45:    names than the internal variables in GNU libc, otherwise programs
   46:    using libintl.a cannot be linked statically.  */
   47: #if !defined _LIBC
   48: # define _nl_default_default_domain libintl_nl_default_default_domain
   49: # define _nl_current_default_domain libintl_nl_current_default_domain
   50: #endif
   51: 
   52: /* @@ end of prolog @@ */
   53: 
   54: /* Name of the default text domain.  */
   55: extern const char _nl_default_default_domain[] attribute_hidden;
   56: 
   57: /* Default text domain in which entries for gettext(3) are to be found.  */
   58: extern const char *_nl_current_default_domain attribute_hidden;
   59: 
   60: 
   61: /* Names for the libintl functions are a problem.  They must not clash
   62:    with existing names and they should follow ANSI C.  But this source
   63:    code is also used in GNU C Library where the names have a __
   64:    prefix.  So we have to make a difference here.  */
   65: #ifdef _LIBC
   66: # define TEXTDOMAIN __textdomain
   67: # ifndef strdup
   68: #  define strdup(str) __strdup (str)
   69: # endif
   70: #else
   71: # define TEXTDOMAIN libintl_textdomain
   72: #endif
   73: 
   74: /* Lock variable to protect the global data in the gettext implementation.  */
   75: __libc_rwlock_define (extern, _nl_state_lock attribute_hidden)
   76: 
   77: /* Set the current default message catalog to DOMAINNAME.
   78:    If DOMAINNAME is null, return the current default.
   79:    If DOMAINNAME is "", reset to the default of "messages".  */
   80: char *
   81: TEXTDOMAIN (domainname)
   82:      const char *domainname;
   83: {
   84:   char *new_domain;
   85:   char *old_domain;
   86: 
   87:   /* A NULL pointer requests the current setting.  */
   88:   if (domainname == NULL)
   89:     return (char *) _nl_current_default_domain;
   90: 
   91:   __libc_rwlock_wrlock (_nl_state_lock);
   92: 
   93:   old_domain = (char *) _nl_current_default_domain;
   94: 
   95:   /* If domain name is the null string set to default domain "messages".  */
   96:   if (domainname[0] == '\0'
   97:       || strcmp (domainname, _nl_default_default_domain) == 0)
   98:     {
   99:       _nl_current_default_domain = _nl_default_default_domain;
  100:       new_domain = (char *) _nl_current_default_domain;
  101:     }
  102:   else if (strcmp (domainname, old_domain) == 0)
  103:     /* This can happen and people will use it to signal that some
  104:        environment variable changed.  */
  105:     new_domain = old_domain;
  106:   else
  107:     {
  108:       /* If the following malloc fails `_nl_current_default_domain'
  109:          will be NULL.  This value will be returned and so signals we
  110:          are out of core.  */
  111: #if defined _LIBC || defined HAVE_STRDUP
  112:       new_domain = strdup (domainname);
  113: #else
  114:       size_t len = strlen (domainname) + 1;
  115:       new_domain = (char *) malloc (len);
  116:       if (new_domain != NULL)
  117:         memcpy (new_domain, domainname, len);
  118: #endif
  119: 
  120:       if (new_domain != NULL)
  121:         _nl_current_default_domain = new_domain;
  122:     }
  123: 
  124:   /* We use this possibility to signal a change of the loaded catalogs
  125:      since this is most likely the case and there is no other easy we
  126:      to do it.  Do it only when the call was successful.  */
  127:   if (new_domain != NULL)
  128:     {
  129:       ++_nl_msg_cat_cntr;
  130: 
  131:       if (old_domain != new_domain && old_domain != _nl_default_default_domain)
  132:         free (old_domain);
  133:     }
  134: 
  135:   __libc_rwlock_unlock (_nl_state_lock);
  136: 
  137:   return new_domain;
  138: }
  139: 
  140: #ifdef _LIBC
  141: /* Alias for function name in GNU C Library.  */
  142: weak_alias (__textdomain, textdomain);
  143: #endif
Syntax (Markdown)