Blame intl/textdomain.c

Packit Service 82fcde
/* Implementation of the textdomain(3) function.
Packit Service 82fcde
   Copyright (C) 1995-2018 Free Software Foundation, Inc.
Packit Service 82fcde
Packit Service 82fcde
   This program is free software: you can redistribute it and/or modify
Packit Service 82fcde
   it under the terms of the GNU Lesser General Public License as published by
Packit Service 82fcde
   the Free Software Foundation; either version 2.1 of the License, or
Packit Service 82fcde
   (at your option) any later version.
Packit Service 82fcde
Packit Service 82fcde
   This program is distributed in the hope that it will be useful,
Packit Service 82fcde
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 82fcde
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 82fcde
   GNU Lesser General Public License for more details.
Packit Service 82fcde
Packit Service 82fcde
   You should have received a copy of the GNU Lesser General Public License
Packit Service 82fcde
   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
Packit Service 82fcde
Packit Service 82fcde
#ifdef HAVE_CONFIG_H
Packit Service 82fcde
# include <config.h>
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
#include <stdlib.h>
Packit Service 82fcde
#include <string.h>
Packit Service 82fcde
Packit Service 82fcde
#include "gettextP.h"
Packit Service 82fcde
#ifdef _LIBC
Packit Service 82fcde
# include <libintl.h>
Packit Service 82fcde
#else
Packit Service 82fcde
# include "libgnuintl.h"
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
/* Handle multi-threaded applications.  */
Packit Service 82fcde
#ifdef _LIBC
Packit Service 82fcde
# include <libc-lock.h>
Packit Service 82fcde
# define gl_rwlock_define __libc_rwlock_define
Packit Service 82fcde
# define gl_rwlock_wrlock __libc_rwlock_wrlock
Packit Service 82fcde
# define gl_rwlock_unlock __libc_rwlock_unlock
Packit Service 82fcde
#else
Packit Service 82fcde
# include "lock.h"
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
/* @@ end of prolog @@ */
Packit Service 82fcde
Packit Service 82fcde
Packit Service 82fcde
/* Names for the libintl functions are a problem.  They must not clash
Packit Service 82fcde
   with existing names and they should follow ANSI C.  But this source
Packit Service 82fcde
   code is also used in GNU C Library where the names have a __
Packit Service 82fcde
   prefix.  So we have to make a difference here.  */
Packit Service 82fcde
#ifdef _LIBC
Packit Service 82fcde
# define TEXTDOMAIN __textdomain
Packit Service 82fcde
# ifndef strdup
Packit Service 82fcde
#  define strdup(str) __strdup (str)
Packit Service 82fcde
# endif
Packit Service 82fcde
#else
Packit Service 82fcde
# define TEXTDOMAIN libintl_textdomain
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
/* Lock variable to protect the global data in the gettext implementation.  */
Packit Service 82fcde
gl_rwlock_define (extern, _nl_state_lock attribute_hidden)
Packit Service 82fcde
Packit Service 82fcde
/* Set the current default message catalog to DOMAINNAME.
Packit Service 82fcde
   If DOMAINNAME is null, return the current default.
Packit Service 82fcde
   If DOMAINNAME is "", reset to the default of "messages".  */
Packit Service 82fcde
char *
Packit Service 82fcde
TEXTDOMAIN (const char *domainname)
Packit Service 82fcde
{
Packit Service 82fcde
  char *new_domain;
Packit Service 82fcde
  char *old_domain;
Packit Service 82fcde
Packit Service 82fcde
  /* A NULL pointer requests the current setting.  */
Packit Service 82fcde
  if (domainname == NULL)
Packit Service 82fcde
    return (char *) _nl_current_default_domain;
Packit Service 82fcde
Packit Service 82fcde
  gl_rwlock_wrlock (_nl_state_lock);
Packit Service 82fcde
Packit Service 82fcde
  old_domain = (char *) _nl_current_default_domain;
Packit Service 82fcde
Packit Service 82fcde
  /* If domain name is the null string set to default domain "messages".  */
Packit Service 82fcde
  if (domainname[0] == '\0'
Packit Service 82fcde
      || strcmp (domainname, _nl_default_default_domain) == 0)
Packit Service 82fcde
    {
Packit Service 82fcde
      _nl_current_default_domain = _nl_default_default_domain;
Packit Service 82fcde
      new_domain = (char *) _nl_current_default_domain;
Packit Service 82fcde
    }
Packit Service 82fcde
  else if (strcmp (domainname, old_domain) == 0)
Packit Service 82fcde
    /* This can happen and people will use it to signal that some
Packit Service 82fcde
       environment variable changed.  */
Packit Service 82fcde
    new_domain = old_domain;
Packit Service 82fcde
  else
Packit Service 82fcde
    {
Packit Service 82fcde
      /* If the following malloc fails `_nl_current_default_domain'
Packit Service 82fcde
	 will be NULL.  This value will be returned and so signals we
Packit Service 82fcde
	 are out of core.  */
Packit Service 82fcde
#if defined _LIBC || defined HAVE_STRDUP
Packit Service 82fcde
      new_domain = strdup (domainname);
Packit Service 82fcde
#else
Packit Service 82fcde
      size_t len = strlen (domainname) + 1;
Packit Service 82fcde
      new_domain = (char *) malloc (len);
Packit Service 82fcde
      if (new_domain != NULL)
Packit Service 82fcde
	memcpy (new_domain, domainname, len);
Packit Service 82fcde
#endif
Packit Service 82fcde
Packit Service 82fcde
      if (new_domain != NULL)
Packit Service 82fcde
	_nl_current_default_domain = new_domain;
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  /* We use this possibility to signal a change of the loaded catalogs
Packit Service 82fcde
     since this is most likely the case and there is no other easy we
Packit Service 82fcde
     to do it.  Do it only when the call was successful.  */
Packit Service 82fcde
  if (new_domain != NULL)
Packit Service 82fcde
    {
Packit Service 82fcde
      ++_nl_msg_cat_cntr;
Packit Service 82fcde
Packit Service 82fcde
      if (old_domain != new_domain && old_domain != _nl_default_default_domain)
Packit Service 82fcde
	free (old_domain);
Packit Service 82fcde
    }
Packit Service 82fcde
Packit Service 82fcde
  gl_rwlock_unlock (_nl_state_lock);
Packit Service 82fcde
Packit Service 82fcde
  return new_domain;
Packit Service 82fcde
}
Packit Service 82fcde
Packit Service 82fcde
#ifdef _LIBC
Packit Service 82fcde
/* Alias for function name in GNU C Library.  */
Packit Service 82fcde
weak_alias (__textdomain, textdomain);
Packit Service 82fcde
#endif