Rev 43972 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed
/* Implementation of the textdomain(3) function.Copyright (C) 1995-1998, 2000-2003, 2005-2006 Free Software Foundation, Inc.This program is free software; you can redistribute it and/or modify itunder the terms of the GNU Library General Public License as publishedby the Free Software Foundation; either version 2, or (at your option)any later version.This program is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNULibrary General Public License for more details.You should have received a copy of the GNU Library General PublicLicense along with this program; if not, write to the Free SoftwareFoundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,USA. */#ifdef HAVE_CONFIG_H# include <config.h>#endif#include <stdlib.h>#include <string.h>#include "gettextP.h"#ifdef _LIBC# include <libintl.h>#else# include "libgnuintl.h"#endif/* Handle multi-threaded applications. */#ifdef _LIBC# include <bits/libc-lock.h># define gl_rwlock_define __libc_rwlock_define# define gl_rwlock_wrlock __libc_rwlock_wrlock# define gl_rwlock_unlock __libc_rwlock_unlock#else# include "lock.h"#endif/* @@ end of prolog @@ *//* Names for the libintl functions are a problem. They must not clashwith existing names and they should follow ANSI C. But this sourcecode is also used in GNU C Library where the names have a __prefix. So we have to make a difference here. */#ifdef _LIBC# define TEXTDOMAIN __textdomain# ifndef strdup# define strdup(str) __strdup (str)# endif#else# define TEXTDOMAIN libintl_textdomain#endif/* Lock variable to protect the global data in the gettext implementation. */gl_rwlock_define (extern, _nl_state_lock attribute_hidden)/* Set the current default message catalog to DOMAINNAME.If DOMAINNAME is null, return the current default.If DOMAINNAME is "", reset to the default of "messages". */char *TEXTDOMAIN (const char *domainname){char *new_domain;char *old_domain;/* A NULL pointer requests the current setting. */if (domainname == NULL)return (char *) _nl_current_default_domain;gl_rwlock_wrlock (_nl_state_lock);old_domain = (char *) _nl_current_default_domain;/* If domain name is the null string set to default domain "messages". */if (domainname[0] == '\0'|| strcmp (domainname, _nl_default_default_domain) == 0){_nl_current_default_domain = _nl_default_default_domain;new_domain = (char *) _nl_current_default_domain;}else if (strcmp (domainname, old_domain) == 0)/* This can happen and people will use it to signal that someenvironment variable changed. */new_domain = old_domain;else{/* If the following malloc fails `_nl_current_default_domain'will be NULL. This value will be returned and so signals weare out of core. */#if defined _LIBC || defined HAVE_STRDUPnew_domain = strdup (domainname);#elsesize_t len = strlen (domainname) + 1;new_domain = (char *) malloc (len);if (new_domain != NULL)memcpy (new_domain, domainname, len);#endifif (new_domain != NULL)_nl_current_default_domain = new_domain;}/* We use this possibility to signal a change of the loaded catalogssince this is most likely the case and there is no other easy weto do it. Do it only when the call was successful. */if (new_domain != NULL){++_nl_msg_cat_cntr;if (old_domain != new_domain && old_domain != _nl_default_default_domain)free (old_domain);}gl_rwlock_unlock (_nl_state_lock);return new_domain;}#ifdef _LIBC/* Alias for function name in GNU C Library. */weak_alias (__textdomain, textdomain);#endif