Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

272 lines
5.0 KiB

//-----------------------------------------------------------------------------
// 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