1
0
Fork 0
mirror of git://git.gnupg.org/gnupg.git synced 2025-07-02 22:46:30 +02:00

* 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.
This commit is contained in:
Werner Koch 2004-10-27 16:32:51 +00:00
parent ea62673cdc
commit e216c20f40
36 changed files with 5132 additions and 5409 deletions

View file

@ -1,5 +1,9 @@
2004-10-27 Werner Koch <wk@g10code.com>
* 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.
@ -7,7 +11,8 @@
iconv_open.
(handle_iconv_error): Made this function match iconv_open argumnet
ordering.
(utf8_to_native): Disable all quoting for DELIM == -1.
2004-10-26 Werner Koch <wk@g10code.com>
* strgutil.c (mem2str): Translated comment to English.

View file

@ -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;
struct overflow_space_s *os;
char *p;
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;
}
}
}
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);
}
#endif /* unused code */
return (const char*)p;
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";
}
return (const char*)p;
}

View file

@ -480,10 +480,17 @@ set_native_charset( const char *newset )
#ifdef _WIN32
static char codepage[30];
sprintf (codepage, "CP%u", (unsigned int)GetACP ());
/* If it is the Windows name for Latin-1 we use the
* standard name instead to avoid loading of iconv.dll. */
/* We are a console program thus we need to use the
GetConsoleOutputCP fucntion and not the the GetACP which
would give the codepage for a GUI program. Note this is
not a bulletproof detection because GetConsoleCP might
retrun a different one for console input. Not sure how to
cope with that. */
sprintf (codepage, "CP%u", (unsigned int)GetConsoleOutputCP ());
/* If it is the Windows name for Latin-1 we use the standard
name instead to avoid loading of iconv.dll. Unfortunately
it is often CP850 and we don't have a custom translation
for it. */
if (!strcmp (codepage, "CP1252"))
newset = "iso-8859-1";
else
@ -688,8 +695,9 @@ native_to_utf8( const char *string )
* Convert string, which is in UTF8 to native encoding. illegal
* encodings by some "\xnn" and quote all control characters. A
* character with value DELIM will always be quoted, it must be a
* vanilla ASCII character.
*/
* vanilla ASCII character. A DELIM value of -1 is special: it disables
* all quoting of control characters.
*/
char *
utf8_to_native( const char *string, size_t length, int delim )
{
@ -722,8 +730,9 @@ utf8_to_native( const char *string, size_t length, int delim )
}
if( !nleft ) {
if( !(*s & 0x80) ) { /* plain ascii */
if( *s < 0x20 || *s == 0x7f || *s == delim ||
(delim && *s=='\\')) {
if( delim != -1
&& (*s < 0x20 || *s == 0x7f || *s == delim
|| (delim && *s=='\\'))) {
n++;
if( p )
*p++ = '\\';