|
|
//============================================================================
// Copyright (C) Microsoft Corporation, 1997- 1999
//
// File: tfschar.h
//
// String functions that are used in general for TFS code.
//
// History:
//
// 05/28/97 Kenn Takara Created.
//
// Declarations for some common code/macros.
//============================================================================
#ifndef _TFSCHAR_H
#define _TFSCHAR_H
#if _MSC_VER >= 1000 // VC 5.0 or later
#pragma once
#endif
#define TFSCORE_API(x) x
//$ Win95: kennt, the list of Unicode-enabled functions on Win95 will
// have to be checked. Does lstrlenW work, but lstrcpyW doesn't? (that's
// what the ATL versions of the functions imply).
/*---------------------------------------------------------------------------
String copy functions ---------------------------------------------------------------------------*/
// Baisc conversion functions
TFSCORE_API(LPSTR) StrCpyAFromW(LPSTR psz, LPCWSTR pswz); TFSCORE_API(LPWSTR) StrCpyWFromA(LPWSTR pswz, LPCSTR psz);
TFSCORE_API(LPSTR) StrnCpyAFromW(LPSTR psz, LPCWSTR pswz, int iMax); TFSCORE_API(LPWSTR) StrnCpyWFromA(LPWSTR pswz, LPCSTR psz, int iMax);
#define StrCpy lstrcpy
#define StrnCpy lstrcpyn
#define StrCpyW lstrcpyW
#define StrCpyA lstrcpyA
#define StrnCpyW lstrcpynW
#define StrnCpyA lstrcpynA
#define StrCpyOle StrCpyW
#define StrnCpyOle StrnCpyW
#ifdef _UNICODE
#define StrCpyAFromT StrCpyAFromW
#define StrCpyTFromA StrCpyWFromA
#define StrCpyTFromW lstrcpy
#define StrCpyWFromT lstrcpy
#define StrnCpyAFromT StrnCpyAFromW
#define StrnCpyTFromA StrnCpyWFromA
#define StrnCpyTFromW lstrcpyn
#define StrnCpyWFromT lstrcpyn
#else
#define StrCpyAFromT lstrcpy
#define StrCpyTFromA lstrcpy
#define StrCpyTFromW StrCpyAFromW
#define StrCpyWFromT StrCpyWFromA
#define StrnCpyAFromT lstrcpyn
#define StrnCpyTFromA lstrcpyn
#define StrnCpyTFromW StrnCpyAFromW
#define StrnCpyWFromT StrnCpyWFromA
#endif
#define StrCpyOleFromT StrCpyWFromT
#define StrCpyTFromOle StrCpyTFromW
#define StrCpyOleFromA StrCpyWFromA
#define StrCpyAFromOle StrCpyAFromW
#define StrCpyWFromOle StrCpyW
#define StrCpyOleFromW StrCpyW
#define StrnCpyOleFromT StrnCpyWFromT
#define StrnCpyTFromOle StrnCpyTFromW
#define StrnCpyOleFromA StrnCpyWFromA
#define StrnCpyAFromOle StrnCpyAFromW
#define StrnCpyOleFromW StrnCpyW
#define StrnCpyWFromOle StrnCpyW
/*---------------------------------------------------------------------------
String length functions ---------------------------------------------------------------------------*/
#define StrLen lstrlen
#define StrLenA lstrlenA
#define StrLenW lstrlenW
#define StrLenOle StrLenW
//
// CbStrLenA() is inaccurate for DBCS strings! It will return the
// incorrect number of bytes needed.
//
#define CbStrLenA(psz) ((StrLenA(psz)+1)*sizeof(char))
#define CbStrLenW(psz) ((StrLenW(psz)+1)*sizeof(WCHAR))
#ifdef _UNICODE
#define CbStrLen(psz) CbStrLenW(psz)
#else
#define CbStrLen(psz) CbStrLenA(psz)
#endif
// Given a number of characters, this it the minimal number of TCHARs
// that needs to be allocated to hold the string
#define MinTCharNeededForCch(ch) ((ch) * (2/sizeof(TCHAR)))
#define MinCbNeededForCch(ch) (sizeof(TCHAR)*MinTCharNeededForCch(ch))
// Given a cb (count of bytes) this is the maximal number of characters
// that can be in this string
#define MaxCchFromCb(cb) ((cb) / sizeof(TCHAR))
#ifdef _UNICODE
// Given a cb, this is the minimum number of chars found in this string
// MinCchFromCb
#define MinCchFromCb(cb) ((cb) / sizeof(WCHAR))
#else
// Number of characters is only half due to DBCS
#define MinCchFromCb(cb) ((cb) / (2*sizeof(char)))
#endif
/*---------------------------------------------------------------------------
String dup functions
The returned string from these functions must be freed using delete! ---------------------------------------------------------------------------*/ TFSCORE_API(LPSTR) StrDupA( LPCSTR psz ); TFSCORE_API(LPWSTR) StrDupW( LPCWSTR pws );
TFSCORE_API(LPSTR) StrDupAFromW( LPCWSTR pwsz ); TFSCORE_API(LPWSTR) StrDupWFromA( LPCSTR psz );
#ifdef _UNICODE
#define StrDup StrDupW
#define StrDupTFromW StrDupW
#define StrDupWFromT StrDupW
#define StrDupTFromA StrDupWFromA
#define StrDupAFromT StrDupAFromW
#define StrDupOleFromA StrDupWFromA
#define StrDupAFromOle StrDupAFromW
#define StrDupOleFromW StrDupW
#define StrDupWFromOle StrDupW
#define StrDupOleFromT StrDupOleFromW
#define StrDupTFromOle StrDupWFromOle
#else
#define StrDup StrDupA
#define StrDupTFromA StrDupA
#define StrDupAFromT StrDupA
#define StrDupTFromW StrDupAFromW
#define StrDupWFromT StrDupWFromA
#define StrDupOleFromA StrDupWFromA
#define StrDupAFromOle StrDupAFromW
#define StrDupOleFromW StrDupW
#define StrDupWFromOle StrDupW
#define StrDupOleFromT StrDupOleFromA
#define StrDupTFromOle StrDupAFromOle
#endif
// AllocaStrDup
// AllocaStrDupA
// AllocaStrDupW
//
// These functions will dup a string on the STACK.
//
#define AllocaStrDupA(lpa) (\
((LPCSTR)lpa == NULL) ? NULL : (\ StrCpyA((LPSTR) alloca(CbStrLenA(lpa)*2), lpa)))
#define AllocaStrDupW(lpw) (\
((LPCWSTR)lpw == NULL) ? NULL : (\ StrCpyW((LPWSTR) alloca(CbStrLenW(lpw)), lpw)))
#ifdef _UNICODE
#define AllocaStrDup AllocaStrDupW
#else
#define AllocaStrDup AllocaStrDupA
#endif
/*---------------------------------------------------------------------------
String comparison functions ---------------------------------------------------------------------------*/ #define StrCmpA lstrcmpA
#define StrCmpW lstrcmpW
#define StrCmpOle StrCmpW
TFSCORE_API(int) StrnCmpA(LPCSTR psz1, LPCSTR psz2, int nLen); TFSCORE_API(int) StrnCmpW(LPCWSTR pswz1, LPCWSTR pswz2, int nLen);
#define StriCmpA lstrcmpiA
#define StriCmpW lstrcmpiW
#define StriCmpOle StriCmpW
TFSCORE_API(int) StrniCmpA(LPCSTR psz1, LPCSTR psz2, int nLen); TFSCORE_API(int) StrniCmpW(LPCWSTR pswz1, LPCWSTR pswz2, int nLen);
#ifdef _UNICODE
#define StrCmp StrCmpW
#define StrnCmp StrnCmpW
#define StriCmp StriCmpW
#define StrniCmp StrniCmpW
#else
#define StrCmp StrCmpA
#define StrnCmp StrnCmpA
#define StriCmp StriCmpA
#define StrniCmp StrniCmpA
#endif
/*---------------------------------------------------------------------------
String concatenation routines ---------------------------------------------------------------------------*/ #define StrCatW lstrcatW
#define StrCatA lstrcatA
#ifdef _UNICODE
#define StrCat StrCatW
#else
#define StrCat StrCatA
#endif
/*---------------------------------------------------------------------------
LoadString helpers ---------------------------------------------------------------------------*/ LPTSTR LoadAndAllocString(UINT ids);
/*---------------------------------------------------------------------------
Get safe strings ---------------------------------------------------------------------------*/ LPTSTR GetSafeString(LPTSTR psz); LPWSTR GetSafeStringW(LPWSTR pwsz); LPSTR GetSafeStringA(LPSTR pasz);
/*---------------------------------------------------------------------------
Local conversion routines (conversions performed on stack!) ---------------------------------------------------------------------------*/
// Make sure MFC's afxconv.h hasn't already been loaded to do this
#ifndef USES_CONVERSION
#ifndef _DEBUG
#define USES_CONVERSION int _convert; _convert
#else
#define USES_CONVERSION int _convert = 0
#endif
/////////////////////////////////////////////////////////////////////////////
// Global UNICODE<>ANSI translation helpers
LPWSTR WINAPI AtlA2WHelper(LPWSTR lpw, LPCSTR lpa, int nChars); LPSTR WINAPI AtlW2AHelper(LPSTR lpa, LPCWSTR lpw, int nChars);
#define A2W(lpa) (\
((LPCSTR)lpa == NULL) ? NULL : (\ _convert = (lstrlenA(lpa)+1),\ AtlA2WHelper((LPWSTR) alloca(_convert*2), lpa, _convert)))
#define W2A(lpw) (\
((LPCWSTR)lpw == NULL) ? NULL : (\ _convert = (lstrlenW(lpw)+1)*2,\ AtlW2AHelper((LPSTR) alloca(_convert), lpw, _convert)))
#define A2CW(lpa) ((LPCWSTR)A2W(lpa))
#define W2CA(lpw) ((LPCSTR)W2A(lpw))
#ifdef _UNICODE
#define T2A W2A
#define A2T A2W
#define T2W(_lp) (_lp)
#define W2T(_lp) (_lp)
#define T2CA W2CA
#define A2CT A2CW
#define T2CW(_lp) (_lp)
#define W2CT(_lp) (_lp)
#else
#define T2W A2W
#define W2T W2A
#define T2A(_lp) (_lp)
#define A2T(_lp) (_lp)
#define T2CW A2CW
#define W2CT W2CA
#define T2CA(_lp) (_lp)
#define A2CT(_lp) (_lp)
#endif
#endif // !USES_CONVERSION
#endif // _TFSCHAR_H
|