351 lines
6.0 KiB
C
351 lines
6.0 KiB
C
/*++
|
||
|
||
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
|