|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996 - 1997.
//
// File: utils.cxx
//
// Contents: general purpose utility functions
//
// Classes:
//
// Functions:
//
// Coupling:
//
// Notes: right now only operator<< for different types
// must init crit sec for rand on your own
//
// History: 9-11-1996 benl Created
//
//----------------------------------------------------------------------------
#include "pch.hxx"
#include <stdio.h>
#include <limits.h>
#include <stdlib.h>
#include "mydebug.hxx"
#include "utils.hxx"
#include "randpeak.hxx"
static CRITICAL_SECTION gcsRand; static BOOLEAN gfInit;
//+---------------------------------------------------------------------------
//
// Function: PrintGuid
//
// Synopsis:
//
// Arguments: [file] --
// [guid] --
//
// Returns:
//
// History: 1-27-1997 benl Created
//
// Notes:
//
//----------------------------------------------------------------------------
void PrintGuid(FILE * file, const GUID & guid) { INT iIndex;
fprintf(file, "%08x-%04hx-%04hx-", guid.Data1, guid.Data2, guid.Data3); for (iIndex=0;iIndex < 8; iIndex++) { fprintf(file,"%01x", guid.Data4[iIndex]); } } //PrintGuid
//+---------------------------------------------------------------------------
//
// Function: MyRand
//
// Synopsis: simple rand function
//
// Arguments: [dwLimit] --
//
// Returns: values btwn 0 and dwLimit inclusively
//
// History: 10-23-1996 benl Created
//
// Notes:
//
//----------------------------------------------------------------------------
INT MyRand(INT iLimit) { return RandomInRange(0, iLimit); } //MyRand
//+---------------------------------------------------------------------------
//
// Function: MyRand64
//
// Synopsis: like above but for 64 bit integers
//
// Arguments: [llLimit] --
//
// Returns:
//
// History: 2-12-1997 benl Created
//
// Notes: This works poorly - need a true 64bit random number generator
//
//----------------------------------------------------------------------------
LONGLONG MyRand64(LONGLONG llLimit) { LARGE_INTEGER liTemp;
liTemp.LowPart = Random32(); liTemp.HighPart = Random32();
return liTemp.QuadPart % llLimit; } //MyRand64
//+---------------------------------------------------------------------------
//
// Function: MyRand16
//
// Synopsis: like above but for 16 bit integers
//
// Arguments: [sLimit] --
//
// Returns:
//
// History: 5-15-1997 benl Created
//
// Notes:
//
//----------------------------------------------------------------------------
SHORT MyRand16(SHORT sLimit) { return (SHORT) RandomInRange(0, sLimit); } // MyRand16
//+---------------------------------------------------------------------------
//
// Function: MySRand
//
// Synopsis: srand for threads
//
// Arguments: [dwBase] --
//
// Returns:
//
// History: 10-30-1996 benl Created
//
// Notes:
//
//----------------------------------------------------------------------------
VOID MySRand(DWORD & dwBase) { if (!gfInit) { InitializeCriticalSection(&gcsRand); gfInit = TRUE; }
EnterCriticalSection(&gcsRand); dwBase++; SeedRandom32(dwBase); LeaveCriticalSection(&gcsRand); } //MySRand
//+---------------------------------------------------------------------------
//
// Function: SwapBuffers
//
// Synopsis: Swap two differently sized buffers such that
// the info is split correctly between them
// i.e if one is 40 bytes and the second 60 bytes
// after its done the first one contains 40 bytes from the orig 2nd buffer
// and the 2nd one contains the following orig 20 bytes of the 2nd buffer and
// then the orig 40. bytes of the first buffer
//
// Arguments: [cbBuf1] -- len of pBuffer1
// [pBuffer1] -- buffer1
// [cbBuf2] -- len of pBuffer2
// [pBuffer2] -- buffer2
//
// Returns:
//
// History: 9-29-1997 benl Created
//
// Notes:
//
//----------------------------------------------------------------------------
void SwapBuffers(INT cbBuf1, BYTE * pBuffer1, INT cbBuf2, BYTE * pBuffer2) { BYTE * pTemp = new BYTE[cbBuf1]; INT iFirst; INT iSecond; INT iThird;
memcpy(pTemp, pBuffer1, cbBuf1);
iFirst = min(cbBuf1, cbBuf2); memcpy(pBuffer1, pBuffer2, iFirst); if (iFirst < cbBuf1) { memcpy(pBuffer1 + iFirst, pTemp, cbBuf1 - iFirst); iSecond = 0; iThird = cbBuf1 + iFirst; } else { memcpy(pBuffer2, pBuffer1 + iFirst, cbBuf2 - iFirst); iSecond = cbBuf2 - iFirst; iThird = 0; } memcpy(pBuffer2 + iSecond, pTemp + iThird, cbBuf2 - iSecond);
if (pTemp) { delete[] pTemp; } } // SwapBuffers
//+---------------------------------------------------------------------------
//
// Function: PrintByte
//
// Synopsis:
//
// Arguments: [byte] --
//
// Returns:
//
// History: 11-14-1996 benl Created
//
// Notes:
//
//----------------------------------------------------------------------------
void PrintByte(BYTE byte) { printf("%02hx", byte);
} //PrintByte
//+---------------------------------------------------------------------------
//
// Function: PrintWord
//
// Synopsis:
//
// Arguments: [bytes] --
//
// Returns:
//
// History: 11-14-1996 benl Created
//
// Notes:
//
//----------------------------------------------------------------------------
void PrintWord(LPBYTE bytes) { PrintByte(bytes[0]); printf(" "); PrintByte(bytes[1]); } //PrintWord
//+---------------------------------------------------------------------------
//
// Function: PrintDWord
//
// Synopsis:
//
// Arguments: [bytes] --
//
// Returns:
//
// History: 11-14-1996 benl Created
//
// Notes:
//
//----------------------------------------------------------------------------
void PrintDWord(LPBYTE bytes) { PrintWord(bytes); printf(" "); PrintWord(bytes + 2); } //PrintDWord
//+---------------------------------------------------------------------------
//
// Function: DumpRawBytes
//
// Synopsis: Helper output function
//
// Arguments: [pBytes] --
// [cBytes] --
//
// Returns:
//
// History: 11-14-1996 benl Created
//
// Notes:
//
//----------------------------------------------------------------------------
void DumpRawBytes(BYTE * pBytes, UINT cBytes) { UINT iIndex; UINT iIndex2;
if (0 == cBytes) { printf("Empty Buffer\n"); }
/*
if (cBytes < 16) { printf("%04x ",iIndex * 16); for(iIndex=0; iIndex < cBytes; iIndex++) { PrintByte(*(pBytes + iIndex)); printf(" "); } } */
for (iIndex=0;iIndex < cBytes / 16; iIndex++) { printf("%04x ",iIndex * 16); PrintDWord(pBytes + (iIndex * 16)); printf(" "); PrintDWord(pBytes + (iIndex * 16 + 4)); printf(" "); PrintDWord(pBytes + (iIndex * 16 + 8)); printf(" "); PrintDWord(pBytes + (iIndex * 16 + 12));
printf(" ");
for (iIndex2=0;iIndex2 < 16; iIndex2++) { if (isgraph(pBytes[(iIndex*16) + iIndex2])) { printf("%c", pBytes[(iIndex*16) + iIndex2]); } else { printf("."); }
}
printf("\n"); }
//print trailing bytes
printf("%04x ", ((cBytes / 16) * 16));
for (iIndex=0; iIndex < 16; iIndex++) { if (iIndex < cBytes % 16) { PrintByte(*(pBytes + ((cBytes / 16) * 16) + iIndex)); printf(" "); } else { printf(" "); } //add byte separator if necc.
if (iIndex && (iIndex % 7 == 0)) { printf(" "); }
}
for (iIndex2=0; iIndex2 < cBytes % 16; iIndex2++) { if (isgraph(*(pBytes + ((cBytes / 16) * 16) + iIndex2))) { printf("%c", *(pBytes + ((cBytes / 16) * 16) + iIndex2)); } else { printf("."); } }
printf("\n"); } //DumpRawBytes
//+---------------------------------------------------------------------------
//
// Function: DumpRawDwords
//
// Synopsis:
//
// Arguments: [pDwords] --
// [cBytes] --
//
// Returns:
//
// History: 8-25-1998 benl Created
//
// Notes:
//
//----------------------------------------------------------------------------
void DumpRawDwords(DWORD * pDwords, UINT cBytes) { UINT iIndex; UINT iIndex2; BYTE * pBytes;
if (0 == cBytes) { printf("Empty Buffer\n"); }
for (iIndex=0; iIndex < cBytes / 16; iIndex++) { printf("%04x ",iIndex * 16);
printf("%08x ", pDwords[iIndex * 4]); printf("%08x ", pDwords[iIndex * 4 + 1]); printf("%08x ", pDwords[iIndex * 4 + 2]); printf("%08x ", pDwords[iIndex * 4 + 3]);
printf(" ");
pBytes = (BYTE *) (pDwords + (iIndex * 4)); for (iIndex2=0; iIndex2 < 16; iIndex2++) { if (isgraph(pBytes[iIndex2])) { printf("%c", pBytes[iIndex2]); } else { printf("."); } }
printf("\n"); }
//print trailing dwords
printf("%04x ", ((cBytes / 16) * 16));
for (iIndex=0; iIndex < 4; iIndex++) { if (iIndex * 4 < cBytes % 16) { printf("%08x", pDwords[((cBytes / 16) * 4) +iIndex]); printf(" "); } else { printf(" "); } }
printf(" ");
pBytes = (BYTE *) (pDwords + ((cBytes / 16) * 4)); for (iIndex2=0; iIndex2 < cBytes % 16; iIndex2++) { if (isgraph(*(pBytes + iIndex2))) { printf("%c", *(pBytes + iIndex2)); } else { printf("."); } }
printf("\n"); } // DumpRawDwords
//+---------------------------------------------------------------------------
//
// Function: HexStrToInt64
//
// Synopsis:
//
// Arguments: [szIn] --
// [i64Out] --
//
// Returns:
//
// History: 5-30-96 benl Created
//
// Notes:
//
//----------------------------------------------------------------------------
void HexStrToInt64(LPCTSTR szIn, __int64 & i64Out) { int i; const TCHAR * szTmp = szIn;
i64Out = 0;
/*
if (szTmp[0] != '0' && szTmp[1] != 'x') { return; } //move past prefix
szTmp+=2; */ while (*szTmp != _T('\0') && (_istdigit(*szTmp) || (_totlower(*szTmp) >= 'a' && _totlower(*szTmp) <= 'f'))) { i64Out *= 16; if (_istdigit(*szTmp)) { i64Out += *szTmp - _T('0'); } else { i64Out += _totlower(*szTmp) - _T('a') + 10; } szTmp++; } //endwhile
} //HexStrToInt64
|