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
the Free Software Foundation ; either version 2 of the License , or
( 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
along with this program ; if not , write to the Free Software
Foundation , Inc . , 675 Mass Ave , Cambridge , MA 0213 9 , USA .
*/
/*
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
{
char * p , * p2 ;
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
/* do any message translations */
msgstr = lang_msg ( format ) ;
if ( ! msgstr ) return - 1 ;
2002-07-15 10:35:28 +00:00
VA_COPY ( ap2 , ap ) ;
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
if ( ret < = 0 ) return ret ;
/* 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 ) {
2001-09-17 02:19:44 +00:00
SAFE_FREE ( p ) ;
2001-09-07 14:14:57 +00:00
return - 1 ;
}
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 */
2001-09-17 02:19:44 +00:00
SAFE_FREE ( p ) ;
2001-09-07 14:14:57 +00:00
ret = fwrite ( p2 , 1 , clen , f ) ;
2001-09-17 02:19:44 +00:00
SAFE_FREE ( p2 ) ;
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 ;
}