Annotation of embedaddon/lrzsz/intl/bindtextdom.c, revision 1.1.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>