1 /************************************************************************
2 Project               : C++ debugging class
3 File version          : 0.4
4 
5 BSD License post 1999 :
6 
7 Copyright (c) 2001, Steve Lhomme
8 All rights reserved.
9 
10 Redistribution and use in source and binary forms, with or without
11 modification, are permitted provided that the following conditions are met:
12 
13 - Redistributions of source code must retain the above copyright notice, this
14 list of conditions and the following disclaimer.
15 
16 - Redistributions in binary form must reproduce the above copyright notice,
17 this list of conditions and the following disclaimer in the documentation
18 and/or other materials provided with the distribution.
19 
20 - The name of the author may not be used to endorse or promote products derived
21 from this software without specific prior written permission.
22 
23 THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED
24 WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
25 MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
26 EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
27 EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
28 OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
29 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
30 CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
31 IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
32 OF SUCH DAMAGE.
33 ************************************************************************/
34 
35 #include <stdio.h>
36 #include <stdarg.h>
37 #include <windows.h>
38 
39 #include "ADbg.h"
40 
41 #if !defined(NDEBUG)
42 
43 //////////////////////////////////////////////////////////////////////
44 // Construction/Destruction
45 //////////////////////////////////////////////////////////////////////
46 
ADbg(int level)47 ADbg::ADbg(int level)
48 :my_level(level)
49 ,my_time_included(false)
50 ,my_use_file(false)
51 ,my_debug_output(true)
52 ,hFile(NULL)
53 {
54 	prefix[0] = '\0';
55 	OutPut(-1,"ADbg Creation at debug level = %d (0x%08X)",my_level,this);
56 }
57 
~ADbg()58 ADbg::~ADbg()
59 {
60 	unsetDebugFile();
61 	OutPut(-1,"ADbg Deletion (0x%08X)",this);
62 }
63 
_OutPut(const char * format,va_list params) const64 inline int ADbg::_OutPut(const char * format,va_list params) const
65 {
66 	int result;
67 
68 	char tst[1000];
69 	char myformat[256];
70 
71 	if (my_time_included) {
72 		SYSTEMTIME time;
73 		GetSystemTime(&time);
74 		if (prefix[0] == '\0')
75 			wsprintf(myformat,"%04d/%02d/%02d %02d:%02d:%02d.%03d UTC : %s\r\n",
76 							time.wYear,
77 							time.wMonth,
78 							time.wDay,
79 							time.wHour,
80 							time.wMinute,
81 							time.wSecond,
82 							time.wMilliseconds,
83 							format);
84 		else
85 			wsprintf(myformat,"%04d/%02d/%02d %02d:%02d:%02d.%03d UTC : %s - %s\r\n",
86 							time.wYear,
87 							time.wMonth,
88 							time.wDay,
89 							time.wHour,
90 							time.wMinute,
91 							time.wSecond,
92 							time.wMilliseconds,
93 							prefix,
94 							format);
95 	} else {
96 		if (prefix[0] == '\0')
97 			wsprintf( myformat, "%s\r\n", format);
98 		else
99 			wsprintf( myformat, "%s - %s\r\n", prefix, format);
100 	}
101 
102 	result = vsprintf(tst,myformat,params);
103 
104 	if (my_debug_output)
105 		OutputDebugString(tst);
106 
107 	if (my_use_file && (hFile != NULL)) {
108 		SetFilePointer( hFile, 0, 0, FILE_END );
109 		DWORD written;
110 		WriteFile( hFile, tst, lstrlen(tst), &written, NULL );
111 	}
112 
113 	return result;
114 }
115 
OutPut(int forLevel,const char * format,...) const116 int ADbg::OutPut(int forLevel, const char * format,...) const
117 {
118 	int result=0;
119 
120 	if (forLevel >= my_level) {
121 		va_list tstlist;
122 		int result;
123 
124 		va_start(tstlist, format);
125 
126 		result = _OutPut(format,tstlist);
127 
128 	}
129 
130 	return result;
131 }
132 
OutPut(const char * format,...) const133 int ADbg::OutPut(const char * format,...) const
134 {
135 	va_list tstlist;
136 
137 	va_start(tstlist, format);
138 
139 	return _OutPut(format,tstlist);
140 }
141 
setDebugFile(const char * NewFilename)142 bool ADbg::setDebugFile(const char * NewFilename) {
143 	bool result;
144 	result = unsetDebugFile();
145 
146 	if (result) {
147 		result = false;
148 
149 		hFile = CreateFile(NewFilename, GENERIC_WRITE, FILE_SHARE_WRITE|FILE_SHARE_READ, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL );
150 
151 		if (hFile != INVALID_HANDLE_VALUE) {
152 			SetFilePointer( hFile, 0, 0, FILE_END );
153 
154 			result = true;
155 
156 			OutPut(-1,"Debug file Opening succeeded");
157 
158 		}
159 		else
160 			OutPut(-1,"Debug file %s Opening failed",NewFilename);
161 	}
162 
163 	return result;
164 }
165 
unsetDebugFile()166 bool ADbg::unsetDebugFile() {
167 	bool result = (hFile == NULL);
168 
169 	if (hFile != NULL) {
170 		result = (CloseHandle(hFile) != 0);
171 
172 		if (result) {
173 			OutPut(-1,"Debug file Closing succeeded");
174 			hFile = NULL;
175 		}
176 	}
177 
178 	return result;
179 }
180 
181 #endif // !defined(NDEBUG)
182