Leaked source code of windows server 2003
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

//+----------------------------------------------------------------------------
//
// 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