source: branches/libc-0.6/src/binutils/intl/bindtextdom.c

Last change on this file was 610, checked in by bird, 22 years ago

This commit was generated by cvs2svn to compensate for changes in r609,
which included commits to RCS files with non-trunk default branches.

  • Property cvs2svn:cvs-rev set to 1.1.1.2
  • Property svn:eol-style set to native
  • Property svn:executable set to *
File size: 5.2 KB
Line 
1/* Implementation of the bindtextdomain(3) function
2 Copyright (C) 1995, 1996, 1997, 1998 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
28void 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. */
52extern const char _nl_default_dirname[];
53
54/* List with bindings of specific domains. */
55extern 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# ifndef strdup
65# define strdup(str) __strdup (str)
66# endif
67#else
68# define BINDTEXTDOMAIN bindtextdomain__
69#endif
70
71/* Specify that the DOMAINNAME message catalog will be found
72 in DIRNAME rather than in the system locale data base. */
73char *
74BINDTEXTDOMAIN (domainname, dirname)
75 const char *domainname;
76 const char *dirname;
77{
78 struct binding *binding;
79
80 /* Some sanity checks. */
81 if (domainname == NULL || domainname[0] == '\0')
82 return NULL;
83
84 for (binding = _nl_domain_bindings; binding != NULL; binding = binding->next)
85 {
86 int compare = strcmp (domainname, binding->domainname);
87 if (compare == 0)
88 /* We found it! */
89 break;
90 if (compare < 0)
91 {
92 /* It is not in the list. */
93 binding = NULL;
94 break;
95 }
96 }
97
98 if (dirname == NULL)
99 /* The current binding has be to returned. */
100 return binding == NULL ? (char *) _nl_default_dirname : binding->dirname;
101
102 if (binding != NULL)
103 {
104 /* The domain is already bound. If the new value and the old
105 one are equal we simply do nothing. Otherwise replace the
106 old binding. */
107 if (strcmp (dirname, binding->dirname) != 0)
108 {
109 char *new_dirname;
110
111 if (strcmp (dirname, _nl_default_dirname) == 0)
112 new_dirname = (char *) _nl_default_dirname;
113 else
114 {
115#if defined _LIBC || defined HAVE_STRDUP
116 new_dirname = strdup (dirname);
117 if (new_dirname == NULL)
118 return NULL;
119#else
120 size_t len = strlen (dirname) + 1;
121 new_dirname = (char *) malloc (len);
122 if (new_dirname == NULL)
123 return NULL;
124
125 memcpy (new_dirname, dirname, len);
126#endif
127 }
128
129 if (binding->dirname != _nl_default_dirname)
130 free (binding->dirname);
131
132 binding->dirname = new_dirname;
133 }
134 }
135 else
136 {
137 /* We have to create a new binding. */
138#if !defined _LIBC && !defined HAVE_STRDUP
139 size_t len;
140#endif
141 struct binding *new_binding =
142 (struct binding *) malloc (sizeof (*new_binding));
143
144 if (new_binding == NULL)
145 return NULL;
146
147#if defined _LIBC || defined HAVE_STRDUP
148 new_binding->domainname = strdup (domainname);
149 if (new_binding->domainname == NULL)
150 return NULL;
151#else
152 len = strlen (domainname) + 1;
153 new_binding->domainname = (char *) malloc (len);
154 if (new_binding->domainname == NULL)
155 return NULL;
156 memcpy (new_binding->domainname, domainname, len);
157#endif
158
159 if (strcmp (dirname, _nl_default_dirname) == 0)
160 new_binding->dirname = (char *) _nl_default_dirname;
161 else
162 {
163#if defined _LIBC || defined HAVE_STRDUP
164 new_binding->dirname = strdup (dirname);
165 if (new_binding->dirname == NULL)
166 return NULL;
167#else
168 len = strlen (dirname) + 1;
169 new_binding->dirname = (char *) malloc (len);
170 if (new_binding->dirname == NULL)
171 return NULL;
172 memcpy (new_binding->dirname, dirname, len);
173#endif
174 }
175
176 /* Now enqueue it. */
177 if (_nl_domain_bindings == NULL
178 || strcmp (domainname, _nl_domain_bindings->domainname) < 0)
179 {
180 new_binding->next = _nl_domain_bindings;
181 _nl_domain_bindings = new_binding;
182 }
183 else
184 {
185 binding = _nl_domain_bindings;
186 while (binding->next != NULL
187 && strcmp (domainname, binding->next->domainname) > 0)
188 binding = binding->next;
189
190 new_binding->next = binding->next;
191 binding->next = new_binding;
192 }
193
194 binding = new_binding;
195 }
196
197 return binding->dirname;
198}
199
200#ifdef _LIBC
201/* Alias for function name in GNU C Library. */
202weak_alias (__bindtextdomain, bindtextdomain);
203#endif
Note: See TracBrowser for help on using the repository browser.