windows-nt/Source/XPSP1/NT/ds/adsi/utils/fbstr.cxx
2020-09-26 16:20:57 +08:00

367 lines
8.1 KiB
C++

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1993.
//
// File: fbstr.cxx
//
// Contents: Wrappers around BSTR api to account for wierdness with NULL
//
// Functions: ADsAllocString
// ADsAllocStringLen
// ADsReAllocString
// ADsReAllocStringLen
// ADsFreeString
// ADsStringLen
// ADsStringByteLen
// ADsAllocStringByteLen
// ADsStringCmp
// ADsStringNCmp
// ADsStringICmp
// ADsStringNICmp
//
// History: 25-Oct-94 krishnag
//
//
//----------------------------------------------------------------------------
#include "procs.hxx"
//+---------------------------------------------------------------------------
//
// Function: ADsAllocString
//
// Synopsis: Allocs a BSTR and initializes it from a string. If the
// initializer is NULL or the empty string, the resulting bstr is
// NULL.
//
// Arguments: [pch] -- String to initialize BSTR.
// [pBSTR] -- The result.
//
// Returns: HRESULT.
//
// Modifies: [pBSTR]
//
// History: 5-06-94 adams Created
//
//----------------------------------------------------------------------------
STDAPI
ADsAllocString(const OLECHAR * pch, BSTR * pBSTR)
{
HRESULT hr = S_OK;
ADsAssert(pBSTR);
if (!pch)
{
*pBSTR = NULL;
return S_OK;
}
*pBSTR = SysAllocString(pch);
hr = (*pBSTR) ? S_OK : E_OUTOFMEMORY;
RRETURN(hr);
}
//+---------------------------------------------------------------------------
//
// Function: ADsAllocStringLen
//
// Synopsis: Allocs a BSTR of [uc] + 1 OLECHARS, and
// initializes it from an optional string. If [uc] == 0, the
// resulting bstr is NULL.
//
// Arguments: [pch] -- String to initialize.
// [uc] -- Count of characters of string.
// [pBSTR] -- The result.
//
// Returns: HRESULT.
//
// Modifies: [pBSTR].
//
// History: 5-06-94 adams Created
//
//----------------------------------------------------------------------------
STDAPI
ADsAllocStringLen(const OLECHAR * pch, UINT uc, BSTR * pBSTR)
{
HRESULT hr = S_OK;
ADsAssert(pBSTR);
if (!pch){
*pBSTR = NULL;
return S_OK;
}
*pBSTR = SysAllocStringLen(pch, uc);
hr = *pBSTR ? S_OK : E_OUTOFMEMORY;
RRETURN(hr);
}
//+---------------------------------------------------------------------------
//
// Function: ADsReAllocString
//
// Synopsis: Allocates a BSTR initialized from a string; if successful,
// frees the original string and replaces it.
//
// Arguments: [pBSTR] -- String to reallocate.
// [pch] -- Initializer.
//
// Returns: HRESULT.
//
// Modifies: [pBSTR].
//
// History: 5-06-94 adams Created
//
//----------------------------------------------------------------------------
STDAPI
ADsReAllocString(BSTR * pBSTR, const OLECHAR * pch)
{
ADsAssert(pBSTR);
#if DBG == 1
HRESULT hr;
BSTR bstrTmp;
hr = ADsAllocString(pch, &bstrTmp);
if (hr)
RRETURN(hr);
ADsFreeString(*pBSTR);
*pBSTR = bstrTmp;
return S_OK;
#else
if (!pch){
SysFreeString(*pBSTR);
*pBSTR = NULL;
return S_OK;
}
return SysReAllocString(pBSTR, pch) ? S_OK : E_OUTOFMEMORY;
#endif
}
//+---------------------------------------------------------------------------
//
// Function: ADsReAllocStringLen
//
// Synopsis: Allocates a BSTR of [uc] + 1 OLECHARs and optionally
// initializes it from a string; if successful, frees the original
// string and replaces it.
//
// Arguments: [pBSTR] -- String to reallocate.
// [pch] -- Initializer.
// [uc] -- Count of characters.
//
// Returns: HRESULT.
//
// Modifies: [pBSTR].
//
// History: 5-06-94 adams Created
//
//----------------------------------------------------------------------------
STDAPI
ADsReAllocStringLen(BSTR * pBSTR, const OLECHAR * pch, UINT uc)
{
ADsAssert(pBSTR);
#if DBG == 1
HRESULT hr;
BSTR bstrTmp;
hr = ADsAllocStringLen(pch, uc, &bstrTmp);
if (hr)
RRETURN(hr);
ADsFreeString(*pBSTR);
*pBSTR = bstrTmp;
return S_OK;
#else
if (!pch){
SysFreeString(*pBSTR);
*pBSTR = NULL;
return S_OK;
}
return SysReAllocStringLen(pBSTR, pch, uc) ? S_OK : E_OUTOFMEMORY;
#endif
}
//+---------------------------------------------------------------------------
//
// Function: ADsStringLen
//
// Synopsis: Returns the length of the BSTR.
//
// History: 5-06-94 adams Created
//
//----------------------------------------------------------------------------
STDAPI_(UINT)
ADsStringLen(BSTR bstr)
{
return bstr ? SysStringLen(bstr) : 0;
}
#ifdef WIN32
//+---------------------------------------------------------------------------
//
// Function: ADsStringByteLen
//
// Synopsis: Returns the length of a BSTR in bytes.
//
// History: 5-06-94 adams Created
//
//----------------------------------------------------------------------------
STDAPI_(UINT)
ADsStringByteLen(BSTR bstr)
{
return bstr ? SysStringByteLen(bstr) : 0;
}
//+---------------------------------------------------------------------------
//
// Function: ADsAllocStringByteLen
//
// Synopsis: Allocates a BSTR of [uc] + 1 chars and optionally initializes
// from a string. If [uc] = 0, the resulting bstr is NULL.
//
// Arguments: [pch] -- Initializer.
// [uc] -- Count of chars.
// [pBSTR] -- Result.
//
// Returns: HRESULT.
//
// Modifies: [pBSTR].
//
// History: 5-06-94 adams Created
//
//----------------------------------------------------------------------------
STDAPI
ADsAllocStringByteLen(const char * pch, UINT uc, BSTR * pBSTR)
{
HRESULT hr = S_OK;
ADsAssert(pBSTR);
if (!pch){
*pBSTR = NULL;
return S_OK;
}
*pBSTR = SysAllocStringByteLen(pch, uc);
RRETURN(hr);
}
#endif
//+---------------------------------------------------------------------------
//
// Function: ADsStringCmp
//
// Synopsis: As per wcscmp, checking for NULL bstrs.
//
// History: 5-06-94 adams Created
// 25-Jun-94 doncl changed from _tc to wc
//
//----------------------------------------------------------------------------
STDAPI_(int)
ADsStringCmp(CBSTR bstr1, CBSTR bstr2)
{
return wcscmp(STRVAL(bstr1), STRVAL(bstr2));
}
//+---------------------------------------------------------------------------
//
// Function: ADsStringNCmp
//
// Synopsis: As per wcsncmp, checking for NULL bstrs.
//
// History: 5-06-94 adams Created
// 25-Jun-94 doncl changed from _tc to wc
//
//----------------------------------------------------------------------------
STDAPI_(int)
ADsStringNCmp(CBSTR bstr1, CBSTR bstr2, size_t c)
{
return wcsncmp(STRVAL(bstr1), STRVAL(bstr2), c);
}
//+---------------------------------------------------------------------------
//
// Function: ADsStringICmp
//
// Synopsis: As per wcsicmp, checking for NULL bstrs.
//
// History: 5-06-94 adams Created
// 25-Jun-94 doncl changed from _tc to wc
// 15-Aug-94 doncl changed from wcsicmp to _wcsicmp
//
//----------------------------------------------------------------------------
STDAPI_(int)
ADsStringICmp(CBSTR bstr1, CBSTR bstr2)
{
return _wcsicmp(STRVAL(bstr1), STRVAL(bstr2));
}
//+---------------------------------------------------------------------------
//
// Function: ADsStringNICmp
//
// Synopsis: As per wcsnicmp, checking for NULL bstrs.
//
// History: 5-06-94 adams Created
// 25-Jun-94 doncl changed from _tc to wc
// 15-Aug-94 doncl changed from wcsnicmp to _wcsnicmp
//
//----------------------------------------------------------------------------
STDAPI_(int)
ADsStringNICmp(CBSTR bstr1, CBSTR bstr2, size_t c)
{
return _wcsnicmp(STRVAL(bstr1), STRVAL(bstr2), c);
}