You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
3.2 KiB
107 lines
3.2 KiB
//+----------------------------------------------------------------------------
|
|
//
|
|
// File: CompareString.cpp
|
|
//
|
|
// Module: as required
|
|
//
|
|
// Synopsis: Using lstrcmpi to do a case-insensitive comparison of two strings
|
|
// can have unexpected result on certain locales if one of the strings
|
|
// is a constant. The 2 functions here are the preferred replacements.
|
|
//
|
|
// Note that these functions are also present in CMUTIL.dll. However,
|
|
// a dependency on cmutil is a Bad Thing (TM) for modules that do not
|
|
// sim-ship with it (this includes customactions and CMAK).
|
|
//
|
|
// Copyright (c) 1998-2002 Microsoft Corporation
|
|
//
|
|
// Author: SumitC Created 12-Sep-2001
|
|
//
|
|
//+----------------------------------------------------------------------------
|
|
|
|
#include "windows.h"
|
|
#include "CompareString.h"
|
|
|
|
//
|
|
// The following is to ensure that we don't try to use U functions (i.e. CMutoa
|
|
// functions) in a module that doesn't support it.
|
|
//
|
|
#ifndef _CMUTIL_STRINGS_CPP_
|
|
#ifndef CompareStringU
|
|
#ifdef UNICODE
|
|
#define CompareStringU CompareStringW
|
|
#else
|
|
#define CompareStringU CompareStringA
|
|
#endif
|
|
#endif
|
|
#endif
|
|
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function: SafeCompareStringA
|
|
//
|
|
// Synopsis: implementation of lstrcmpi that is sensitive to locale variations
|
|
//
|
|
// Arguments: LPCTSTR lpString1, lpString2 - strings to compare
|
|
//
|
|
// Returns: int (-1, 0 or +1). In case of error, -1 is returned.
|
|
//
|
|
//+----------------------------------------------------------------------------
|
|
int SafeCompareStringA(LPCSTR lpString1, LPCSTR lpString2)
|
|
{
|
|
int iReturn = -1;
|
|
|
|
DWORD lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT);
|
|
iReturn = CompareStringA(lcid, NORM_IGNORECASE, lpString1, -1, lpString2, -1);
|
|
|
|
if (iReturn == 0)
|
|
{
|
|
iReturn = -1;
|
|
}
|
|
else
|
|
{
|
|
iReturn -= CSTR_EQUAL; // to make the return values -1 or 0 or 1
|
|
}
|
|
|
|
return iReturn;
|
|
}
|
|
|
|
#if defined(UNICODE) || defined(_CMUTIL_STRINGS_CPP_)
|
|
|
|
//+----------------------------------------------------------------------------
|
|
//
|
|
// Function: SafeCompareStringW
|
|
//
|
|
// Synopsis: implementation of lstrcmpi that is sensitive to locale variations
|
|
//
|
|
// Arguments: LPCTSTR lpString1, lpString2 - strings to compare
|
|
//
|
|
// Returns: int (-1, 0 or +1). In case of error, -1 is returned.
|
|
//
|
|
//+----------------------------------------------------------------------------
|
|
int SafeCompareStringW(LPCWSTR lpString1, LPCWSTR lpString2)
|
|
{
|
|
int iReturn = -1;
|
|
|
|
if (OS_NT51)
|
|
{
|
|
iReturn = CompareStringU(LOCALE_INVARIANT, NORM_IGNORECASE, lpString1, -1, lpString2, -1);
|
|
}
|
|
else
|
|
{
|
|
DWORD lcid = MAKELCID(MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), SORT_DEFAULT);
|
|
iReturn = CompareStringU(lcid, NORM_IGNORECASE, lpString1, -1, lpString2, -1);
|
|
}
|
|
|
|
if (iReturn == 0)
|
|
{
|
|
iReturn = -1;
|
|
}
|
|
else
|
|
{
|
|
iReturn -= CSTR_EQUAL; // to make the return values -1 or 0 or 1
|
|
}
|
|
|
|
return iReturn;
|
|
}
|
|
#endif // UNICODE
|