Annotation of embedaddon/lrzsz/intl/bindtextdom.c, revision 1.1

1.1     ! misho       1: /* Implementation of the bindtextdomain(3) function
        !             2:    Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc.
        !             3: 
        !             4:    This program is free software; you can redistribute it and/or modify
        !             5:    it under the terms of the GNU General Public License as published by
        !             6:    the Free Software Foundation; either version 2, or (at your option)
        !             7:    any later version.
        !             8: 
        !             9:    This program is distributed in the hope that it will be useful,
        !            10:    but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            11:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
        !            12:    GNU General Public License for more details.
        !            13: 
        !            14:    You should have received a copy of the GNU General Public License
        !            15:    along with this program; if not, write to the Free Software Foundation,
        !            16:    Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
        !            17: 
        !            18: #ifdef HAVE_CONFIG_H
        !            19: # include <config.h>
        !            20: #endif
        !            21: 
        !            22: #if defined STDC_HEADERS || defined _LIBC
        !            23: # include <stdlib.h>
        !            24: #else
        !            25: # ifdef HAVE_MALLOC_H
        !            26: #  include <malloc.h>
        !            27: # else
        !            28: void free ();
        !            29: # endif
        !            30: #endif
        !            31: 
        !            32: #if defined HAVE_STRING_H || defined _LIBC
        !            33: # include <string.h>
        !            34: #else
        !            35: # include <strings.h>
        !            36: # ifndef memcpy
        !            37: #  define memcpy(Dst, Src, Num) bcopy (Src, Dst, Num)
        !            38: # endif
        !            39: #endif
        !            40: 
        !            41: #ifdef _LIBC
        !            42: # include <libintl.h>
        !            43: #else
        !            44: # include "libgettext.h"
        !            45: #endif
        !            46: #include "gettext.h"
        !            47: #include "gettextP.h"
        !            48: 
        !            49: /* @@ end of prolog @@ */
        !            50: 
        !            51: /* Contains the default location of the message catalogs.  */
        !            52: extern const char _nl_default_dirname[];
        !            53: 
        !            54: /* List with bindings of specific domains.  */
        !            55: extern struct binding *_nl_domain_bindings;
        !            56: 
        !            57: 
        !            58: /* Names for the libintl functions are a problem.  They must not clash
        !            59:    with existing names and they should follow ANSI C.  But this source
        !            60:    code is also used in GNU C Library where the names have a __
        !            61:    prefix.  So we have to make a difference here.  */
        !            62: #ifdef _LIBC
        !            63: # define BINDTEXTDOMAIN __bindtextdomain
        !            64: # define strdup(str) __strdup (str)
        !            65: #else
        !            66: # define BINDTEXTDOMAIN bindtextdomain__
        !            67: #endif
        !            68: 
        !            69: /* Specify that the DOMAINNAME message catalog will be found
        !            70:    in DIRNAME rather than in the system locale data base.  */
        !            71: char *
        !            72: BINDTEXTDOMAIN (domainname, dirname)
        !            73:      const char *domainname;
        !            74:      const char *dirname;
        !            75: {
        !            76:   struct binding *binding;
        !            77: 
        !            78:   /* Some sanity checks.  */
        !            79:   if (domainname == NULL || domainname[0] == '\0')
        !            80:     return NULL;
        !            81: 
        !            82:   for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next)
        !            83:     {
        !            84:       int compare = strcmp (domainname, binding->domainname);
        !            85:       if (compare == 0)
        !            86:        /* We found it!  */
        !            87:        break;
        !            88:       if (compare < 0)
        !            89:        {
        !            90:          /* It is not in the list.  */
        !            91:          binding = NULL;
        !            92:          break;
        !            93:        }
        !            94:     }
        !            95: 
        !            96:   if (dirname == NULL)
        !            97:     /* The current binding has be to returned.  */
        !            98:     return binding == NULL ? (char *) _nl_default_dirname : binding->dirname;
        !            99: 
        !           100:   if (binding != NULL)
        !           101:     {
        !           102:       /* The domain is already bound.  If the new value and the old
        !           103:         one are equal we simply do nothing.  Otherwise replace the
        !           104:         old binding.  */
        !           105:       if (strcmp (dirname, binding->dirname) != 0)
        !           106:        {
        !           107:          char *new_dirname;
        !           108: 
        !           109:          if (strcmp (dirname, _nl_default_dirname) == 0)
        !           110:            new_dirname = (char *) _nl_default_dirname;
        !           111:          else
        !           112:            {
        !           113: #if defined _LIBC || defined HAVE_STRDUP
        !           114:              new_dirname = strdup (dirname);
        !           115:              if (new_dirname == NULL)
        !           116:                return NULL;
        !           117: #else
        !           118:              size_t len = strlen (dirname) + 1;
        !           119:              new_dirname = (char *) malloc (len);
        !           120:              if (new_dirname == NULL)
        !           121:                return NULL;
        !           122: 
        !           123:              memcpy (new_dirname, dirname, len);
        !           124: #endif
        !           125:            }
        !           126: 
        !           127:          if (binding->dirname != _nl_default_dirname)
        !           128:            free (binding->dirname);
        !           129: 
        !           130:          binding->dirname = new_dirname;
        !           131:        }
        !           132:     }
        !           133:   else
        !           134:     {
        !           135:       /* We have to create a new binding.  */
        !           136:       size_t len;
        !           137:       struct binding *new_binding =
        !           138:        (struct binding *) malloc (sizeof (*new_binding));
        !           139: 
        !           140:       if (new_binding == NULL)
        !           141:        return NULL;
        !           142: 
        !           143: #if defined _LIBC || defined HAVE_STRDUP
        !           144:       new_binding->domainname = strdup (domainname);
        !           145:       if (new_binding->domainname == NULL)
        !           146:        return NULL;
        !           147: #else
        !           148:       len = strlen (domainname) + 1;
        !           149:       new_binding->domainname = (char *) malloc (len);
        !           150:       if (new_binding->domainname == NULL)
        !           151:        return NULL;
        !           152:       memcpy (new_binding->domainname, domainname, len);
        !           153: #endif
        !           154: 
        !           155:       if (strcmp (dirname, _nl_default_dirname) == 0)
        !           156:        new_binding->dirname = (char *) _nl_default_dirname;
        !           157:       else
        !           158:        {
        !           159: #if defined _LIBC || defined HAVE_STRDUP
        !           160:          new_binding->dirname = strdup (dirname);
        !           161:          if (new_binding->dirname == NULL)
        !           162:            return NULL;
        !           163: #else
        !           164:          len = strlen (dirname) + 1;
        !           165:          new_binding->dirname = (char *) malloc (len);
        !           166:          if (new_binding->dirname == NULL)
        !           167:            return NULL;
        !           168:          memcpy (new_binding->dirname, dirname, len);
        !           169: #endif
        !           170:        }
        !           171: 
        !           172:       /* Now enqueue it.  */
        !           173:       if (_nl_domain_bindings == NULL
        !           174:          || strcmp (domainname, _nl_domain_bindings->domainname) < 0)
        !           175:        {
        !           176:          new_binding->next = _nl_domain_bindings;
        !           177:          _nl_domain_bindings = new_binding;
        !           178:        }
        !           179:       else
        !           180:        {
        !           181:          binding = _nl_domain_bindings;
        !           182:          while (binding->next != NULL
        !           183:                 && strcmp (domainname, binding->next->domainname) > 0)
        !           184:            binding = binding->next;
        !           185: 
        !           186:          new_binding->next = binding->next;
        !           187:          binding->next = new_binding;
        !           188:        }
        !           189: 
        !           190:       binding = new_binding;
        !           191:     }
        !           192: 
        !           193:   return binding->dirname;
        !           194: }
        !           195: 
        !           196: #ifdef _LIBC
        !           197: /* Alias for function name in GNU C Library.  */
        !           198: weak_alias (__bindtextdomain, bindtextdomain);
        !           199: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>