annotate intl/l10nflist.c @ 1090:09eb2c83097a trunk

[svn] Psychoaccoustics support (to disable, temporarily add -UPSYCHO to your CFLAGS.): This commit brings psychoaccoustics support (as used in mp3surround decoders) to libmpgdec. For example, we can now almost fully compensate for lack of bandwidth in ISO compliant MP3 encodings. In addition, further inaccuracies with pitch and the lack of reverb feeling that some MP3s have are detected and automatically compensated for.
author nenolod
date Sat, 20 May 2006 20:36:10 -0700
parents cb178e5ad177
children f12d7e208b43
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
1 /* Copyright (C) 1995-1999, 2000, 2001, 2002 Free Software Foundation, Inc.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
2 Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
3
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
4 This program is free software; you can redistribute it and/or modify it
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
5 under the terms of the GNU Library General Public License as published
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
6 by the Free Software Foundation; either version 2, or (at your option)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
7 any later version.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
8
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
9 This program is distributed in the hope that it will be useful,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
12 Library General Public License for more details.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
13
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
14 You should have received a copy of the GNU Library General Public
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
15 License along with this program; if not, write to the Free Software
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
16 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
17 USA. */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
18
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
19 /* Tell glibc's <string.h> to provide a prototype for stpcpy().
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
20 This must come before <config.h> because <config.h> may include
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
21 <features.h>, and once <features.h> has been included, it's too late. */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
22 #ifndef _GNU_SOURCE
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
23 # define _GNU_SOURCE 1
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
24 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
25
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
26 #ifdef HAVE_CONFIG_H
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
27 # include <config.h>
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
28 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
29
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
30 #include <string.h>
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
31
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
32 #if defined _LIBC || defined HAVE_ARGZ_H
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
33 # include <argz.h>
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
34 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
35 #include <ctype.h>
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
36 #include <sys/types.h>
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
37 #include <stdlib.h>
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
38
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
39 #include "loadinfo.h"
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
40
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
41 /* On some strange systems still no definition of NULL is found. Sigh! */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
42 #ifndef NULL
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
43 # if defined __STDC__ && __STDC__
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
44 # define NULL ((void *) 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
45 # else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
46 # define NULL 0
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
47 # endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
48 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
49
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
50 /* @@ end of prolog @@ */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
51
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
52 #ifdef _LIBC
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
53 /* Rename the non ANSI C functions. This is required by the standard
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
54 because some ANSI C functions will require linking with this object
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
55 file and the name space must not be polluted. */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
56 # ifndef stpcpy
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
57 # define stpcpy(dest, src) __stpcpy(dest, src)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
58 # endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
59 #else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
60 # ifndef HAVE_STPCPY
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
61 static char *stpcpy PARAMS ((char *dest, const char *src));
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
62 # endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
63 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
64
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
65 /* Pathname support.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
66 ISSLASH(C) tests whether C is a directory separator character.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
67 IS_ABSOLUTE_PATH(P) tests whether P is an absolute path. If it is not,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
68 it may be concatenated to a directory pathname.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
69 */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
70 #if defined _WIN32 || defined __WIN32__ || defined __EMX__ || defined __DJGPP__
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
71 /* Win32, OS/2, DOS */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
72 # define ISSLASH(C) ((C) == '/' || (C) == '\\')
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
73 # define HAS_DEVICE(P) \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
74 ((((P)[0] >= 'A' && (P)[0] <= 'Z') || ((P)[0] >= 'a' && (P)[0] <= 'z')) \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
75 && (P)[1] == ':')
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
76 # define IS_ABSOLUTE_PATH(P) (ISSLASH ((P)[0]) || HAS_DEVICE (P))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
77 #else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
78 /* Unix */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
79 # define ISSLASH(C) ((C) == '/')
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
80 # define IS_ABSOLUTE_PATH(P) ISSLASH ((P)[0])
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
81 #endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
82
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
83 /* Define function which are usually not available. */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
84
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
85 #if !defined _LIBC && !defined HAVE___ARGZ_COUNT
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
86 /* Returns the number of strings in ARGZ. */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
87 static size_t argz_count__ PARAMS ((const char *argz, size_t len));
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
88
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
89 static size_t
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
90 argz_count__ (argz, len)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
91 const char *argz;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
92 size_t len;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
93 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
94 size_t count = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
95 while (len > 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
96 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
97 size_t part_len = strlen (argz);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
98 argz += part_len + 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
99 len -= part_len + 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
100 count++;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
101 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
102 return count;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
103 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
104 # undef __argz_count
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
105 # define __argz_count(argz, len) argz_count__ (argz, len)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
106 #else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
107 # ifdef _LIBC
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
108 # define __argz_count(argz, len) INTUSE(__argz_count) (argz, len)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
109 # endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
110 #endif /* !_LIBC && !HAVE___ARGZ_COUNT */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
111
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
112 #if !defined _LIBC && !defined HAVE___ARGZ_STRINGIFY
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
113 /* Make '\0' separated arg vector ARGZ printable by converting all the '\0's
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
114 except the last into the character SEP. */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
115 static void argz_stringify__ PARAMS ((char *argz, size_t len, int sep));
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
116
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
117 static void
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
118 argz_stringify__ (argz, len, sep)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
119 char *argz;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
120 size_t len;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
121 int sep;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
122 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
123 while (len > 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
124 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
125 size_t part_len = strlen (argz);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
126 argz += part_len;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
127 len -= part_len + 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
128 if (len > 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
129 *argz++ = sep;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
130 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
131 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
132 # undef __argz_stringify
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
133 # define __argz_stringify(argz, len, sep) argz_stringify__ (argz, len, sep)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
134 #else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
135 # ifdef _LIBC
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
136 # define __argz_stringify(argz, len, sep) \
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
137 INTUSE(__argz_stringify) (argz, len, sep)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
138 # endif
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
139 #endif /* !_LIBC && !HAVE___ARGZ_STRINGIFY */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
140
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
141 #if !defined _LIBC && !defined HAVE___ARGZ_NEXT
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
142 static char *argz_next__ PARAMS ((char *argz, size_t argz_len,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
143 const char *entry));
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
144
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
145 static char *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
146 argz_next__ (argz, argz_len, entry)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
147 char *argz;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
148 size_t argz_len;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
149 const char *entry;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
150 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
151 if (entry)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
152 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
153 if (entry < argz + argz_len)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
154 entry = strchr (entry, '\0') + 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
155
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
156 return entry >= argz + argz_len ? NULL : (char *) entry;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
157 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
158 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
159 if (argz_len > 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
160 return argz;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
161 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
162 return 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
163 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
164 # undef __argz_next
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
165 # define __argz_next(argz, len, entry) argz_next__ (argz, len, entry)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
166 #endif /* !_LIBC && !HAVE___ARGZ_NEXT */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
167
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
168
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
169 /* Return number of bits set in X. */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
170 static int pop PARAMS ((int x));
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
171
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
172 static inline int
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
173 pop (x)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
174 int x;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
175 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
176 /* We assume that no more than 16 bits are used. */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
177 x = ((x & ~0x5555) >> 1) + (x & 0x5555);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
178 x = ((x & ~0x3333) >> 2) + (x & 0x3333);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
179 x = ((x >> 4) + x) & 0x0f0f;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
180 x = ((x >> 8) + x) & 0xff;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
181
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
182 return x;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
183 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
184
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
185
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
186 struct loaded_l10nfile *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
187 _nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len, mask, language,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
188 territory, codeset, normalized_codeset, modifier, special,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
189 sponsor, revision, filename, do_allocate)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
190 struct loaded_l10nfile **l10nfile_list;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
191 const char *dirlist;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
192 size_t dirlist_len;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
193 int mask;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
194 const char *language;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
195 const char *territory;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
196 const char *codeset;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
197 const char *normalized_codeset;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
198 const char *modifier;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
199 const char *special;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
200 const char *sponsor;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
201 const char *revision;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
202 const char *filename;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
203 int do_allocate;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
204 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
205 char *abs_filename;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
206 struct loaded_l10nfile **lastp;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
207 struct loaded_l10nfile *retval;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
208 char *cp;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
209 size_t dirlist_count;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
210 size_t entries;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
211 int cnt;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
212
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
213 /* If LANGUAGE contains an absolute directory specification, we ignore
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
214 DIRLIST. */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
215 if (IS_ABSOLUTE_PATH (language))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
216 dirlist_len = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
217
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
218 /* Allocate room for the full file name. */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
219 abs_filename = (char *) malloc (dirlist_len
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
220 + strlen (language)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
221 + ((mask & TERRITORY) != 0
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
222 ? strlen (territory) + 1 : 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
223 + ((mask & XPG_CODESET) != 0
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
224 ? strlen (codeset) + 1 : 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
225 + ((mask & XPG_NORM_CODESET) != 0
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
226 ? strlen (normalized_codeset) + 1 : 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
227 + (((mask & XPG_MODIFIER) != 0
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
228 || (mask & CEN_AUDIENCE) != 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
229 ? strlen (modifier) + 1 : 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
230 + ((mask & CEN_SPECIAL) != 0
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
231 ? strlen (special) + 1 : 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
232 + (((mask & CEN_SPONSOR) != 0
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
233 || (mask & CEN_REVISION) != 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
234 ? (1 + ((mask & CEN_SPONSOR) != 0
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
235 ? strlen (sponsor) : 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
236 + ((mask & CEN_REVISION) != 0
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
237 ? strlen (revision) + 1 : 0)) : 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
238 + 1 + strlen (filename) + 1);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
239
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
240 if (abs_filename == NULL)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
241 return NULL;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
242
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
243 /* Construct file name. */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
244 cp = abs_filename;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
245 if (dirlist_len > 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
246 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
247 memcpy (cp, dirlist, dirlist_len);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
248 __argz_stringify (cp, dirlist_len, PATH_SEPARATOR);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
249 cp += dirlist_len;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
250 cp[-1] = '/';
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
251 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
252
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
253 cp = stpcpy (cp, language);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
254
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
255 if ((mask & TERRITORY) != 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
256 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
257 *cp++ = '_';
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
258 cp = stpcpy (cp, territory);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
259 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
260 if ((mask & XPG_CODESET) != 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
261 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
262 *cp++ = '.';
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
263 cp = stpcpy (cp, codeset);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
264 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
265 if ((mask & XPG_NORM_CODESET) != 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
266 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
267 *cp++ = '.';
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
268 cp = stpcpy (cp, normalized_codeset);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
269 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
270 if ((mask & (XPG_MODIFIER | CEN_AUDIENCE)) != 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
271 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
272 /* This component can be part of both syntaces but has different
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
273 leading characters. For CEN we use `+', else `@'. */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
274 *cp++ = (mask & CEN_AUDIENCE) != 0 ? '+' : '@';
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
275 cp = stpcpy (cp, modifier);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
276 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
277 if ((mask & CEN_SPECIAL) != 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
278 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
279 *cp++ = '+';
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
280 cp = stpcpy (cp, special);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
281 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
282 if ((mask & (CEN_SPONSOR | CEN_REVISION)) != 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
283 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
284 *cp++ = ',';
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
285 if ((mask & CEN_SPONSOR) != 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
286 cp = stpcpy (cp, sponsor);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
287 if ((mask & CEN_REVISION) != 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
288 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
289 *cp++ = '_';
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
290 cp = stpcpy (cp, revision);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
291 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
292 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
293
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
294 *cp++ = '/';
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
295 stpcpy (cp, filename);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
296
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
297 /* Look in list of already loaded domains whether it is already
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
298 available. */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
299 lastp = l10nfile_list;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
300 for (retval = *l10nfile_list; retval != NULL; retval = retval->next)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
301 if (retval->filename != NULL)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
302 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
303 int compare = strcmp (retval->filename, abs_filename);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
304 if (compare == 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
305 /* We found it! */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
306 break;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
307 if (compare < 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
308 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
309 /* It's not in the list. */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
310 retval = NULL;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
311 break;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
312 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
313
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
314 lastp = &retval->next;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
315 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
316
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
317 if (retval != NULL || do_allocate == 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
318 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
319 free (abs_filename);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
320 return retval;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
321 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
322
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
323 dirlist_count = (dirlist_len > 0 ? __argz_count (dirlist, dirlist_len) : 1);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
324
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
325 /* Allocate a new loaded_l10nfile. */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
326 retval =
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
327 (struct loaded_l10nfile *)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
328 malloc (sizeof (*retval)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
329 + (((dirlist_count << pop (mask)) + (dirlist_count > 1 ? 1 : 0))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
330 * sizeof (struct loaded_l10nfile *)));
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
331 if (retval == NULL)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
332 return NULL;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
333
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
334 retval->filename = abs_filename;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
335
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
336 /* We set retval->data to NULL here; it is filled in later.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
337 Setting retval->decided to 1 here means that retval does not
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
338 correspond to a real file (dirlist_count > 1) or is not worth
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
339 looking up (if an unnormalized codeset was specified). */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
340 retval->decided = (dirlist_count > 1
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
341 || ((mask & XPG_CODESET) != 0
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
342 && (mask & XPG_NORM_CODESET) != 0));
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
343 retval->data = NULL;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
344
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
345 retval->next = *lastp;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
346 *lastp = retval;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
347
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
348 entries = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
349 /* Recurse to fill the inheritance list of RETVAL.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
350 If the DIRLIST is a real list (i.e. DIRLIST_COUNT > 1), the RETVAL
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
351 entry does not correspond to a real file; retval->filename contains
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
352 colons. In this case we loop across all elements of DIRLIST and
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
353 across all bit patterns dominated by MASK.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
354 If the DIRLIST is a single directory or entirely redundant (i.e.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
355 DIRLIST_COUNT == 1), we loop across all bit patterns dominated by
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
356 MASK, excluding MASK itself.
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
357 In either case, we loop down from MASK to 0. This has the effect
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
358 that the extra bits in the locale name are dropped in this order:
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
359 first the modifier, then the territory, then the codeset, then the
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
360 normalized_codeset. */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
361 for (cnt = dirlist_count > 1 ? mask : mask - 1; cnt >= 0; --cnt)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
362 if ((cnt & ~mask) == 0
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
363 && ((cnt & CEN_SPECIFIC) == 0 || (cnt & XPG_SPECIFIC) == 0)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
364 && ((cnt & XPG_CODESET) == 0 || (cnt & XPG_NORM_CODESET) == 0))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
365 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
366 if (dirlist_count > 1)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
367 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
368 /* Iterate over all elements of the DIRLIST. */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
369 char *dir = NULL;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
370
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
371 while ((dir = __argz_next ((char *) dirlist, dirlist_len, dir))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
372 != NULL)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
373 retval->successor[entries++]
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
374 = _nl_make_l10nflist (l10nfile_list, dir, strlen (dir) + 1,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
375 cnt, language, territory, codeset,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
376 normalized_codeset, modifier, special,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
377 sponsor, revision, filename, 1);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
378 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
379 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
380 retval->successor[entries++]
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
381 = _nl_make_l10nflist (l10nfile_list, dirlist, dirlist_len,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
382 cnt, language, territory, codeset,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
383 normalized_codeset, modifier, special,
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
384 sponsor, revision, filename, 1);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
385 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
386 retval->successor[entries] = NULL;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
387
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
388 return retval;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
389 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
390
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
391 /* Normalize codeset name. There is no standard for the codeset
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
392 names. Normalization allows the user to use any of the common
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
393 names. The return value is dynamically allocated and has to be
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
394 freed by the caller. */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
395 const char *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
396 _nl_normalize_codeset (codeset, name_len)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
397 const char *codeset;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
398 size_t name_len;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
399 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
400 int len = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
401 int only_digit = 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
402 char *retval;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
403 char *wp;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
404 size_t cnt;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
405
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
406 for (cnt = 0; cnt < name_len; ++cnt)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
407 if (isalnum ((unsigned char) codeset[cnt]))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
408 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
409 ++len;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
410
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
411 if (isalpha ((unsigned char) codeset[cnt]))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
412 only_digit = 0;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
413 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
414
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
415 retval = (char *) malloc ((only_digit ? 3 : 0) + len + 1);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
416
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
417 if (retval != NULL)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
418 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
419 if (only_digit)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
420 wp = stpcpy (retval, "iso");
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
421 else
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
422 wp = retval;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
423
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
424 for (cnt = 0; cnt < name_len; ++cnt)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
425 if (isalpha ((unsigned char) codeset[cnt]))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
426 *wp++ = tolower ((unsigned char) codeset[cnt]);
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
427 else if (isdigit ((unsigned char) codeset[cnt]))
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
428 *wp++ = codeset[cnt];
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
429
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
430 *wp = '\0';
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
431 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
432
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
433 return (const char *) retval;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
434 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
435
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
436
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
437 /* @@ begin of epilog @@ */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
438
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
439 /* We don't want libintl.a to depend on any other library. So we
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
440 avoid the non-standard function stpcpy. In GNU C Library this
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
441 function is available, though. Also allow the symbol HAVE_STPCPY
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
442 to be defined. */
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
443 #if !_LIBC && !HAVE_STPCPY
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
444 static char *
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
445 stpcpy (dest, src)
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
446 char *dest;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
447 const char *src;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
448 {
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
449 while ((*dest++ = *src++) != '\0')
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
450 /* Do nothing. */ ;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
451 return dest - 1;
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
452 }
cb178e5ad177 [svn] Import audacious source.
nenolod
parents:
diff changeset
453 #endif