diff options
Diffstat (limited to '')
-rw-r--r-- | util/strgutil.c | 85 |
1 files changed, 80 insertions, 5 deletions
diff --git a/util/strgutil.c b/util/strgutil.c index 9ab63a047..ea9527bd8 100644 --- a/util/strgutil.c +++ b/util/strgutil.c @@ -65,6 +65,26 @@ static ushort latin2_unicode[128] = { 0x0159,0x016F,0x00FA,0x0171,0x00FC,0x00FD,0x0163,0x02D9 }; +static ushort ibm850_unicode[128] = { + 0x00c7,0x00fc,0x00e9,0x00e2,0x00e4,0x00e0,0x00e5,0x00e7, + 0x00ea,0x00eb,0x00e8,0x00ef,0x00ee,0x00ec,0x00c4,0x00c5, + 0x00c9,0x00e6,0x00c6,0x00f4,0x00f6,0x00f2,0x00fb,0x00f9, + 0x00ff,0x00d6,0x00dc,0x00f8,0x00a3,0x00d8,0x00d7,0x0192, + 0x00e1,0x00ed,0x00f3,0x00fa,0x00f1,0x00d1,0x00aa,0x00ba, + 0x00bf,0x00ae,0x00ac,0x00bd,0x00bc,0x00a1,0x00ab,0x00bb, + 0x2591,0x2592,0x2593,0x2502,0x2524,0x00c1,0x00c2,0x00c0, + 0x00a9,0x2563,0x2551,0x2557,0x255d,0x00a2,0x00a5,0x2510, + 0x2514,0x2534,0x252c,0x251c,0x2500,0x253c,0x00e3,0x00c3, + 0x255a,0x2554,0x2569,0x2566,0x2560,0x2550,0x256c,0x00a4, + 0x00f0,0x00d0,0x00ca,0x00cb,0x00c8,0x0131,0x00cd,0x00ce, + 0x00cf,0x2518,0x250c,0x2588,0x2584,0x00a6,0x00cc,0x2580, + 0x00d3,0x00df,0x00d4,0x00d2,0x00f5,0x00d5,0x00b5,0x00fe, + 0x00de,0x00da,0x00db,0x00d9,0x00fd,0x00dd,0x00af,0x00b4, + 0x00ad,0x00b1,0x2017,0x00be,0x00b6,0x00a7,0x00f7,0x00b8, + 0x00b0,0x00a8,0x00b7,0x00b9,0x00b3,0x00b2,0x25a0,0x00a0, +}; + +static int query_native_charset_done = 0; static const char *active_charset_name = "iso-8859-1"; static ushort *active_charset = NULL; @@ -291,9 +311,65 @@ string_count_chr( const char *string, int c ) } +static const char* +query_native_charset(void) +{ + #ifdef __MINGW32__ + unsigned int cp; + + cp = GetConsoleOutputCP(); + if( cp != GetConsoleCP() ) { + /* The input cgarset is not equal to the output charset + * our system depends on it and therefore we will set + * same the same (this won't work on Windows 95) */ + if( !SetConsoleCP( cp ) ) + log_info("can't set Input-CP to Output-CP: %d\n", + (int)GetLastError() ); + } + /* we could read the registry, but this seems to be too much work */ + switch( cp ) { + case 850: return "ibm850"; + case 437: return "ibm437"; + case 1252: return "iso-8859-1"; + default: + log_info("unknown MS-Windows CodePage %u " + "- trying to switch to Latin-1\n", cp ); + /* try to set latin-1 */ + if( !SetConsoleOutputCP( 1252 ) ) { + if( !SetConsoleCP( 1252 ) ) + return "iso-8859-1"; + else /* back off */ + SetConsoleOutputCP( cp ); + } + log_info("no information about MS-Windows CodePage %u\n", cp ); + return NULL; + } + #else + return NULL; /* unknown */ + #endif +} + + +const char* +get_native_charset() +{ + if( !query_native_charset_done ) { + const char *s; + + query_native_charset_done = 1; + s = query_native_charset(); + if( s ) + set_native_charset(s); + } + + return active_charset_name; +} + + int set_native_charset( const char *newset ) { + query_native_charset_done = 1; /* don't do this when we want to set one*/ if( !stricmp( newset, "iso-8859-1" ) ) { active_charset_name = "iso-8859-1"; active_charset = NULL; @@ -306,16 +382,15 @@ set_native_charset( const char *newset ) active_charset_name = "koi8-r"; active_charset = koi8_unicode; } + else if( !stricmp( newset, "ibm850" ) || !stricmp( newset, "ibm437" ) ) { + active_charset_name = "ibm850"; + active_charset = ibm850_unicode; + } else return G10ERR_GENERAL; return 0; } -const char* -get_native_charset() -{ - return active_charset_name; -} /**************** * Convert string, which is in native encoding to UTF8 and return the |