/*++ Copyright (c) 1997 Microsoft Corporation Module Name: strtabs.c Abstract: Tests string table routines. Author: () Revision History: --*/ #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; }