2001-09-07 18:14:57 +04:00
/*
2002-01-30 09:08:46 +03:00
Unix SMB / CIFS implementation .
2001-09-07 18:14:57 +04:00
display print functions
Copyright ( C ) Andrew Tridgell 2001
This program is free software ; you can redistribute it and / or modify
it under the terms of the GNU General Public License as published by
2007-07-09 23:25:36 +04:00
the Free Software Foundation ; either version 3 of the License , or
2001-09-07 18:14:57 +04:00
( at your option ) any later version .
This program is distributed in the hope that it will be useful ,
but WITHOUT ANY WARRANTY ; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
GNU General Public License for more details .
You should have received a copy of the GNU General Public License
2007-07-10 04:52:41 +04:00
along with this program . If not , see < http : //www.gnu.org/licenses/>.
2001-09-07 18:14:57 +04:00
*/
/*
this module provides functions for printing internal strings in the " display charset "
This charset may be quite different from the chosen unix charset
2001-10-29 11:26:45 +03:00
Eventually these functions will need to take care of column count constraints
2001-09-07 18:14:57 +04:00
The d_ prefix on print functions in Samba refers to the display character set
conversion
*/
# include "includes.h"
2003-01-03 06:24:23 +03:00
int d_vfprintf ( FILE * f , const char * format , va_list ap )
2001-09-07 18:14:57 +04:00
{
2009-01-20 02:09:51 +03:00
char * p = NULL , * p2 = NULL ;
2001-09-07 18:14:57 +04:00
int ret , maxlen , clen ;
2001-10-11 12:40:42 +04:00
const char * msgstr ;
2002-07-15 14:35:28 +04:00
va_list ap2 ;
2001-10-11 12:40:42 +04:00
2009-01-20 02:09:51 +03:00
va_copy ( ap2 , ap ) ;
2001-10-11 12:40:42 +04:00
/* do any message translations */
msgstr = lang_msg ( format ) ;
2009-01-20 02:09:51 +03:00
if ( ! msgstr ) {
ret = - 1 ;
goto out ;
}
2002-07-15 14:35:28 +04:00
ret = vasprintf ( & p , msgstr , ap2 ) ;
2001-10-11 12:40:42 +04:00
lang_msg_free ( msgstr ) ;
2001-09-07 18:14:57 +04:00
2008-01-27 09:31:56 +03:00
if ( ret < = 0 ) {
2009-01-20 02:09:51 +03:00
ret = - 1 ;
goto out ;
2008-01-27 09:31:56 +03:00
}
2001-09-07 18:14:57 +04:00
/* now we have the string in unix format, convert it to the display
charset , but beware of it growing */
maxlen = ret * 2 ;
again :
2006-07-31 08:30:55 +04:00
p2 = ( char * ) SMB_MALLOC ( maxlen ) ;
2001-09-07 18:14:57 +04:00
if ( ! p2 ) {
2009-01-20 02:09:51 +03:00
ret = - 1 ;
goto out ;
2001-09-07 18:14:57 +04:00
}
2009-01-20 02:09:51 +03:00
2004-03-12 01:48:24 +03:00
clen = convert_string ( CH_UNIX , CH_DISPLAY , p , ret , p2 , maxlen , True ) ;
2001-09-07 18:14:57 +04:00
if ( clen > = maxlen ) {
/* it didn't fit - try a larger buffer */
maxlen * = 2 ;
2001-09-17 06:19:44 +04:00
SAFE_FREE ( p2 ) ;
2001-09-07 18:14:57 +04:00
goto again ;
}
/* good, its converted OK */
ret = fwrite ( p2 , 1 , clen , f ) ;
2009-01-20 02:09:51 +03:00
out :
2001-09-07 18:14:57 +04:00
2009-01-20 02:09:51 +03:00
SAFE_FREE ( p ) ;
SAFE_FREE ( p2 ) ;
2008-01-27 09:31:56 +03:00
va_end ( ap2 ) ;
2001-09-07 18:14:57 +04:00
return ret ;
}
2001-09-08 06:59:23 +04:00
int d_fprintf ( FILE * f , const char * format , . . . )
2001-09-07 18:14:57 +04:00
{
int ret ;
va_list ap ;
va_start ( ap , format ) ;
ret = d_vfprintf ( f , format , ap ) ;
va_end ( ap ) ;
return ret ;
}
static FILE * outfile ;
2001-09-08 06:59:23 +04:00
int d_printf ( const char * format , . . . )
2001-09-07 18:14:57 +04:00
{
int ret ;
va_list ap ;
if ( ! outfile ) outfile = stdout ;
va_start ( ap , format ) ;
ret = d_vfprintf ( outfile , format , ap ) ;
va_end ( ap ) ;
return ret ;
}
/* interactive programs need a way of tell d_*() to write to stderr instead
of stdout */
void display_set_stderr ( void )
{
outfile = stderr ;
}