273 lines
5 KiB
C++
273 lines
5 KiB
C++
|
//-----------------------------------------------------------------------------
|
||
|
// File: cfguitrace.cpp
|
||
|
//
|
||
|
// Desc: Contains all trace functionalities used by the UI.
|
||
|
// Define __CFGUI_TRACE__TO_FILE to have output written to a file.
|
||
|
// Define __CFGUI_TRACE__TO_DEBUG_OUT to direct output to a debugger.
|
||
|
// These two symbols can coexist, and are defined in defines.h.
|
||
|
//
|
||
|
// Copyright (C) 1999-2000 Microsoft Corporation. All Rights Reserved.
|
||
|
//-----------------------------------------------------------------------------
|
||
|
|
||
|
#include "common.hpp"
|
||
|
|
||
|
|
||
|
#ifndef NTRACE
|
||
|
|
||
|
|
||
|
const int mindepth = 0;
|
||
|
static int depth = mindepth;
|
||
|
|
||
|
static int filedepth = 0;
|
||
|
static FILE *file = NULL;
|
||
|
|
||
|
__cfgui_out_filescope::__cfgui_out_filescope(bool bInternal)
|
||
|
: m_bInternal(bInternal)
|
||
|
{
|
||
|
#ifdef __CFGUI_TRACE__TO_FILE
|
||
|
|
||
|
static bool bFirst = true;
|
||
|
|
||
|
filedepth++;
|
||
|
|
||
|
if (filedepth == 1)
|
||
|
{
|
||
|
|
||
|
assert(file == NULL);
|
||
|
if (file == NULL)
|
||
|
file = fopen("c:\\cfguilog.txt", bFirst ? "w+t" : "a+t");
|
||
|
|
||
|
assert(file != NULL);
|
||
|
if (file != NULL)
|
||
|
{
|
||
|
if (bFirst)
|
||
|
{
|
||
|
time_t curtime;
|
||
|
time(&curtime);
|
||
|
LPSTR str = _strdup(ctime(&curtime));
|
||
|
if (str != NULL)
|
||
|
{
|
||
|
LPSTR last = str + strlen(str) - 1;
|
||
|
if (last >= str && *last == '\n')
|
||
|
*last = 0;
|
||
|
}
|
||
|
fprintf(file,
|
||
|
"\n"
|
||
|
"\n"
|
||
|
"\n"
|
||
|
"--------------------------------------------------------------------------------\n"
|
||
|
"DInput Mapper Device Configuration UI\n"
|
||
|
"New logfile session started at %s.\n"
|
||
|
"--------------------------------------------------------------------------------\n"
|
||
|
"\n"
|
||
|
, str);
|
||
|
free(str);
|
||
|
|
||
|
}
|
||
|
bFirst = false;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
__cfgui_out_filescope::~__cfgui_out_filescope()
|
||
|
{
|
||
|
#ifdef __CFGUI_TRACE__TO_FILE
|
||
|
|
||
|
assert(filedepth > 0);
|
||
|
|
||
|
if (filedepth < 0)
|
||
|
filedepth = 0;
|
||
|
|
||
|
if (filedepth > 0)
|
||
|
{
|
||
|
filedepth--;
|
||
|
|
||
|
assert(file != NULL);
|
||
|
if (file != NULL)
|
||
|
{
|
||
|
if (filedepth == 0)
|
||
|
{
|
||
|
fclose(file);
|
||
|
file = NULL;
|
||
|
}
|
||
|
else if (!m_bInternal)
|
||
|
fflush(file);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
static void __cfgui_out(LPCTSTR str)
|
||
|
{
|
||
|
#ifdef __CFGUI_TRACE__TO_FILE
|
||
|
|
||
|
assert(file != NULL);
|
||
|
if (file != NULL)
|
||
|
_ftprintf(file, str);
|
||
|
|
||
|
#endif
|
||
|
|
||
|
#ifdef __CFGUI_TRACE__TO_DEBUG_OUT
|
||
|
|
||
|
OutputDebugString(str);
|
||
|
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
__cfgui_tracescope::__cfgui_tracescope(LPCTSTR str)
|
||
|
{
|
||
|
if (str != NULL)
|
||
|
trace(str);
|
||
|
depth++;
|
||
|
}
|
||
|
|
||
|
__cfgui_tracescope::~__cfgui_tracescope()
|
||
|
{
|
||
|
depth--;
|
||
|
}
|
||
|
|
||
|
LPTSTR splitlines(LPTSTR);
|
||
|
|
||
|
/*void test(LPTSTR str)
|
||
|
{
|
||
|
LPTSTR orig = _tcsdup(str), str2 = _tcsdup(str);
|
||
|
static TCHAR buf[1024];
|
||
|
int i = 1;
|
||
|
for (LPTSTR token = splitlines(str2);
|
||
|
token != NULL;
|
||
|
token = splitlines(NULL), i++)
|
||
|
{
|
||
|
LPTSTR t = _tcsdup(token);
|
||
|
int len = _tcslen(t);
|
||
|
BOOL b = t[len - 1] == _T("\n")[0];
|
||
|
if (b)
|
||
|
t[len - 1] = _T("\0")[0];
|
||
|
_stprintf(buf, _T("%02d: \"%s\" (%s)\n"), i, t, BOOLSTR(b));
|
||
|
__cfgui_out(buf);
|
||
|
free(t);
|
||
|
}
|
||
|
free(str2);
|
||
|
free(orig);
|
||
|
}
|
||
|
*/
|
||
|
|
||
|
void __cfgui_trace(__cfgui_tracetype t, LPCTSTR format, ...)
|
||
|
{
|
||
|
__cfgui_out_filescope fs(true);
|
||
|
int i;
|
||
|
|
||
|
bool bError = t == __cfgui_tracetype_ERROR;
|
||
|
|
||
|
LPCTSTR errorprefix = _T("ERROR! ");
|
||
|
const int prefixlen = 8, depthbuflen = 1024, buflen = 4096;
|
||
|
static TCHAR prefixbuf[prefixlen + depthbuflen + 1] = _T("cfgUI: "), buf[buflen];
|
||
|
static LPTSTR depthbuf = prefixbuf + prefixlen;
|
||
|
static TCHAR space = _T(" ")[0];
|
||
|
static TCHAR zero = _T("\0")[0];
|
||
|
static TCHAR endl = _T("\n")[0];
|
||
|
static int last = -2;
|
||
|
static bool bendl = true;
|
||
|
|
||
|
if (last == -2)
|
||
|
{
|
||
|
for (i = 0; i < depthbuflen; i++)
|
||
|
depthbuf[i] = space;
|
||
|
depthbuf[i] = zero;
|
||
|
last = -1;
|
||
|
/*
|
||
|
test(_T("aopiwfoiefef\n\nwpoeifef\naefoie\n\n\nwpoeifwef asefeiof"));
|
||
|
test(_T("\npw\noiefpow ij e f owpiejf\n\n"));
|
||
|
test(_T("\n\npw\noiefpo wije\n\n \n\n\nfowpie jf \n"));
|
||
|
*/ }
|
||
|
|
||
|
if (last != -1)
|
||
|
{
|
||
|
depthbuf[last] = space;
|
||
|
}
|
||
|
|
||
|
int d = depth;
|
||
|
if (d < mindepth)
|
||
|
d = mindepth;
|
||
|
|
||
|
last = d * 4;
|
||
|
if (last >= depthbuflen)
|
||
|
last = depthbuflen - 1;
|
||
|
|
||
|
depthbuf[last] = zero;
|
||
|
|
||
|
va_list args;
|
||
|
va_start(args, format);
|
||
|
#ifdef WIN95
|
||
|
{
|
||
|
char *psz = NULL;
|
||
|
char szDfs[1024]={0};
|
||
|
strcpy(szDfs,format); // make a local copy of format string
|
||
|
while (psz = strstr(szDfs,"%p")) // find each %p
|
||
|
*(psz+1) = 'x'; // replace each %p with %x
|
||
|
_vstprintf(buf, szDfs, args); // use the local format string
|
||
|
}
|
||
|
#else
|
||
|
{
|
||
|
_vstprintf(buf, format, args);
|
||
|
}
|
||
|
#endif
|
||
|
va_end(args);
|
||
|
|
||
|
LPTSTR tempbuf = _tcsdup(buf);
|
||
|
|
||
|
bool doprefix = bendl;
|
||
|
for (LPTSTR token = splitlines(tempbuf);
|
||
|
token != NULL;
|
||
|
token = splitlines(NULL))
|
||
|
{
|
||
|
if (doprefix)
|
||
|
__cfgui_out(depthbuf/*prefixbuf*/);
|
||
|
if (bError && doprefix)
|
||
|
__cfgui_out(errorprefix);
|
||
|
__cfgui_out(token);
|
||
|
bendl = token[_tcslen(token) - 1] == endl;
|
||
|
doprefix = bendl;
|
||
|
}
|
||
|
|
||
|
free(tempbuf);
|
||
|
}
|
||
|
|
||
|
LPTSTR splitlines(LPTSTR split)
|
||
|
{
|
||
|
static LPTSTR str = NULL;
|
||
|
static int last = 0;
|
||
|
static TCHAR save = _T("!")[0];
|
||
|
static TCHAR newline = _T("\n")[0], zero = _T("\0")[0];
|
||
|
|
||
|
if (split != NULL)
|
||
|
str = split;
|
||
|
else
|
||
|
{
|
||
|
if (str == NULL)
|
||
|
return NULL;
|
||
|
|
||
|
str[last] = save;
|
||
|
str += last;
|
||
|
}
|
||
|
|
||
|
if (str[0] == zero)
|
||
|
{
|
||
|
str = NULL;
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
LPCTSTR at = str, f = _tcschr(at, newline);
|
||
|
last = f ? f - at + 1: _tcslen(at);
|
||
|
|
||
|
save = str[last];
|
||
|
str[last] = zero;
|
||
|
|
||
|
return str;
|
||
|
}
|
||
|
|
||
|
|
||
|
#endif
|