aboutsummaryrefslogtreecommitdiffstats
path: root/util/simple-gettext.c
diff options
context:
space:
mode:
authorWerner Koch <[email protected]>2004-10-27 16:32:51 +0000
committerWerner Koch <[email protected]>2004-10-27 16:32:51 +0000
commite216c20f40d51bf3504c36e7311a03bf467fe725 (patch)
tree316bd9dcb20bf88ddb70fa3af47f0ac02c58d5be /util/simple-gettext.c
parent(load_libiconv) [_WIN32]: new. (diff)
downloadgnupg-e216c20f40d51bf3504c36e7311a03bf467fe725.tar.gz
gnupg-e216c20f40d51bf3504c36e7311a03bf467fe725.zip
* dynload.h: Always use it for _WIN32.
* LINGUAS: Better don't have comments in this file. * mk-w32-dist: Use utf-8 encoding for all MO files. * simple-gettext.c: Removed windows.h. (get_string): On the fly translation from utf-8 to active character set. * strgutil.c (load_libiconv) [_WIN32]: new. (set_native_charset) [_WIN32]: Call it here and autodetect the used code page. (native_to_utf8, utf8_to_native): Reverted arguments for iconv_open. (handle_iconv_error): Made this function match iconv_open argumnet ordering. (utf8_to_native): Disable all quoting for DELIM == -1.
Diffstat (limited to 'util/simple-gettext.c')
-rw-r--r--util/simple-gettext.c197
1 files changed, 69 insertions, 128 deletions
diff --git a/util/simple-gettext.c b/util/simple-gettext.c
index 151e7b326..7705b5d1c 100644
--- a/util/simple-gettext.c
+++ b/util/simple-gettext.c
@@ -28,7 +28,7 @@
#include <config.h>
#ifdef USE_SIMPLE_GETTEXT
#if !defined (_WIN32) && !defined (__CYGWIN32__)
-#error This file can only be used udner Windows or Cygwin32
+#error This file can only be used under Windows or Cygwin32
#endif
#include <stdio.h>
@@ -38,7 +38,6 @@
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h>
-#include <windows.h>
#include "types.h"
#include "util.h"
@@ -79,13 +78,22 @@ struct string_desc
};
+struct overflow_space_s
+{
+ struct overflow_space_s *next;
+ u32 idx;
+ char d[1];
+};
struct loaded_domain
{
char *data;
int must_swap;
u32 nstrings;
-/* char *mapped; */
+ char *mapped; /* 0 = not yet mapped, 1 = mapped,
+ 2 = mapped to
+ overflow space */
+ struct overflow_space_s *overflow_space;
struct string_desc *orig_tab;
struct string_desc *trans_tab;
u32 hash_size;
@@ -210,13 +218,13 @@ load_domain( const char *filename )
return NULL;
}
- /* allocate an array to keep track of code page mappings */
-/* domain->mapped = calloc( 1, domain->nstrings ); */
-/* if( !domain->mapped ) { */
-/* free( data ); */
-/* free( domain ); */
-/* return NULL; */
-/* } */
+ /* Allocate an array to keep track of code page mappings. */
+ domain->mapped = calloc( 1, domain->nstrings );
+ if( !domain->mapped ) {
+ free( data );
+ free( domain );
+ return NULL;
+ }
return domain;
}
@@ -225,7 +233,7 @@ load_domain( const char *filename )
/****************
* Set the file used for translations. Pass a NULL to disable
* translation. A new filename may be set at anytime.
- * WARNING: After changing the filename you shoudl not access any data
+ * WARNING: After changing the filename you should not access any data
* retrieved by gettext().
*/
int
@@ -272,136 +280,69 @@ set_gettext_file( const char *filename )
}
if( the_domain ) {
+ struct overflow_space_s *os, *os2;
free( the_domain->data );
-/* free( the_domain->mapped ); */
+ free( the_domain->mapped );
+ for (os=the_domain->overflow_space; os; os = os2) {
+ os2 = os->next;
+ free (os);
+ }
free( the_domain );
the_domain = NULL;
}
the_domain = domain;
- return NULL;
+ return 0;
}
static const char*
get_string( struct loaded_domain *domain, u32 idx )
{
- char *p = domain->data + SWAPIT(domain->must_swap,
- domain->trans_tab[idx].offset);
-#if 0 /* Mapping is not used any more. Instead we convert the files when
- Creating the binary distribution. */
- if( !domain->mapped[idx] ) {
- byte *pp;
-
- domain->mapped[idx] = 1;
- /* we assume Latin1 -> CP 850 for now */
- for( pp=p; *pp; pp++ ) {
- if( (*pp & 0x80) ) {
- switch( *pp ) {
- /* ISO-8859-1 to IBM-CP-850 */
- case 0xa0: *pp = '\xff' ; break; /* nobreakspace */
- case 0xa1: *pp = '\xad' ; break; /* exclamdown */
- case 0xa2: *pp = '\xbd' ; break; /* cent */
- case 0xa3: *pp = '\x9c' ; break; /* sterling */
- case 0xa4: *pp = '\xcf' ; break; /* currency */
- case 0xa5: *pp = '\xbe' ; break; /* yen */
- case 0xa6: *pp = '\xdd' ; break; /* brokenbar */
- case 0xa7: *pp = '\xf5' ; break; /* section */
- case 0xa8: *pp = '\xf9' ; break; /* diaeresis */
- case 0xa9: *pp = '\xb8' ; break; /* copyright */
- case 0xaa: *pp = '\xa6' ; break; /* ordfeminine */
- case 0xab: *pp = '\xae' ; break; /* guillemotleft */
- case 0xac: *pp = '\xaa' ; break; /* notsign */
- case 0xad: *pp = '\xf0' ; break; /* hyphen */
- case 0xae: *pp = '\xa9' ; break; /* registered */
- case 0xaf: *pp = '\xee' ; break; /* macron */
- case 0xb0: *pp = '\xf8' ; break; /* degree */
- case 0xb1: *pp = '\xf1' ; break; /* plusminus */
- case 0xb2: *pp = '\xfd' ; break; /* twosuperior */
- case 0xb3: *pp = '\xfc' ; break; /* threesuperior */
- case 0xb4: *pp = '\xef' ; break; /* acute */
- case 0xb5: *pp = '\xe6' ; break; /* mu */
- case 0xb6: *pp = '\xf4' ; break; /* paragraph */
- case 0xb7: *pp = '\xfa' ; break; /* periodcentered */
- case 0xb8: *pp = '\xf7' ; break; /* cedilla */
- case 0xb9: *pp = '\xfb' ; break; /* onesuperior */
- case 0xba: *pp = '\xa7' ; break; /* masculine */
- case 0xbb: *pp = '\xaf' ; break; /* guillemotright */
- case 0xbc: *pp = '\xac' ; break; /* onequarter */
- case 0xbd: *pp = '\xab' ; break; /* onehalf */
- case 0xbe: *pp = '\xf3' ; break; /* threequarters */
- case 0xbf: *pp = '\xa8' ; break; /* questiondown */
- case 0xc0: *pp = '\xb7' ; break; /* Agrave */
- case 0xc1: *pp = '\xb5' ; break; /* Aacute */
- case 0xc2: *pp = '\xb6' ; break; /* Acircumflex */
- case 0xc3: *pp = '\xc7' ; break; /* Atilde */
- case 0xc4: *pp = '\x8e' ; break; /* Adiaeresis */
- case 0xc5: *pp = '\x8f' ; break; /* Aring */
- case 0xc6: *pp = '\x92' ; break; /* AE */
- case 0xc7: *pp = '\x80' ; break; /* Ccedilla */
- case 0xc8: *pp = '\xd4' ; break; /* Egrave */
- case 0xc9: *pp = '\x90' ; break; /* Eacute */
- case 0xca: *pp = '\xd2' ; break; /* Ecircumflex */
- case 0xcb: *pp = '\xd3' ; break; /* Ediaeresis */
- case 0xcc: *pp = '\xde' ; break; /* Igrave */
- case 0xcd: *pp = '\xd6' ; break; /* Iacute */
- case 0xce: *pp = '\xd7' ; break; /* Icircumflex */
- case 0xcf: *pp = '\xd8' ; break; /* Idiaeresis */
- case 0xd0: *pp = '\xd1' ; break; /* Eth */
- case 0xd1: *pp = '\xa5' ; break; /* Ntilde */
- case 0xd2: *pp = '\xe3' ; break; /* Ograve */
- case 0xd3: *pp = '\xe0' ; break; /* Oacute */
- case 0xd4: *pp = '\xe2' ; break; /* Ocircumflex */
- case 0xd5: *pp = '\xe5' ; break; /* Otilde */
- case 0xd6: *pp = '\x99' ; break; /* Odiaeresis */
- case 0xd7: *pp = '\x9e' ; break; /* multiply */
- case 0xd8: *pp = '\x9d' ; break; /* Ooblique */
- case 0xd9: *pp = '\xeb' ; break; /* Ugrave */
- case 0xda: *pp = '\xe9' ; break; /* Uacute */
- case 0xdb: *pp = '\xea' ; break; /* Ucircumflex */
- case 0xdc: *pp = '\x9a' ; break; /* Udiaeresis */
- case 0xdd: *pp = '\xed' ; break; /* Yacute */
- case 0xde: *pp = '\xe8' ; break; /* Thorn */
- case 0xdf: *pp = '\xe1' ; break; /* ssharp */
- case 0xe0: *pp = '\x85' ; break; /* agrave */
- case 0xe1: *pp = '\xa0' ; break; /* aacute */
- case 0xe2: *pp = '\x83' ; break; /* acircumflex */
- case 0xe3: *pp = '\xc6' ; break; /* atilde */
- case 0xe4: *pp = '\x84' ; break; /* adiaeresis */
- case 0xe5: *pp = '\x86' ; break; /* aring */
- case 0xe6: *pp = '\x91' ; break; /* ae */
- case 0xe7: *pp = '\x87' ; break; /* ccedilla */
- case 0xe8: *pp = '\x8a' ; break; /* egrave */
- case 0xe9: *pp = '\x82' ; break; /* eacute */
- case 0xea: *pp = '\x88' ; break; /* ecircumflex */
- case 0xeb: *pp = '\x89' ; break; /* ediaeresis */
- case 0xec: *pp = '\x8d' ; break; /* igrave */
- case 0xed: *pp = '\xa1' ; break; /* iacute */
- case 0xee: *pp = '\x8c' ; break; /* icircumflex */
- case 0xef: *pp = '\x8b' ; break; /* idiaeresis */
- case 0xf0: *pp = '\xd0' ; break; /* eth */
- case 0xf1: *pp = '\xa4' ; break; /* ntilde */
- case 0xf2: *pp = '\x95' ; break; /* ograve */
- case 0xf3: *pp = '\xa2' ; break; /* oacute */
- case 0xf4: *pp = '\x93' ; break; /* ocircumflex */
- case 0xf5: *pp = '\xe4' ; break; /* otilde */
- case 0xf6: *pp = '\x94' ; break; /* odiaeresis */
- case 0xf7: *pp = '\xf6' ; break; /* division */
- case 0xf8: *pp = '\x9b' ; break; /* oslash */
- case 0xf9: *pp = '\x97' ; break; /* ugrave */
- case 0xfa: *pp = '\xa3' ; break; /* uacute */
- case 0xfb: *pp = '\x96' ; break; /* ucircumflex */
- case 0xfc: *pp = '\x81' ; break; /* udiaeresis */
- case 0xfd: *pp = '\xec' ; break; /* yacute */
- case 0xfe: *pp = '\xe7' ; break; /* thorn */
- case 0xff: *pp = '\x98' ; break; /* ydiaeresis */
- default : break;
- }
- }
- }
+ struct overflow_space_s *os;
+ char *p;
+ p = domain->data + SWAPIT(domain->must_swap, domain->trans_tab[idx].offset);
+ if (!domain->mapped[idx])
+ {
+ size_t plen, buflen;
+ char *buf;
+ static int debug_hack;
+
+ domain->mapped[idx] = 1;
+
+ plen = strlen (p);
+ buf = utf8_to_native (p, plen, -1);
+ buflen = strlen (buf);
+ if (buflen <= plen && (++debug_hack %3))
+ strcpy (p, buf);
+ else
+ {
+ /* There is not enough space for the translation - store it
+ in the overflow_space else and mark that in the mapped
+ array. Because we expect that this won't happen too
+ often, we use a simple linked list. */
+ os = malloc (sizeof *os + buflen);
+ if (os)
+ {
+ os->idx = idx;
+ strcpy (os->d, buf);
+ os->next = domain->overflow_space;
+ domain->overflow_space = os;
+ p = os->d;
+ }
+ else
+ p = "ERROR in GETTEXT MALLOC";
+ }
+ m_free (buf);
+ }
+ else if (domain->mapped[idx] == 2)
+ { /* We need to get the string from the overflow_space. */
+ for (os=domain->overflow_space; os; os = os->next)
+ if (os->idx == idx)
+ return (const char*)os->d;
+ p = "ERROR in GETTEXT\n";
}
-#endif /* unused code */
- return (const char*)p;
+ return (const char*)p;
}