2006-01-04 22:51:02 +10:00
/** \file translate.c
Translation library , internally uses catgets
*/
# include "config.h"
2006-02-28 23:17:16 +10:00
2006-01-04 22:51:02 +10:00
# include <stdio.h>
# include <stdlib.h>
2006-01-19 04:37:58 +10:00
# include <unistd.h>
# include <wchar.h>
# if HAVE_LIBINTL_H
2006-01-04 22:51:02 +10:00
# include <libintl.h>
2006-01-19 04:37:58 +10:00
# endif
2006-01-04 22:51:02 +10:00
# include "common.h"
2006-02-28 23:17:16 +10:00
# include "fallback.h"
2006-01-04 22:51:02 +10:00
# include "util.h"
2006-02-28 23:17:16 +10:00
2006-02-10 01:50:20 +10:00
# include "halloc_util.h"
2006-01-04 22:51:02 +10:00
# if HAVE_GETTEXT
2006-01-24 06:40:14 +10:00
/**
Number of string_buffer_t in the ring of buffers
*/
2006-01-04 22:51:02 +10:00
# define BUFF_COUNT 64
2006-01-24 06:40:14 +10:00
/**
The ring of string_buffer_t
*/
2006-01-04 22:51:02 +10:00
static string_buffer_t buff [ BUFF_COUNT ] ;
2006-01-24 06:40:14 +10:00
/**
Current position in the ring
*/
2006-01-04 22:51:02 +10:00
static int curr_buff = 0 ;
2006-01-24 06:40:14 +10:00
/**
Buffer used by translate_wcs2str
*/
2006-01-05 23:41:59 +10:00
static char * wcs2str_buff = 0 ;
2006-01-24 06:40:14 +10:00
/**
Size of buffer used by translate_wcs2str
*/
2006-01-05 23:41:59 +10:00
static size_t wcs2str_buff_count = 0 ;
2006-02-04 23:09:14 +10:00
static int is_init = 0 ;
2006-02-10 01:50:20 +10:00
static void internal_destroy ( )
{
int i ;
if ( ! is_init )
return ;
is_init = 0 ;
for ( i = 0 ; i < BUFF_COUNT ; i + + )
sb_destroy ( & buff [ i ] ) ;
free ( wcs2str_buff ) ;
}
2006-02-04 23:09:14 +10:00
static void internal_init ( )
{
int i ;
is_init = 1 ;
for ( i = 0 ; i < BUFF_COUNT ; i + + )
2006-02-10 01:50:20 +10:00
{
2006-02-04 23:09:14 +10:00
sb_init ( & buff [ i ] ) ;
2006-02-10 01:50:20 +10:00
}
halloc_register_function_void ( global_context , & internal_destroy ) ;
2006-02-04 23:09:14 +10:00
bindtextdomain ( PACKAGE_NAME , LOCALEDIR ) ;
textdomain ( PACKAGE_NAME ) ;
}
2006-01-24 06:40:14 +10:00
/**
Wide to narrow character conversion . Internal implementation that
avoids exessive calls to malloc
*/
static char * translate_wcs2str ( const wchar_t * in )
2006-01-05 23:41:59 +10:00
{
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 ;
}
2006-01-04 22:51:02 +10:00
const wchar_t * wgettext ( const wchar_t * in )
{
2006-01-08 12:56:56 +10:00
if ( ! in )
return in ;
2006-02-04 23:09:14 +10:00
if ( ! is_init )
internal_init ( ) ;
2006-01-05 23:41:59 +10:00
char * mbs_in = translate_wcs2str ( in ) ;
2006-01-04 22:51:02 +10:00
char * out = gettext ( mbs_in ) ;
wchar_t * wres = 0 ;
sb_clear ( & buff [ curr_buff ] ) ;
2006-01-05 23:41:59 +10:00
2006-01-04 22:51:02 +10:00
sb_printf ( & buff [ curr_buff ] , L " %s " , out ) ;
wres = ( wchar_t * ) buff [ curr_buff ] . buff ;
curr_buff = ( curr_buff + 1 ) % BUFF_COUNT ;
return wres ;
}
# else
const wchar_t * wgettext ( const wchar_t * in )
{
return in ;
}
# endif