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
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 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
{
char * p , * p2 ;
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
/* do any message translations */
msgstr = lang_msg ( format ) ;
if ( ! msgstr ) return - 1 ;
2002-07-15 14:35:28 +04:00
VA_COPY ( ap2 , ap ) ;
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
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 :
2004-12-07 21:25:53 +03:00
p2 = SMB_MALLOC ( maxlen ) ;
2001-09-07 18:14:57 +04:00
if ( ! p2 ) {
2001-09-17 06:19:44 +04:00
SAFE_FREE ( p ) ;
2001-09-07 18:14:57 +04:00
return - 1 ;
}
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 */
2001-09-17 06:19:44 +04:00
SAFE_FREE ( p ) ;
2001-09-07 18:14:57 +04:00
ret = fwrite ( p2 , 1 , clen , f ) ;
2001-09-17 06:19:44 +04:00
SAFE_FREE ( p2 ) ;
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 ;
}