windows-nt/Source/XPSP1/NT/base/ntsetup/win95upg/tools/strtabs/strtabs.c
2020-09-26 16:20:57 +08:00

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;
}