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