diff options
author | Werner Koch <[email protected]> | 2004-10-27 16:32:51 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2004-10-27 16:32:51 +0000 |
commit | e216c20f40d51bf3504c36e7311a03bf467fe725 (patch) | |
tree | 316bd9dcb20bf88ddb70fa3af47f0ac02c58d5be /util/simple-gettext.c | |
parent | (load_libiconv) [_WIN32]: new. (diff) | |
download | gnupg-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.c | 197 |
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; } |