Blame intl/textdomain.c

Packit bbfece
/* Implementation of the textdomain(3) function.
Packit bbfece
   Copyright (C) 1995-1998, 2000, 2001, 2002 Free Software Foundation, Inc.
Packit bbfece
Packit bbfece
   This program is free software; you can redistribute it and/or modify it
Packit bbfece
   under the terms of the GNU Library General Public License as published
Packit bbfece
   by the Free Software Foundation; either version 2, or (at your option)
Packit bbfece
   any later version.
Packit bbfece
Packit bbfece
   This program is distributed in the hope that it will be useful,
Packit bbfece
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit bbfece
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit bbfece
   Library General Public License for more details.
Packit bbfece
Packit bbfece
   You should have received a copy of the GNU Library General Public
Packit bbfece
   License along with this program; if not, write to the Free Software
Packit bbfece
   Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA 02110-1301,
Packit bbfece
   USA.  */
Packit bbfece
Packit bbfece
#ifdef HAVE_CONFIG_H
Packit bbfece
# include <config.h>
Packit bbfece
#endif
Packit bbfece
Packit bbfece
#include <stdlib.h>
Packit bbfece
#include <string.h>
Packit bbfece
Packit bbfece
#ifdef _LIBC
Packit bbfece
# include <libintl.h>
Packit bbfece
#else
Packit bbfece
# include "libgnuintl.h"
Packit bbfece
#endif
Packit bbfece
#include "gettextP.h"
Packit bbfece
Packit bbfece
#ifdef _LIBC
Packit bbfece
/* We have to handle multi-threaded applications.  */
Packit bbfece
# include <bits/libc-lock.h>
Packit bbfece
#else
Packit bbfece
/* Provide dummy implementation if this is outside glibc.  */
Packit bbfece
# define __libc_rwlock_define(CLASS, NAME)
Packit bbfece
# define __libc_rwlock_wrlock(NAME)
Packit bbfece
# define __libc_rwlock_unlock(NAME)
Packit bbfece
#endif
Packit bbfece
Packit bbfece
/* The internal variables in the standalone libintl.a must have different
Packit bbfece
   names than the internal variables in GNU libc, otherwise programs
Packit bbfece
   using libintl.a cannot be linked statically.  */
Packit bbfece
#if !defined _LIBC
Packit bbfece
# define _nl_default_default_domain libintl_nl_default_default_domain
Packit bbfece
# define _nl_current_default_domain libintl_nl_current_default_domain
Packit bbfece
#endif
Packit bbfece
Packit bbfece
/* @@ end of prolog @@ */
Packit bbfece
Packit bbfece
/* Name of the default text domain.  */
Packit bbfece
extern const char _nl_default_default_domain[] attribute_hidden;
Packit bbfece
Packit bbfece
/* Default text domain in which entries for gettext(3) are to be found.  */
Packit bbfece
extern const char *_nl_current_default_domain attribute_hidden;
Packit bbfece
Packit bbfece
Packit bbfece
/* Names for the libintl functions are a problem.  They must not clash
Packit bbfece
   with existing names and they should follow ANSI C.  But this source
Packit bbfece
   code is also used in GNU C Library where the names have a __
Packit bbfece
   prefix.  So we have to make a difference here.  */
Packit bbfece
#ifdef _LIBC
Packit bbfece
# define TEXTDOMAIN __textdomain
Packit bbfece
# ifndef strdup
Packit bbfece
#  define strdup(str) __strdup (str)
Packit bbfece
# endif
Packit bbfece
#else
Packit bbfece
# define TEXTDOMAIN libintl_textdomain
Packit bbfece
#endif
Packit bbfece
Packit bbfece
/* Lock variable to protect the global data in the gettext implementation.  */
Packit bbfece
__libc_rwlock_define (extern, _nl_state_lock attribute_hidden)
Packit bbfece
Packit bbfece
/* Set the current default message catalog to DOMAINNAME.
Packit bbfece
   If DOMAINNAME is null, return the current default.
Packit bbfece
   If DOMAINNAME is "", reset to the default of "messages".  */
Packit bbfece
char *
Packit bbfece
TEXTDOMAIN (domainname)
Packit bbfece
     const char *domainname;
Packit bbfece
{
Packit bbfece
  char *new_domain;
Packit bbfece
  char *old_domain;
Packit bbfece
Packit bbfece
  /* A NULL pointer requests the current setting.  */
Packit bbfece
  if (domainname == NULL)
Packit bbfece
    return (char *) _nl_current_default_domain;
Packit bbfece
Packit bbfece
  __libc_rwlock_wrlock (_nl_state_lock);
Packit bbfece
Packit bbfece
  old_domain = (char *) _nl_current_default_domain;
Packit bbfece
Packit bbfece
  /* If domain name is the null string set to default domain "messages".  */
Packit bbfece
  if (domainname[0] == '\0'
Packit bbfece
      || strcmp (domainname, _nl_default_default_domain) == 0)
Packit bbfece
    {
Packit bbfece
      _nl_current_default_domain = _nl_default_default_domain;
Packit bbfece
      new_domain = (char *) _nl_current_default_domain;
Packit bbfece
    }
Packit bbfece
  else if (strcmp (domainname, old_domain) == 0)
Packit bbfece
    /* This can happen and people will use it to signal that some
Packit bbfece
       environment variable changed.  */
Packit bbfece
    new_domain = old_domain;
Packit bbfece
  else
Packit bbfece
    {
Packit bbfece
      /* If the following malloc fails `_nl_current_default_domain'
Packit bbfece
	 will be NULL.  This value will be returned and so signals we
Packit bbfece
	 are out of core.  */
Packit bbfece
#if defined _LIBC || defined HAVE_STRDUP
Packit bbfece
      new_domain = strdup (domainname);
Packit bbfece
#else
Packit bbfece
      size_t len = strlen (domainname) + 1;
Packit bbfece
      new_domain = (char *) malloc (len);
Packit bbfece
      if (new_domain != NULL)
Packit bbfece
	memcpy (new_domain, domainname, len);
Packit bbfece
#endif
Packit bbfece
Packit bbfece
      if (new_domain != NULL)
Packit bbfece
	_nl_current_default_domain = new_domain;
Packit bbfece
    }
Packit bbfece
Packit bbfece
  /* We use this possibility to signal a change of the loaded catalogs
Packit bbfece
     since this is most likely the case and there is no other easy we
Packit bbfece
     to do it.  Do it only when the call was successful.  */
Packit bbfece
  if (new_domain != NULL)
Packit bbfece
    {
Packit bbfece
      ++_nl_msg_cat_cntr;
Packit bbfece
Packit bbfece
      if (old_domain != new_domain && old_domain != _nl_default_default_domain)
Packit bbfece
	free (old_domain);
Packit bbfece
    }
Packit bbfece
Packit bbfece
  __libc_rwlock_unlock (_nl_state_lock);
Packit bbfece
Packit bbfece
  return new_domain;
Packit bbfece
}
Packit bbfece
Packit bbfece
#ifdef _LIBC
Packit bbfece
/* Alias for function name in GNU C Library.  */
Packit bbfece
weak_alias (__textdomain, textdomain);
Packit bbfece
#endif