/** \file translate.c Translation library, internally uses catgets */ #include "config.h" #include #include #include #include #if HAVE_LIBINTL_H #include #endif #include "common.h" #include "util.h" #if HAVE_GETTEXT /** Number of string_buffer_t in the ring of buffers */ #define BUFF_COUNT 64 /** The ring of string_buffer_t */ static string_buffer_t buff[BUFF_COUNT]; /** Current position in the ring */ static int curr_buff=0; /** Buffer used by translate_wcs2str */ static char *wcs2str_buff=0; /** Size of buffer used by translate_wcs2str */ static size_t wcs2str_buff_count=0; /** Wide to narrow character conversion. Internal implementation that avoids exessive calls to malloc */ static char *translate_wcs2str( const wchar_t *in ) { size_t len = MAX_UTF8_BYTES*wcslen(in)+1; if( len > wcs2str_buff_count ) { wcs2str_buff = realloc( wcs2str_buff, len ); if( wcs2str_buff == 0 ) { die_mem(); } } wcstombs( wcs2str_buff, in, MAX_UTF8_BYTES*wcslen(in)+1 ); return wcs2str_buff; } const wchar_t *wgettext( const wchar_t *in ) { if( !in ) return in; char *mbs_in = translate_wcs2str( in ); char *out = gettext( mbs_in ); wchar_t *wres=0; sb_clear( &buff[curr_buff] ); sb_printf( &buff[curr_buff], L"%s", out ); wres = (wchar_t *)buff[curr_buff].buff; curr_buff = (curr_buff+1)%BUFF_COUNT; /* write( 2, res, strlen(res) ); */ // debug( 1, L"%ls -> %s (%d) -> %ls (%d)\n", in, out, strlen(out) , wres, wcslen(wres) ); return wres; } void translate_init() { int i; for(i=0; i