Unix SMB/CIFS implementation.
display print functions
Copyright (C) Andrew Tridgell 2001
+ Copyright (C) Jelmer Vernooij 2007
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
/*
- this module provides functions for printing internal strings in the "display charset"
- This charset may be quite different from the chosen unix charset
+ this module provides functions for printing internal strings in the
+ "display charset".
+
+ This charset may be quite different from the chosen unix charset.
Eventually these functions will need to take care of column count constraints
#include "includes.h"
#include "system/locale.h"
+#include "param/param.h"
-_PUBLIC_ int d_vfprintf(FILE *f, const char *format, va_list ap) _PRINTF_ATTRIBUTE(2,0)
+static smb_iconv_t display_cd = (smb_iconv_t)-1;
+
+void d_set_iconv(smb_iconv_t cd)
+{
+ display_cd = cd;
+}
+
+_PUBLIC_ int d_vfprintf(FILE *f, const char *format, va_list ap)
{
char *p, *p2;
- int ret, maxlen, clen;
+ int ret, clen;
va_list ap2;
+ /* If there's nothing to convert, take a shortcut */
+ if (display_cd == (smb_iconv_t)-1) {
+ return vfprintf(f, format, ap);
+ }
+
/* do any message translations */
va_copy(ap2, ap);
ret = vasprintf(&p, format, ap2);
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:
- p2 = (char *)malloc(maxlen);
- if (!p2) {
- SAFE_FREE(p);
- return -1;
- }
- clen = convert_string(CH_UNIX, CH_DISPLAY, p, ret, p2, maxlen);
+ clen = convert_string_talloc_descriptor(NULL, display_cd, p, ret, (void **)&p2);
if (clen == -1) {
/* the string can't be converted - do the best we can,
filling in non-printing chars with '?' */
}
}
SAFE_FREE(p);
- SAFE_FREE(p2);
return ret;
}
-
- if (clen >= maxlen) {
- /* it didn't fit - try a larger buffer */
- maxlen *= 2;
- SAFE_FREE(p2);
- goto again;
- }
-
/* good, its converted OK */
SAFE_FREE(p);
ret = fwrite(p2, 1, clen, f);
- SAFE_FREE(p2);
+ talloc_free(p2);
return ret;
}
-_PUBLIC_ int d_fprintf(FILE *f, const char *format, ...) _PRINTF_ATTRIBUTE(2,3)
+_PUBLIC_ int d_fprintf(FILE *f, const char *format, ...)
{
int ret;
va_list ap;
return ret;
}
-static FILE *outfile;
-
-_PUBLIC_ int d_printf(const char *format, ...) _PRINTF_ATTRIBUTE(1,2)
+_PUBLIC_ int d_printf(const char *format, ...)
{
int ret;
va_list ap;
- if (!outfile) outfile = stdout;
-
va_start(ap, format);
- ret = d_vfprintf(outfile, format, ap);
+ ret = d_vfprintf(stdout, format, ap);
va_end(ap);
return ret;
}
-/* interactive programs need a way of tell d_*() to write to stderr instead
- of stdout */
-_PUBLIC_ void display_set_stderr(void)
-{
- outfile = stderr;
-}