NT4/private/oleauto/tests/disptest/misc.cpp
2020-09-30 17:12:29 +02:00

272 lines
4.7 KiB
C++

/***
*misc.cpp
*
* Copyright (C) 1992, Microsoft Corporation. All Rights Reserved.
* Information Contained Herein Is Proprietary and Confidential.
*
*Purpose:
* Misc DispTest helpers and initialization functions.
*
*Revision History:
*
* [00] 02-Oct-92 bradlo: Created
*
*Implementation Notes:
*
*****************************************************************************/
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#include "disptest.h"
#include "dballoc.h"
ASSERTDATA
extern int g_fDetectLeaks;
#if OE_WIN32
extern CRITICAL_SECTION g_csDbPrintf;
#endif // OE_WIN32
int g_fLog = TRUE;
OLECHAR FAR* g_szCPoly = OLESTR("spoly.cpoly");
OLECHAR FAR* g_szCSArray = OLESTR("sdisptst.csarray");
OLECHAR FAR* g_szCDispTst = OLESTR("sdisptst.cdisptst");
OLECHAR FAR* g_szCExcepinfo = OLESTR("sdisptst.cexcepinfo");
OLECHAR FAR* g_szCWExcepinfo = OLESTR("sdisptst.cwexcepinfo");
#if OE_WIN32
unsigned long g_itlsAppData = ~(ULONG)0;
#else // !OE_WIN32
APP_DATA g_appdata;
#endif // !OE_WIN32
APP_DATA *Pappdata()
{
#if OE_WIN32
return (APP_DATA *)TlsGetValue(g_itlsAppData);
#else // !OE_WIN32
return &g_appdata;
#endif // !OE_WIN32
}
BOOL InitAppData()
{
#if OE_WIN32
APP_DATA *pappdata;
if (g_itlsAppData == ~(ULONG)0) {
if ((g_itlsAppData = TlsAlloc()) == ~(ULONG)0) {
return FALSE;
}
}
ASSERT(TlsGetValue(g_itlsAppData) == NULL);
pappdata = new APP_DATA;
if (pappdata == NULL) {
return FALSE;
}
TlsSetValue(g_itlsAppData, (LPVOID)pappdata);
#endif // OE_WIN32
return TRUE;
}
VOID ReleaseAppData()
{
#if OE_WIN32
ASSERT(g_itlsAppData != ~(ULONG)0);
delete Pappdata();
TlsSetValue(g_itlsAppData, NULL);
#endif // OE_WIN32
}
STDAPI
InitOle()
{
HRESULT hresult;
IMalloc FAR* pmalloc;
pmalloc = NULL;
#if OE_MAC
#if 0
OSErr oserr = LoadAllLibraries();
if(oserr != noErr){
hresult = ResultFromScode(E_FAIL);
goto LError0;
}
#endif
#else
#if !OE_WIN32 // latest OLE complains about our allocs not being
// properly aligned (it wants 8-byte alignment even
// on x86). New OLE debug allocator is pretty good
// now, so we'll just use theirs.
unsigned long options = DBALLOC_NONE;
if(g_fDetectLeaks)
options |= DBALLOC_DETECTLEAKS;
IfFailGo(CreateDbAlloc(options, NULL, &pmalloc), LError0);
#endif //!OE_WIN32
#endif
hresult = OleInitialize(pmalloc);
#if !OE_WIN32
LError0:;
#endif // !OE_WIN32
if(pmalloc != NULL)
pmalloc->Release();
return hresult;
}
STDAPI_(void)
UninitOle()
{
OleUninitialize();
}
void
PrintSuiteHeader(TCHAR FAR* szFmt, ...)
{
int i, len;
va_list args;
TCHAR rgch[256];
va_start(args, szFmt);
#if OE_MAC
vsprintf(rgch, szFmt, args);
#else
wvsprintf(rgch, szFmt, args);
#endif
DbPrintf("\n\nSuite : ");
DbPrintf((char FAR*)rgch);
DbPrintf("\n");
len = STRLEN(rgch) + 8;
for(i = 0; i < len+8; ++i)
rgch[i] = TSTR('-');
rgch[i] = TSTR('\n');
rgch[i+1] = TSTR('\0');
DbPrintf((char FAR*) rgch);
}
void
PrintTestHeader(TCHAR FAR* szFmt, ...)
{
va_list args;
TCHAR rgch[256];
va_start(args, szFmt);
#if OE_MAC
vsprintf(rgch, szFmt, args);
#else
wvsprintf(rgch, szFmt, args);
#endif
DbPrintf("Test : ");
DbPrintf((char FAR*)rgch);
DbPrintf("\n");
}
#if OE_MAC
STDAPI_(void) OutputDebugString(const OLECHAR*);
#endif
extern "C" void
DbPrintf(char FAR* szFmt, ...)
{
int len;
va_list args;
char *pn, FAR* pf;
static char rgchFmtBuf[512];
static char rgchOutputBuf[1024];
#if OE_WIN32
EnterCriticalSection(&g_csDbPrintf);
#endif // OE_WIN32
#if HC_MPW
// translate all instances of %Fs to %s
for(pf=szFmt, pn=rgchFmtBuf; *pf != '\0';){
if(pf[0] == '%' && pf[1] == 'F' && pf[2] == 's'){
pn[0] = '%';
pn[1] = 's';
pf += 3;
pn += 2;
}else{
*pn++ = *pf++;
}
}
*pn = '\0';
pn = rgchFmtBuf;
#else
# if OE_WIN16
// copy the 'far' format string to a near buffer so we can use
// the medium model vsprintf, which only supports near data pointers.
pn = rgchFmtBuf, pf=szFmt;
while(*pf != '\0')
*pn++ = *pf++;
*pn = '\0';
pn = rgchFmtBuf;
# else
pn = szFmt;
# endif
#endif
va_start(args, szFmt);
vsprintf(rgchOutputBuf, pn, args);
len = strlen(rgchOutputBuf);
ASSERT(len < DIM(rgchOutputBuf));
#if OE_WIN32
OutputDebugStringA(rgchOutputBuf);
#else
OutputDebugString(rgchOutputBuf);
#endif
if(Pappdata()->m_hfLogfile != HFILE_ERROR){
#if OE_MAC
fprintf(Pappdata()->m_hfLogfile, rgchOutputBuf);
#else
_lwrite(Pappdata()->m_hfLogfile, rgchOutputBuf, len);
#endif
}
#if OE_WIN32
LeaveCriticalSection(&g_csDbPrintf);
#endif // OE_WIN32
}