2001-09-07 14:14:57 +00:00
/*
2002-01-30 06:08:46 +00:00
Unix SMB / CIFS implementation .
2001-09-07 14:14:57 +00: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 19:25:36 +00:00
the Free Software Foundation ; either version 3 of the License , or
2001-09-07 14:14:57 +00: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 00:52:41 +00:00
along with this program . If not , see < http : //www.gnu.org/licenses/>.
2001-09-07 14:14:57 +00: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 08:26:45 +00:00
Eventually these functions will need to take care of column count constraints
2001-09-07 14:14:57 +00:00
The d_ prefix on print functions in Samba refers to the display character set
conversion
*/
# include "includes.h"
2003-01-03 03:24:23 +00:00
int d_vfprintf ( FILE * f , const char * format , va_list ap )
2001-09-07 14:14:57 +00:00
{
2009-01-19 15:09:51 -08:00
char * p = NULL , * p2 = NULL ;
2001-09-07 14:14:57 +00:00
int ret , maxlen , clen ;
2001-10-11 08:40:42 +00:00
const char * msgstr ;
2002-07-15 10:35:28 +00:00
va_list ap2 ;
2001-10-11 08:40:42 +00:00
2009-01-19 15:09:51 -08:00
va_copy ( ap2 , ap ) ;
2001-10-11 08:40:42 +00:00
/* do any message translations */
msgstr = lang_msg ( format ) ;
2009-01-19 15:09:51 -08:00
if ( ! msgstr ) {
ret = - 1 ;
goto out ;
}
2002-07-15 10:35:28 +00:00
ret = vasprintf ( & p , msgstr , ap2 ) ;
2001-10-11 08:40:42 +00:00
lang_msg_free ( msgstr ) ;
2001-09-07 14:14:57 +00:00
2008-01-27 17:31:56 +11:00
if ( ret < = 0 ) {
2009-01-19 15:09:51 -08:00
ret = - 1 ;
goto out ;
2008-01-27 17:31:56 +11:00
}
2001-09-07 14:14:57 +00: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 04:30:55 +00:00
p2 = ( char * ) SMB_MALLOC ( maxlen ) ;
2001-09-07 14:14:57 +00:00
if ( ! p2 ) {
2009-01-19 15:09:51 -08:00
ret = - 1 ;
goto out ;
2001-09-07 14:14:57 +00:00
}
2009-01-19 15:09:51 -08:00
2004-03-11 22:48:24 +00:00
clen = convert_string ( CH_UNIX , CH_DISPLAY , p , ret , p2 , maxlen , True ) ;
2001-09-07 14:14:57 +00:00
if ( clen > = maxlen ) {
/* it didn't fit - try a larger buffer */
maxlen * = 2 ;
2001-09-17 02:19:44 +00:00
SAFE_FREE ( p2 ) ;
2001-09-07 14:14:57 +00:00
goto again ;
}
/* good, its converted OK */
ret = fwrite ( p2 , 1 , clen , f ) ;
2009-01-19 15:09:51 -08:00
out :
2001-09-07 14:14:57 +00:00
2009-01-19 15:09:51 -08:00
SAFE_FREE ( p ) ;
SAFE_FREE ( p2 ) ;
2008-01-27 17:31:56 +11:00
va_end ( ap2 ) ;
2001-09-07 14:14:57 +00:00
return ret ;
}
2001-09-08 02:59:23 +00:00
int d_fprintf ( FILE * f , const char * format , . . . )
2001-09-07 14:14:57 +00: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 02:59:23 +00:00
int d_printf ( const char * format , . . . )
2001-09-07 14:14:57 +00: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 ;
}