Leaked source code of windows server 2003
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.
 
 
 
 
 
 

350 lines
6.0 KiB

/*++
Copyright (c) 1990-1991 Microsoft Corporation
Module Name:
htdebug.c
Abstract:
This module contains the debug functions
Author:
23-Apr-1992 Thu 20:01:55 updated -by- Daniel Chou (danielc)
changed 'CHAR' type to 'BYTE' type, this will make sure if compiled
under MIPS the default 'unsigned char' will not affect the signed
operation on the single 8 bits
28-Mar-1992 Sat 20:53:29 updated -by- Daniel Chou (danielc)
Modify sprintf for by not using va_start
20-Feb-1991 Wed 23:06:09 created -by- Daniel Chou (danielc)
[Environment:]
Printer Driver.
[Notes:]
Revision History:
--*/
#if DBG
#include <htp.h>
#include <string.h>
#include <time.h>
#include "htdebug.h"
#include "stdio.h"
UINT DbgTimerIdx = TIMER_LAST;
DBGTIMER DbgTimer[TIMER_MAX_IDX + 1];
LPBYTE
HTENTRY
HT_LOADDS
FD6ToString(
LONG Num,
SHORT IntDigits,
WORD FracDigits
)
{
#define DBG_ONE_FD6_STR_SIZE 13
#define DBG_FD6_STR_MAX 20
#define DBG_FD6_STR_SIZE (DBG_ONE_FD6_STR_SIZE * DBG_FD6_STR_MAX)
#define DBG_FD6_LAST_STR_IDX (DBG_ONE_FD6_STR_SIZE * (DBG_FD6_STR_MAX-1))
static WORD Rounding[] = { 50000, 5000, 500, 50, 5 };
static WORD DbgFD6StringIndex = 0;
static BYTE DbgFD6Strings[DBG_FD6_STR_SIZE + 2];
LPBYTE pFD6Str;
LPBYTE pb;
DWORD Number;
INT Loop;
BOOL Sign;
#ifdef UMODE
DWORD dw = GET_TICK;
#endif
//
// Check before using it
//
if ((DbgFD6StringIndex += DBG_ONE_FD6_STR_SIZE) > DBG_FD6_LAST_STR_IDX) {
DbgFD6StringIndex = 0; // Reset
}
pFD6Str = &DbgFD6Strings[DbgFD6StringIndex];
if (Sign = (BOOL)(Num < 0)) {
Number = (DWORD)-Num;
} else {
Number = (DWORD)Num;
}
if (FracDigits) {
if (FracDigits < 6) {
Num += (LONG)Rounding[FracDigits];
} else {
FracDigits = 6;
}
}
sprintf(pFD6Str, "%5u.%06ld", (UINT)(Number / 1000000L), Number % 1000000L);
if (!FracDigits) {
pb = pFD6Str + 11;
Loop = (INT)5;
FracDigits = 6;
while ((Loop--) && (*pb-- == (BYTE)'0')) {
--FracDigits;
}
}
*(pFD6Str + 6 + FracDigits) = (BYTE)0;
pFD6Str += 4;
if (IntDigits > 5) {
IntDigits = 5;
}
while (*pFD6Str != (BYTE)' ') {
--IntDigits;
--pFD6Str;
}
if (Sign) {
--IntDigits;
*pFD6Str = '-';
} else {
++pFD6Str;
}
#ifdef UMODE
dw = GET_TICK - dw;
DbgTimer[DbgTimerIdx].Last += dw;
DbgTimer[TIMER_TOT].Last += dw;
#endif
return((LPBYTE)((IntDigits > 0) ? pFD6Str - IntDigits : pFD6Str));
#undef DBG_ONE_FD6_STR_SIZE
#undef DBG_FD6_STR_MAX
#undef DBG_FD6_STR_SIZE
#undef DBG_FD6_LAST_STR_IDX
}
VOID
cdecl
HTENTRY
HT_LOADDS
DbgPrintf(
LPSTR pStr,
...
)
{
va_list vaList;
BYTE Buf[256];
#ifdef UMODE
DWORD dw = GET_TICK;
#endif
va_start(vaList, pStr);
vsprintf(Buf, pStr, vaList);
va_end(vaList);
#ifdef DBG_INSERT_CR_TO_LF
{
LPBYTE pBufCurrent;
LPBYTE pBufNext;
pBufCurrent = (LPBYTE)Buf;
while (pBufCurrent) {
if (pBufNext = (LPBYTE)strchr(pBufCurrent, 0x0a)) {
*pBufNext++ = 0x00;
DEBUGOUTPUTFUNC(pBufCurrent);
DEBUGOUTPUTFUNC("\r\n");
} else {
DEBUGOUTPUTFUNC(pBufCurrent);
}
pBufCurrent = pBufNext;
}
DEBUGOUTPUTFUNC("\r\n");
}
#else // DBG_INSERT_CR_TO_LF
DEBUGOUTPUTFUNC(Buf);
#endif // DBG_INSERT_CR_TO_LF
#ifdef UMODE
dw = GET_TICK - dw;
DbgTimer[DbgTimerIdx].Last += dw;
DbgTimer[TIMER_TOT].Last += dw;
#endif
}
VOID
HTENTRY
HT_LOADDS
_MyAssert(
LPSTR pMsg,
LPSTR pFalseExp,
LPSTR pFilename,
WORD LineNo
)
{
#ifdef UMODE
DWORD dw = GET_TICK;
#endif
DbgPrintf("\n* Assertion Failed: %s", pMsg);
DbgPrintf("* False Expression: %s", pFalseExp);
DbgPrintf("* Failed Filename: %s", pFilename);
DbgPrintf("* Failed Line Number: %u\n\n", LineNo);
DBGSTOP();
#ifdef UMODE
dw = GET_TICK - dw;
DbgTimer[DbgTimerIdx].Last += dw;
DbgTimer[TIMER_TOT].Last += dw;
#endif
}
LPSTR
HTENTRY
HT_LOADDS
DbgTimeString(
UINT Idx
)
{
#define DBG_ONE_TIME_STR_SIZE 12
#define DBG_TIME_STR_MAX (TIMER_MAX_IDX + 1)
#define DBG_TIME_STR_SIZE (DBG_ONE_TIME_STR_SIZE * DBG_TIME_STR_MAX)
#define DBG_TIME_LAST_STR_IDX (DBG_ONE_TIME_STR_SIZE * (DBG_TIME_STR_MAX-1))
static WORD DbgTimeStringIndex = 0;
static BYTE DbgTimeStrings[DBG_TIME_STR_SIZE + 2];
LPSTR pTimeStr;
DWORD Time;
UINT Second;
if ((DbgTimeStringIndex += DBG_ONE_TIME_STR_SIZE) > DBG_TIME_LAST_STR_IDX) {
DbgTimeStringIndex = 0; // Reset
}
pTimeStr = &DbgTimeStrings[DbgTimeStringIndex];
if ((Time = DbgTimer[Idx].Tot) >= 1000L) {
Second = (UINT)(Time / 1000L);
Time %= 1000L;
} else {
Second = 0;
}
sprintf(pTimeStr, "%2u.%03u", Second, Time);
return(pTimeStr);
#undef DBG_ONE_TIME_STR_SIZE
#undef DBG_TIME_STR_MAX
#undef DBG_TIME_STR_SIZE
#undef DBG_TIME_LAST_STR_IDX
}
#if defined(_OS2_) || defined(_OS_20_)
VOID
HTENTRY
DebugBreak(
VOID
)
{
_asm
{
int 3h
}
}
#endif // _OS2_
#ifndef UMODE
void DrvDbgPrint(
char * pch,
...)
{
va_list ap;
va_start(ap, pch);
EngDebugPrint("",pch,ap);
va_end(ap);
}
#endif
#endif // DBG != 0