1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160
|
/*
* The Sleuth Kit
*
* Brian Carrier [carrier <at> sleuthkit [dot] org]
* Copyright (c) 2007-2011 Brian Carrier. All Rights reserved
*
* This software is distributed under the Common Public License 1.0
*/
/** \file tsk_printf.c
* These are printf wrappers that are needed so that we can
* easily print in both Unix and Windows. For Unix, the
* internal UTF-8 representation is kept and a normal printf
* is performed. For Windows, the UTF-8 representation is first
* converted to UTF-16 and then printed
*/
#include "tsk_base_i.h"
#include <stdarg.h>
/** \internal
* Convert the UTF-8 printf arguments to UTF-16 and fill in the
* printf types (%s, %d, etc.)
*
* @param wbuf wide char string to write result to
* @param wlen number of characters in wbuf
* @param msg printf message string
* @param args Arguments to use when filling in message string
* @returns 1 on error and 0 on success
*/
#ifdef TSK_WIN32
static int
tsk_printf_conv(WCHAR * wbuf, int wlen, const char *msg, va_list * args)
{
char *cbuf;
UTF8 *ptr8;
UTF16 *ptr16;
int retVal;
size_t len, clen;
wbuf[0] = '\0';
/* Allocate a UTF-8 buffer and process the printf args */
clen = wlen * 3;
if (NULL == (cbuf = (char *) tsk_malloc(clen))) {
return 1;
}
#ifdef _MSC_VER
vsnprintf_s(cbuf, clen - 1, _TRUNCATE, msg, *args);
#else
vsnprintf(cbuf, clen - 1, msg, *args);
#endif
len = strlen(cbuf);
//Convert to UTF-16
ptr8 = (UTF8 *) cbuf;
ptr16 = (UTF16 *) wbuf;
retVal =
tsk_UTF8toUTF16((const UTF8 **) &ptr8, &ptr8[len + 1], &ptr16,
&ptr16[wlen], TSKlenientConversion);
if (retVal != TSKconversionOK) {
*ptr16 = '\0';
if (tsk_verbose)
tsk_fprintf(stderr,
"tsk_printf_conv: error converting string to UTF-16\n");
}
free(cbuf);
return 0;
}
#endif
/**
* \ingroup baselib
* fprintf wrapper function that takes UTF-8 strings as input
* (on all platforms) and does what is necessary to output
* strings in the correct encoding (UTF-8 on Unix and
* UTF-16 on Windows).
*
* @param fd File to print to
* @param msg printf message
*/
void
tsk_fprintf(FILE * fd, const char *msg, ...)
{
va_list args;
va_start(args, msg);
#ifdef TSK_WIN32
{
WCHAR wbuf[2048];
tsk_printf_conv(wbuf, 2048, msg, &args);
fwprintf(fd, _TSK_T("%ls"), wbuf);
}
#else
vfprintf(fd, msg, args);
#endif
va_end(args);
}
/**
* \ingroup baselib
* printf wrapper function that takes UTF-8 strings as input
* (on all platforms) and does what is necessary to output
* strings in the correct encoding (UTF-8 on Unix and
* UTF-16 on Windows).
*
* @param msg printf message
*/
void
tsk_printf(const char *msg, ...)
{
va_list args;
va_start(args, msg);
#ifdef TSK_WIN32
{
WCHAR wbuf[2048];
tsk_printf_conv(wbuf, 2048, msg, &args);
wprintf(_TSK_T("%ls"), wbuf);
}
#else
vprintf(msg, args);
#endif
va_end(args);
}
/**
* \ingroup baselib
* Prints the string removing control characters.
*
* @param fd File to print to
* @param str string to be printed
*
* @returns 0 on success and 1 on error
*/
int
tsk_print_sanitized(FILE * fd, const char *str)
{
size_t index = 0;
char *buf = NULL;
buf = tsk_malloc(strlen(str) + 1);
if (buf == NULL)
return 1;
strcpy(buf, str);
for (index = 0; index < strlen(buf); index++)
if (TSK_IS_CNTRL(buf[index]))
buf[index] = '^';
tsk_fprintf(fd, "%s", buf);
free(buf);
return 0;
}
|