mirror of https://github.com/tongzx/nt5src
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.
291 lines
7.2 KiB
291 lines
7.2 KiB
//+-------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
//
|
|
// Copyright (C) Microsoft Corporation, 1998 - 1999
|
|
//
|
|
// File: tfschar.c
|
|
//
|
|
//--------------------------------------------------------------------------
|
|
|
|
|
|
#include "precomp.h"
|
|
|
|
#include <malloc.h>
|
|
|
|
/*!--------------------------------------------------------------------------
|
|
StrCpyAFromW
|
|
-
|
|
Author: KennT
|
|
---------------------------------------------------------------------------*/
|
|
TFSCORE_API(LPSTR) StrCpyAFromW(LPSTR psz, LPCWSTR pswz)
|
|
{
|
|
USES_CONVERSION;
|
|
return StrCpyA(psz, W2CA(pswz));
|
|
}
|
|
|
|
/*!--------------------------------------------------------------------------
|
|
StrCpyWFromA
|
|
-
|
|
Author: KennT
|
|
---------------------------------------------------------------------------*/
|
|
TFSCORE_API(LPWSTR) StrCpyWFromA(LPWSTR pswz, LPCSTR psz)
|
|
{
|
|
USES_CONVERSION;
|
|
return StrCpyW(pswz, A2CW(psz));
|
|
}
|
|
|
|
/*!--------------------------------------------------------------------------
|
|
StrnCpyAFromW
|
|
-
|
|
Author: KennT
|
|
---------------------------------------------------------------------------*/
|
|
TFSCORE_API(LPSTR) StrnCpyAFromW(LPSTR psz, LPCWSTR pswz, int iMax)
|
|
{
|
|
USES_CONVERSION;
|
|
return StrnCpyA(psz, W2CA(pswz), iMax);
|
|
}
|
|
|
|
/*!--------------------------------------------------------------------------
|
|
StrnCpyWFromA
|
|
-
|
|
Author: KennT
|
|
---------------------------------------------------------------------------*/
|
|
TFSCORE_API(LPWSTR) StrnCpyWFromA(LPWSTR pswz, LPCSTR psz, int iMax)
|
|
{
|
|
USES_CONVERSION;
|
|
return StrnCpyW(pswz, A2CW(psz), iMax);
|
|
}
|
|
|
|
/*!--------------------------------------------------------------------------
|
|
StrDupA
|
|
-
|
|
Author: KennT
|
|
---------------------------------------------------------------------------*/
|
|
TFSCORE_API(LPSTR) StrDupA( LPCSTR psz )
|
|
{
|
|
if (psz)
|
|
{
|
|
// Multiply by 2 to account for DBCS strings
|
|
LPSTR pszcpy = Malloc(sizeof(char)*CbStrLenA(psz)*2);
|
|
if (pszcpy)
|
|
return StrCpyA(pszcpy, psz);
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
/*!--------------------------------------------------------------------------
|
|
StrDupW
|
|
-
|
|
Author: KennT
|
|
---------------------------------------------------------------------------*/
|
|
TFSCORE_API(LPWSTR) StrDupW( LPCWSTR pswz )
|
|
{
|
|
if (pswz)
|
|
{
|
|
LPWSTR pswzcpy = Malloc(sizeof(WCHAR)*CbStrLenW(pswz));
|
|
if (pswzcpy)
|
|
return StrCpyW(pswzcpy, pswz);
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
|
|
/*!--------------------------------------------------------------------------
|
|
StrDupAFromW
|
|
-
|
|
Author: KennT
|
|
---------------------------------------------------------------------------*/
|
|
TFSCORE_API(LPSTR) StrDupAFromW( LPCWSTR pwsz )
|
|
{
|
|
USES_CONVERSION;
|
|
return StrDupA( W2CA(pwsz) );
|
|
}
|
|
|
|
/*!--------------------------------------------------------------------------
|
|
StrDupWFromA
|
|
-
|
|
Author: KennT
|
|
---------------------------------------------------------------------------*/
|
|
TFSCORE_API(LPWSTR) StrDupWFromA( LPCSTR psz )
|
|
{
|
|
USES_CONVERSION;
|
|
return StrDupW( A2CW(psz) );
|
|
}
|
|
|
|
|
|
|
|
/*!--------------------------------------------------------------------------
|
|
StrnCmpA
|
|
-
|
|
Author: KennT
|
|
---------------------------------------------------------------------------*/
|
|
TFSCORE_API(int) StrnCmpA(LPCSTR psz1, LPCSTR psz2, int nLen)
|
|
{
|
|
USES_CONVERSION;
|
|
// It's easier to convert it to a wide string than do the
|
|
// conversion. (it's a pain having to deal with DBCS characters).
|
|
return StrnCmpW(A2CW(psz1), A2CW(psz2), nLen);
|
|
}
|
|
|
|
|
|
/*!--------------------------------------------------------------------------
|
|
StrnCmpW
|
|
-
|
|
Author: KennT
|
|
---------------------------------------------------------------------------*/
|
|
TFSCORE_API(int) StrnCmpW(LPCWSTR pswz1, LPCWSTR pswz2, int nLen)
|
|
{
|
|
WCHAR *pswz1Temp = AllocaStrDupW(pswz1); // These memory allocs get memory on the stack, so we do not need to free them
|
|
WCHAR *pswz2Temp = AllocaStrDupW(pswz2);
|
|
|
|
|
|
// The next three if statements could be replaced with: if( !pswz1Temp || !pswz2Temp) return StrCmpW(pswz1Temp, pswz2Temp);
|
|
// since lstrcmp can handle NULL parameters. But if we do this prefix gets mad.
|
|
//
|
|
if( pswz1Temp == NULL && pswz2Temp == NULL )
|
|
{
|
|
// They are equal both NULL
|
|
//
|
|
return 0;
|
|
}
|
|
|
|
if( pswz1Temp == NULL)
|
|
{
|
|
// The first one is NULL thus the second string is greater
|
|
//
|
|
return -1;
|
|
}
|
|
|
|
if( pswz2Temp == NULL )
|
|
{
|
|
// The second one is NULL thus the first one is bigger
|
|
//
|
|
return 1;
|
|
}
|
|
|
|
if (pswz1Temp != NULL && StrLenW(pswz1Temp) > nLen)
|
|
pswz1Temp[nLen] = 0;
|
|
if (pswz2Temp != NULL && StrLenW(pswz2Temp) > nLen)
|
|
pswz2Temp[nLen] = 0;
|
|
|
|
|
|
return StrCmpW(pswz1Temp, pswz2Temp);
|
|
}
|
|
|
|
|
|
/*!--------------------------------------------------------------------------
|
|
StrniCmpA
|
|
-
|
|
Author: KennT
|
|
---------------------------------------------------------------------------*/
|
|
TFSCORE_API(int) StrniCmpA(LPCSTR psz1, LPCSTR psz2, int nLen)
|
|
{
|
|
CHAR *psz1Temp = AllocaStrDupA(psz1);
|
|
CHAR *psz2Temp = AllocaStrDupA(psz2);
|
|
|
|
CharUpperBuffA(psz1Temp, StrLenA(psz1Temp));
|
|
CharUpperBuffA(psz2Temp, StrLenA(psz2Temp));
|
|
|
|
return StrnCmpA(psz1Temp, psz2Temp, nLen);
|
|
}
|
|
|
|
|
|
/*!--------------------------------------------------------------------------
|
|
StrniCmpW
|
|
-
|
|
Author: KennT
|
|
---------------------------------------------------------------------------*/
|
|
TFSCORE_API(int) StrniCmpW(LPCWSTR pswz1, LPCWSTR pswz2, int nLen)
|
|
{
|
|
WCHAR *pswz1Temp = AllocaStrDupW(pswz1);
|
|
WCHAR *pswz2Temp = AllocaStrDupW(pswz2);
|
|
|
|
CharUpperBuffW(pswz1Temp, StrLenW(pswz1Temp));
|
|
CharUpperBuffW(pswz2Temp, StrLenW(pswz2Temp));
|
|
|
|
return StrnCmpW(pswz1Temp, pswz2Temp, nLen);
|
|
}
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Global UNICODE<>ANSI translation helpers
|
|
|
|
LPWSTR WINAPI AtlA2WHelper(LPWSTR lpw, LPCSTR lpa, int nChars)
|
|
{
|
|
assert(lpa != NULL);
|
|
assert(lpw != NULL);
|
|
// verify that no illegal character present
|
|
// since lpw was allocated based on the size of lpa
|
|
// don't worry about the number of chars
|
|
lpw[0] = '\0';
|
|
MultiByteToWideChar(CP_ACP, 0, lpa, -1, lpw, nChars);
|
|
return lpw;
|
|
}
|
|
|
|
LPSTR WINAPI AtlW2AHelper(LPSTR lpa, LPCWSTR lpw, int nChars)
|
|
{
|
|
assert(lpw != NULL);
|
|
assert(lpa != NULL);
|
|
// verify that no illegal character present
|
|
// since lpa was allocated based on the size of lpw
|
|
// don't worry about the number of chars
|
|
lpa[0] = '\0';
|
|
WideCharToMultiByte(CP_ACP, 0, lpw, -1, lpa, nChars, NULL, NULL);
|
|
return lpa;
|
|
}
|
|
|
|
LPTSTR LoadAndAllocString(UINT ids)
|
|
{
|
|
TCHAR * psz = NULL;
|
|
TCHAR * pszT = NULL;
|
|
INT cch = 0;
|
|
int iRet;
|
|
|
|
cch = 64;
|
|
psz = Malloc(64*sizeof(TCHAR));
|
|
if (psz == NULL)
|
|
return NULL;
|
|
|
|
iRet = LoadString(NULL, ids, psz, cch);
|
|
|
|
if (iRet == 0)
|
|
{
|
|
// couldn't find the string
|
|
Free(psz);
|
|
return NULL;
|
|
}
|
|
|
|
while (iRet >= (cch - 1))
|
|
{
|
|
cch += 64;
|
|
pszT = Realloc(psz, (cch*sizeof(TCHAR)));
|
|
if (pszT == NULL)
|
|
{
|
|
Free(psz);
|
|
return NULL;
|
|
}
|
|
psz = pszT;
|
|
|
|
iRet = LoadString(NULL, ids, psz, cch);
|
|
}
|
|
|
|
return psz;
|
|
}
|
|
|
|
LPTSTR GetSafeString(LPTSTR psz)
|
|
{
|
|
static LPTSTR s_szEmpty = _T("");
|
|
return psz ? psz : s_szEmpty;
|
|
}
|
|
|
|
LPWSTR GetSafeStringW(LPWSTR pwsz)
|
|
{
|
|
static LPWSTR s_wszEmpty = L"";
|
|
return pwsz ? pwsz : s_wszEmpty;
|
|
}
|
|
|
|
LPSTR GetSafeStringA(LPSTR pasz)
|
|
{
|
|
static LPSTR s_aszEmpty = "";
|
|
return pasz ? pasz : s_aszEmpty;
|
|
}
|