456 lines
8 KiB
C
456 lines
8 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1997 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
strtabs.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Tests string table routines.
|
||
|
|
||
|
Author:
|
||
|
|
||
|
<full name> (<alias>) <date>
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
<alias> <date> <comments>
|
||
|
|
||
|
--*/
|
||
|
|
||
|
#include "pch.h"
|
||
|
|
||
|
#ifdef UNICODE
|
||
|
#pragma message ("You must use UNICODE version of setupapi.dll")
|
||
|
#else
|
||
|
#pragma message ("You must use ANSI version of setupapi.dll")
|
||
|
#endif
|
||
|
|
||
|
|
||
|
BOOL
|
||
|
WINAPI
|
||
|
MigUtil_Entry (
|
||
|
HINSTANCE hInstance,
|
||
|
DWORD dwReason,
|
||
|
LPVOID lpReserved
|
||
|
);
|
||
|
|
||
|
HANDLE g_hHeap;
|
||
|
HINSTANCE g_hInst;
|
||
|
|
||
|
|
||
|
VOID
|
||
|
pTest1 (
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
HASHTABLE Table;
|
||
|
TREE_ENUM e;
|
||
|
GROWBUFFER Buf = GROWBUF_INIT;
|
||
|
LONG rc;
|
||
|
PDWORD dptr;
|
||
|
DWORD Data;
|
||
|
HASHTABLE DupTable;
|
||
|
|
||
|
Table = HtAlloc();
|
||
|
|
||
|
_tprintf (TEXT("Testing full paths... "));
|
||
|
|
||
|
if (EnumFirstFileInTree (&e, TEXT("C:\\"), NULL, FALSE)) {
|
||
|
do {
|
||
|
rc = HtAddString (Table, e.FullPath);
|
||
|
|
||
|
GrowBufAppendDword (&Buf, (DWORD) rc);
|
||
|
MYASSERT (rc);
|
||
|
|
||
|
} while (EnumNextFileInTree (&e));
|
||
|
}
|
||
|
|
||
|
dptr = (PDWORD) Buf.Buf;
|
||
|
|
||
|
if (EnumFirstFileInTree (&e, TEXT("C:\\"), NULL, FALSE)) {
|
||
|
do {
|
||
|
rc = HtFindString (Table, e.FullPath);
|
||
|
|
||
|
MYASSERT (rc);
|
||
|
MYASSERT (*dptr == (DWORD) rc);
|
||
|
dptr++;
|
||
|
} while (EnumNextFileInTree (&e));
|
||
|
}
|
||
|
|
||
|
_tprintf (TEXT("Done\n"));
|
||
|
|
||
|
HtFree (Table);
|
||
|
|
||
|
|
||
|
_tprintf (TEXT("Testing extra data and collisions... "));
|
||
|
|
||
|
Table = HtAllocWithData (sizeof (DWORD));
|
||
|
|
||
|
DupTable = HtAlloc();
|
||
|
|
||
|
Buf.End = 0;
|
||
|
|
||
|
if (EnumFirstFileInTree (&e, TEXT("C:\\"), NULL, FALSE)) {
|
||
|
do {
|
||
|
if (HtFindString (Table, e.Name)) {
|
||
|
HtAddString (DupTable, e.Name);
|
||
|
}
|
||
|
|
||
|
rc = HtAddStringAndData (Table, e.Name, &e.FindData->nFileSizeLow);
|
||
|
|
||
|
GrowBufAppendDword (&Buf, (DWORD) rc);
|
||
|
MYASSERT (rc);
|
||
|
|
||
|
} while (EnumNextFileInTree (&e));
|
||
|
}
|
||
|
|
||
|
dptr = (PDWORD) Buf.Buf;
|
||
|
|
||
|
if (EnumFirstFileInTree (&e, TEXT("C:\\"), NULL, FALSE)) {
|
||
|
do {
|
||
|
rc = HtFindStringAndData (Table, e.Name, &Data);
|
||
|
|
||
|
MYASSERT (rc);
|
||
|
|
||
|
if (!HtFindString (DupTable, e.Name)) {
|
||
|
MYASSERT (*dptr == (DWORD) rc);
|
||
|
MYASSERT (Data == e.FindData->nFileSizeLow);
|
||
|
}
|
||
|
|
||
|
dptr++;
|
||
|
|
||
|
} while (EnumNextFileInTree (&e));
|
||
|
}
|
||
|
|
||
|
HtFree (DupTable);
|
||
|
HtFree (Table);
|
||
|
|
||
|
_tprintf (TEXT("Done\n"));
|
||
|
|
||
|
|
||
|
FreeGrowBuffer (&Buf);
|
||
|
}
|
||
|
|
||
|
|
||
|
VOID
|
||
|
pTest2 (
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
HASHTABLE Table;
|
||
|
TREE_ENUM e;
|
||
|
INT Count;
|
||
|
LONG rc;
|
||
|
HASHTABLE_ENUM e2;
|
||
|
WIN32_FIND_DATA fd;
|
||
|
|
||
|
_tprintf (TEXT("Testing enumeration... "));
|
||
|
|
||
|
Count = 0;
|
||
|
|
||
|
Table = HtAlloc();
|
||
|
|
||
|
if (EnumFirstFileInTree (&e, TEXT("C:\\"), NULL, FALSE)) {
|
||
|
do {
|
||
|
rc = HtAddString (Table, e.FullPath);
|
||
|
|
||
|
Count++;
|
||
|
MYASSERT (rc);
|
||
|
|
||
|
} while (EnumNextFileInTree (&e));
|
||
|
}
|
||
|
|
||
|
if (EnumFirstHashTableString (&e2, Table)) {
|
||
|
do {
|
||
|
MYASSERT (DoesFileExistEx (e2.String, &fd));
|
||
|
Count--;
|
||
|
} while (EnumNextHashTableString (&e2));
|
||
|
}
|
||
|
|
||
|
MYASSERT (Count == 0);
|
||
|
|
||
|
_tprintf (TEXT("Done\n"));
|
||
|
|
||
|
HtFree (Table);
|
||
|
}
|
||
|
|
||
|
|
||
|
VOID
|
||
|
pTest3 (
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
HASHTABLE Table;
|
||
|
LONG rc;
|
||
|
LONG rc2;
|
||
|
BOOL Pass = TRUE;
|
||
|
TCHAR String[6];
|
||
|
INT i;
|
||
|
UINT u = 0;
|
||
|
ZeroMemory (String, sizeof (String));
|
||
|
String[0] = 1;
|
||
|
|
||
|
_tprintf (TEXT("Testing every character combination..."));
|
||
|
|
||
|
while (String[4] == 0) {
|
||
|
if (Pass) {
|
||
|
u++;
|
||
|
|
||
|
if ((u % 10000) == 0) {
|
||
|
_tprintf (TEXT("."));
|
||
|
}
|
||
|
|
||
|
if (!u) {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
#if 0
|
||
|
Table = StringTableInitialize();
|
||
|
|
||
|
rc = StringTableAddString(
|
||
|
Table,
|
||
|
String,
|
||
|
STRTAB_CASE_INSENSITIVE
|
||
|
);
|
||
|
|
||
|
rc2 = StringTableLookUpString (Table, String, STRTAB_CASE_INSENSITIVE);
|
||
|
|
||
|
StringTableDestroy (Table);
|
||
|
#endif
|
||
|
|
||
|
Table = HtAlloc();
|
||
|
|
||
|
rc = HtAddString (Table, String);
|
||
|
|
||
|
rc2 = HtFindString (Table, String);
|
||
|
|
||
|
HtFree (Table);
|
||
|
|
||
|
if (!Pass) {
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (rc != rc2) {
|
||
|
Pass = FALSE;
|
||
|
|
||
|
//
|
||
|
// We go through this loop once more against the same string,
|
||
|
// to make debugging easy.
|
||
|
//
|
||
|
|
||
|
} else {
|
||
|
for (i = 0 ; i < 5 ; i++) {
|
||
|
String[i]++;
|
||
|
if (String[i] != 0) {
|
||
|
break;
|
||
|
}
|
||
|
String[i]++;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
_tprintf (TEXT("\n"));
|
||
|
|
||
|
if (!Pass) {
|
||
|
_tprintf (TEXT("Test Failed on test %u!\nString: ["), u, String);
|
||
|
|
||
|
for (i = 0 ; i < 5 ; i++) {
|
||
|
_tprintf (TEXT("%c"), String[i]);
|
||
|
}
|
||
|
|
||
|
_tprintf (TEXT("] "));
|
||
|
|
||
|
for (i = 0 ; i < 5 ; i++) {
|
||
|
#ifdef UNICODE
|
||
|
_tprintf (TEXT(" %04X"), (WORD) String[i]);
|
||
|
#else
|
||
|
_tprintf (TEXT(" %02X"), (BYTE) String[i]);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
_tprintf (TEXT("\n"));
|
||
|
|
||
|
} else {
|
||
|
_tprintf (TEXT("Test Passed!\n"));
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
PCTSTR
|
||
|
pStrToHex (
|
||
|
PTSTR Hex,
|
||
|
PCTSTR Str
|
||
|
)
|
||
|
{
|
||
|
PTSTR p;
|
||
|
PCTSTR q;
|
||
|
|
||
|
p = Hex;
|
||
|
|
||
|
for (q = Str ; *q ; q++) {
|
||
|
#ifdef UNICODE
|
||
|
p += wsprintf (p, TEXT("%04X "), (WORD) *q);
|
||
|
#else
|
||
|
p += wsprintf (p, TEXT("%02X "), (BYTE) *q);
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
*p++ = TEXT('\"');
|
||
|
for (q = Str ; *q ; q++) {
|
||
|
if (*q < 32 || *q > 255 || *q >= 127) {
|
||
|
*p++ = TEXT('.');
|
||
|
} else {
|
||
|
*p++ = *q;
|
||
|
}
|
||
|
}
|
||
|
*p++ = TEXT('\"');
|
||
|
|
||
|
*p = 0;
|
||
|
|
||
|
return Hex;
|
||
|
}
|
||
|
|
||
|
|
||
|
VOID
|
||
|
pTest4 (
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
TCHAR Str[2];
|
||
|
TCHAR Lower[5];
|
||
|
INT Result;
|
||
|
TCHAR Hex1[80];
|
||
|
TCHAR Hex2[80];
|
||
|
INT i;
|
||
|
INT j;
|
||
|
|
||
|
#ifdef UNICODE
|
||
|
printf ("Testing UNICODE\n\n");
|
||
|
#else
|
||
|
printf ("Testing DBCS\n\n");
|
||
|
#endif
|
||
|
|
||
|
ZeroMemory (Str, sizeof (Str));
|
||
|
Str[0] = 1;
|
||
|
|
||
|
j = (sizeof (Str) / sizeof (Str[0])) - 1;
|
||
|
|
||
|
for (;;) {
|
||
|
|
||
|
lstrcpy (Lower, Str);
|
||
|
CharLower (Lower);
|
||
|
|
||
|
Result = CompareString (
|
||
|
LOCALE_SYSTEM_DEFAULT,
|
||
|
NORM_IGNORECASE,
|
||
|
Str,
|
||
|
-1,
|
||
|
Lower,
|
||
|
-1
|
||
|
);
|
||
|
|
||
|
if (Result != CSTR_EQUAL) {
|
||
|
_tprintf (
|
||
|
TEXT("ERROR: %s does not match %s, Result=%i\n"),
|
||
|
pStrToHex (Hex1, Str),
|
||
|
pStrToHex (Hex2, Lower),
|
||
|
Result
|
||
|
);
|
||
|
|
||
|
} else {
|
||
|
|
||
|
Result = CompareString (
|
||
|
LOCALE_SYSTEM_DEFAULT,
|
||
|
NORM_IGNORECASE,
|
||
|
Lower,
|
||
|
-1,
|
||
|
Str,
|
||
|
-1
|
||
|
);
|
||
|
|
||
|
if (Result != CSTR_EQUAL) {
|
||
|
_tprintf (
|
||
|
TEXT("ERROR: %s does not match %s, Result=%i\n"),
|
||
|
pStrToHex (Hex1, Str),
|
||
|
pStrToHex (Hex2, Lower),
|
||
|
Result
|
||
|
);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
i = 0;
|
||
|
do {
|
||
|
Str[i]++;
|
||
|
|
||
|
if (Str[i] == 0) {
|
||
|
Str[i]++;
|
||
|
} else {
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
i++;
|
||
|
} while (i < j);
|
||
|
|
||
|
if (i == j) {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
VOID
|
||
|
pSimplePrimeOutput (
|
||
|
VOID
|
||
|
)
|
||
|
{
|
||
|
double dbl;
|
||
|
int i;
|
||
|
int j;
|
||
|
|
||
|
for (i = 1 ; i < 1200 ; i++) {
|
||
|
for (j = 2 ; j < i ; j++) {
|
||
|
dbl = (DOUBLE) i / (DOUBLE) j;
|
||
|
if ((DOUBLE) ((INT) dbl) == dbl) {
|
||
|
break; // not prime
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (j >= i) {
|
||
|
_tprintf (TEXT("Likely prime: %i\n"), i);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
INT
|
||
|
__cdecl
|
||
|
_tmain (
|
||
|
INT argc,
|
||
|
TCHAR *argv[]
|
||
|
)
|
||
|
{
|
||
|
g_hHeap = GetProcessHeap();
|
||
|
g_hInst = GetModuleHandle (NULL);
|
||
|
|
||
|
MigUtil_Entry (g_hInst, DLL_PROCESS_ATTACH, NULL);
|
||
|
|
||
|
//pSimplePrimeOutput();
|
||
|
|
||
|
//pTest1();
|
||
|
//pTest2();
|
||
|
//pTest3();
|
||
|
pTest4();
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|