projects
/
pspp-builds.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Convert to utf8 in data_out function.
[pspp-builds.git]
/
src
/
libpspp
/
i18n.c
diff --git
a/src/libpspp/i18n.c
b/src/libpspp/i18n.c
index 74ec1f1fdeb18c0116c95d8e30b6e12cd57381e6..d443619ac5bc9e6deb39860099dc788d53ab5e6d 100644
(file)
--- a/
src/libpspp/i18n.c
+++ b/
src/libpspp/i18n.c
@@
-24,9
+24,11
@@
#include <libintl.h>
#include <iconv.h>
#include <errno.h>
#include <libintl.h>
#include <iconv.h>
#include <errno.h>
+#include <relocatable.h>
#include "assertion.h"
#include "hmapx.h"
#include "hash-functions.h"
#include "assertion.h"
#include "hmapx.h"
#include "hash-functions.h"
+#include "pool.h"
#include "i18n.h"
#include "i18n.h"
@@
-56,8
+58,9
@@
create_iconv (const char* tocode, const char* fromcode)
size_t hash;
struct hmapx_node *node;
struct converter *converter;
size_t hash;
struct hmapx_node *node;
struct converter *converter;
+ assert (fromcode);
- hash = h
sh_hash_string (tocode) ^ hsh_hash_string (fromcode
);
+ hash = h
ash_string (tocode, hash_string (fromcode, 0)
);
HMAPX_FOR_EACH_WITH_HASH (converter, node, hash, &map)
if (!strcmp (tocode, converter->tocode)
&& !strcmp (fromcode, converter->fromcode))
HMAPX_FOR_EACH_WITH_HASH (converter, node, hash, &map)
if (!strcmp (tocode, converter->tocode)
&& !strcmp (fromcode, converter->fromcode))
@@
-68,7
+71,7
@@
create_iconv (const char* tocode, const char* fromcode)
converter->fromcode = xstrdup (fromcode);
converter->conv = iconv_open (tocode, fromcode);
hmapx_insert (&map, converter, hash);
converter->fromcode = xstrdup (fromcode);
converter->conv = iconv_open (tocode, fromcode);
hmapx_insert (&map, converter, hash);
-
+
/* I don't think it's safe to translate this string or to use messaging
as the convertors have not yet been set up */
if ( (iconv_t) -1 == converter->conv && 0 != strcmp (tocode, fromcode))
/* I don't think it's safe to translate this string or to use messaging
as the convertors have not yet been set up */
if ( (iconv_t) -1 == converter->conv && 0 != strcmp (tocode, fromcode))
@@
-83,13
+86,21
@@
create_iconv (const char* tocode, const char* fromcode)
return converter->conv;
}
return converter->conv;
}
+char *
+recode_string (const char *to, const char *from,
+ const char *text, int length)
+{
+ return recode_string_pool (to, from, text, length, NULL);
+}
+
+
/* Return a string based on TEXT converted according to HOW.
If length is not -1, then it must be the number of bytes in TEXT.
The returned string must be freed when no longer required.
*/
char *
/* Return a string based on TEXT converted according to HOW.
If length is not -1, then it must be the number of bytes in TEXT.
The returned string must be freed when no longer required.
*/
char *
-recode_string (const char *to, const char *from,
- const char *text, int length)
+recode_string
_pool
(const char *to, const char *from,
+ const char *text, int length
, struct pool *pool
)
{
char *outbuf = 0;
size_t outbufferlength;
{
char *outbuf = 0;
size_t outbufferlength;
@@
-119,7
+130,7
@@
recode_string (const char *to, const char *from,
if ( outbufferlength > length)
break;
if ( outbufferlength > length)
break;
- outbuf =
xmalloc(
outbufferlength);
+ outbuf =
pool_malloc (pool,
outbufferlength);
op = outbuf;
outbytes = outbufferlength;
op = outbuf;
outbytes = outbufferlength;
@@
-128,6
+139,9
@@
recode_string (const char *to, const char *from,
conv = create_iconv (to, from);
conv = create_iconv (to, from);
+ if ( (iconv_t) -1 == conv )
+ return xstrdup (text);
+
do {
const char *ip = text;
result = iconv (conv, (ICONV_CONST char **) &text, &inbytes,
do {
const char *ip = text;
result = iconv (conv, (ICONV_CONST char **) &text, &inbytes,
@@
-153,7
+167,7
@@
recode_string (const char *to, const char *from,
case E2BIG:
free (outbuf);
outbufferlength <<= 1;
case E2BIG:
free (outbuf);
outbufferlength <<= 1;
- outbuf =
xmalloc (
outbufferlength);
+ outbuf =
pool_malloc (pool,
outbufferlength);
op = outbuf;
outbytes = outbufferlength;
inbytes = length;
op = outbuf;
outbytes = outbufferlength;
inbytes = length;
@@
-161,6
+175,7
@@
recode_string (const char *to, const char *from,
break;
default:
/* should never happen */
break;
default:
/* should never happen */
+ fprintf (stderr, "Character conversion error: %s\n", strerror (the_error));
NOT_REACHED ();
break;
}
NOT_REACHED ();
break;
}
@@
-170,7
+185,7
@@
recode_string (const char *to, const char *from,
if (outbytes == 0 )
{
char *const oldaddr = outbuf;
if (outbytes == 0 )
{
char *const oldaddr = outbuf;
- outbuf =
xrealloc (
outbuf, outbufferlength + 1);
+ outbuf =
pool_realloc (pool,
outbuf, outbufferlength + 1);
op += (outbuf - oldaddr) ;
}
op += (outbuf - oldaddr) ;
}
@@
-186,13
+201,13
@@
i18n_init (void)
{
#if ENABLE_NLS
setlocale (LC_CTYPE, "");
{
#if ENABLE_NLS
setlocale (LC_CTYPE, "");
-#if
HAVE_
LC_MESSAGES
+#if
def
LC_MESSAGES
setlocale (LC_MESSAGES, "");
#endif
#if HAVE_LC_PAPER
setlocale (LC_PAPER, "");
#endif
setlocale (LC_MESSAGES, "");
#endif
#if HAVE_LC_PAPER
setlocale (LC_PAPER, "");
#endif
- bindtextdomain (PACKAGE,
locale_dir
);
+ bindtextdomain (PACKAGE,
relocate(locale_dir)
);
textdomain (PACKAGE);
#endif /* ENABLE_NLS */
textdomain (PACKAGE);
#endif /* ENABLE_NLS */
@@
-263,9
+278,12
@@
void
i18n_done (void)
{
struct hmapx_node *node;
i18n_done (void)
{
struct hmapx_node *node;
- iconv_t conv;
- HMAPX_FOR_EACH (conv, node, &map)
- iconv_close (conv);
+ struct converter *cvtr;
+ HMAPX_FOR_EACH (cvtr, node, &map)
+ {
+ iconv_close (cvtr->conv);
+ free (cvtr);
+ }
hmapx_destroy (&map);
hmapx_destroy (&map);