Back to index

glibc  2.9
Defines | Functions | Variables
bindtextdom.c File Reference
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include "libgnuintl.h"
#include "gettextP.h"

Go to the source code of this file.

Defines

#define __libc_rwlock_define(CLASS, NAME)
#define __libc_rwlock_wrlock(NAME)
#define __libc_rwlock_unlock(NAME)
#define _nl_default_dirname   libintl_nl_default_dirname
#define _nl_domain_bindings   libintl_nl_domain_bindings
#define offsetof(type, ident)   ((size_t)&(((type*)0)->ident))
#define BINDTEXTDOMAIN   libintl_bindtextdomain
#define BIND_TEXTDOMAIN_CODESET   libintl_bind_textdomain_codeset

Functions

 __libc_rwlock_define (extern, _nl_state_lock attribute_hidden) static void set_binding_values PARAMS((const char *domainname
static void set_binding_values (char *domainname, const char **dirnamep, const char **codesetp) const

Variables

const char _nl_default_dirname []
struct binding_nl_domain_bindings
const char ** dirnamep
const char const char ** codesetp
char *const char * domainname
const char * dirname
const char * codeset

Define Documentation

#define __libc_rwlock_define (   CLASS,
  NAME 
)

Definition at line 40 of file bindtextdom.c.

#define __libc_rwlock_unlock (   NAME)

Definition at line 42 of file bindtextdom.c.

#define __libc_rwlock_wrlock (   NAME)

Definition at line 41 of file bindtextdom.c.

#define _nl_default_dirname   libintl_nl_default_dirname

Definition at line 49 of file bindtextdom.c.

#define _nl_domain_bindings   libintl_nl_domain_bindings

Definition at line 50 of file bindtextdom.c.

#define BIND_TEXTDOMAIN_CODESET   libintl_bind_textdomain_codeset
#define BINDTEXTDOMAIN   libintl_bindtextdomain
#define offsetof (   type,
  ident 
)    ((size_t)&(((type*)0)->ident))

Definition at line 55 of file bindtextdom.c.


Function Documentation

__libc_rwlock_define ( extern  ,
_nl_state_lock  attribute_hidden 
) const
static void set_binding_values ( char *  domainname,
const char **  dirnamep,
const char **  codesetp 
) const [static]

Definition at line 100 of file bindtextdom.c.

{
  struct binding *binding;
  int modified;

  /* Some sanity checks.  */
  if (domainname == NULL || domainname[0] == '\0')
    {
      if (dirnamep)
       *dirnamep = NULL;
      if (codesetp)
       *codesetp = NULL;
      return;
    }

  __libc_rwlock_wrlock (_nl_state_lock);

  modified = 0;

  for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next)
    {
      int compare = strcmp (domainname, binding->domainname);
      if (compare == 0)
       /* We found it!  */
       break;
      if (compare < 0)
       {
         /* It is not in the list.  */
         binding = NULL;
         break;
       }
    }

  if (binding != NULL)
    {
      if (dirnamep)
       {
         const char *dirname = *dirnamep;

         if (dirname == NULL)
           /* The current binding has be to returned.  */
           *dirnamep = binding->dirname;
         else
           {
             /* The domain is already bound.  If the new value and the old
               one are equal we simply do nothing.  Otherwise replace the
               old binding.  */
             char *result = binding->dirname;
             if (strcmp (dirname, result) != 0)
              {
                if (strcmp (dirname, _nl_default_dirname) == 0)
                  result = (char *) _nl_default_dirname;
                else
                  {
#if defined _LIBC || defined HAVE_STRDUP
                    result = strdup (dirname);
#else
                    size_t len = strlen (dirname) + 1;
                    result = (char *) malloc (len);
                    if (__builtin_expect (result != NULL, 1))
                     memcpy (result, dirname, len);
#endif
                  }

                if (__builtin_expect (result != NULL, 1))
                  {
                    if (binding->dirname != _nl_default_dirname)
                     free (binding->dirname);

                    binding->dirname = result;
                    modified = 1;
                  }
              }
             *dirnamep = result;
           }
       }

      if (codesetp)
       {
         const char *codeset = *codesetp;

         if (codeset == NULL)
           /* The current binding has be to returned.  */
           *codesetp = binding->codeset;
         else
           {
             /* The domain is already bound.  If the new value and the old
               one are equal we simply do nothing.  Otherwise replace the
               old binding.  */
             char *result = binding->codeset;
             if (result == NULL || strcmp (codeset, result) != 0)
              {
#if defined _LIBC || defined HAVE_STRDUP
                result = strdup (codeset);
#else
                size_t len = strlen (codeset) + 1;
                result = (char *) malloc (len);
                if (__builtin_expect (result != NULL, 1))
                  memcpy (result, codeset, len);
#endif

                if (__builtin_expect (result != NULL, 1))
                  {
                    free (binding->codeset);

                    binding->codeset = result;
                    modified = 1;
                  }
              }
             *codesetp = result;
           }
       }
    }
  else if ((dirnamep == NULL || *dirnamep == NULL)
          && (codesetp == NULL || *codesetp == NULL))
    {
      /* Simply return the default values.  */
      if (dirnamep)
       *dirnamep = _nl_default_dirname;
      if (codesetp)
       *codesetp = NULL;
    }
  else
    {
      /* We have to create a new binding.  */
      size_t len = strlen (domainname) + 1;
      struct binding *new_binding =
       (struct binding *) malloc (offsetof (struct binding, domainname) + len);

      if (__builtin_expect (new_binding == NULL, 0))
       goto failed;

      memcpy (new_binding->domainname, domainname, len);

      if (dirnamep)
       {
         const char *dirname = *dirnamep;

         if (dirname == NULL)
           /* The default value.  */
           dirname = _nl_default_dirname;
         else
           {
             if (strcmp (dirname, _nl_default_dirname) == 0)
              dirname = _nl_default_dirname;
             else
              {
                char *result;
#if defined _LIBC || defined HAVE_STRDUP
                result = strdup (dirname);
                if (__builtin_expect (result == NULL, 0))
                  goto failed_dirname;
#else
                size_t len = strlen (dirname) + 1;
                result = (char *) malloc (len);
                if (__builtin_expect (result == NULL, 0))
                  goto failed_dirname;
                memcpy (result, dirname, len);
#endif
                dirname = result;
              }
           }
         *dirnamep = dirname;
         new_binding->dirname = (char *) dirname;
       }
      else
       /* The default value.  */
       new_binding->dirname = (char *) _nl_default_dirname;

      if (codesetp)
       {
         const char *codeset = *codesetp;

         if (codeset != NULL)
           {
             char *result;

#if defined _LIBC || defined HAVE_STRDUP
             result = strdup (codeset);
             if (__builtin_expect (result == NULL, 0))
              goto failed_codeset;
#else
             size_t len = strlen (codeset) + 1;
             result = (char *) malloc (len);
             if (__builtin_expect (result == NULL, 0))
              goto failed_codeset;
             memcpy (result, codeset, len);
#endif
             codeset = result;
           }
         *codesetp = codeset;
         new_binding->codeset = (char *) codeset;
       }
      else
       new_binding->codeset = NULL;

      /* Now enqueue it.  */
      if (_nl_domain_bindings == NULL
         || strcmp (domainname, _nl_domain_bindings->domainname) < 0)
       {
         new_binding->next = _nl_domain_bindings;
         _nl_domain_bindings = new_binding;
       }
      else
       {
         binding = _nl_domain_bindings;
         while (binding->next != NULL
               && strcmp (domainname, binding->next->domainname) > 0)
           binding = binding->next;

         new_binding->next = binding->next;
         binding->next = new_binding;
       }

      modified = 1;

      /* Here we deal with memory allocation failures.  */
      if (0)
       {
       failed_codeset:
         if (new_binding->dirname != _nl_default_dirname)
           free (new_binding->dirname);
       failed_dirname:
         free (new_binding);
       failed:
         if (dirnamep)
           *dirnamep = NULL;
         if (codesetp)
           *codesetp = NULL;
       }
    }

  /* If we modified any binding, we flush the caches.  */
  if (modified)
    ++_nl_msg_cat_cntr;

  __libc_rwlock_unlock (_nl_state_lock);
}

Here is the call graph for this function:


Variable Documentation

Definition at line 276 of file dcigettext.c.

Definition at line 283 of file dcigettext.c.

const char* codeset

Definition at line 357 of file bindtextdom.c.

const char const char** codesetp

Definition at line 90 of file bindtextdom.c.

const char* dirname

Definition at line 347 of file bindtextdom.c.

const char** dirnamep

Definition at line 90 of file bindtextdom.c.

char* const char* domainname

Definition at line 346 of file bindtextdom.c.