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.
447 lines
10 KiB
447 lines
10 KiB
/*++
|
|
|
|
Copyright (c) 1989-2001 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
CSTRING.cpp
|
|
|
|
Abstract:
|
|
|
|
Header for
|
|
|
|
Author:
|
|
|
|
kinshu created December 12,2001
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#ifndef _CSTRING_H
|
|
#define _CSTRING_H
|
|
|
|
#include "resource.h"
|
|
#include <strsafe.h>
|
|
|
|
#define MAX_PATH_BUFFSIZE (MAX_PATH+1)
|
|
|
|
//
|
|
// This also controls how much space we allocate during Sprintf implementation. Since large strings
|
|
// like the commandlines and the app help messages are passed in Sprintf (See GetXML() in dbsupport.cpp)
|
|
// Presently the commandlines are limited to 1024 chars and the app help messages also to 1024 chars
|
|
// Note that when we call sprintf we pass additional strings along with these big strings and we are just
|
|
// makign sure that the space is big enough.
|
|
#define MAX_STRING_SIZE 1024 * 3
|
|
|
|
//////////////////////// Externs //////////////////////////////////////////////
|
|
|
|
extern struct _tagSpecialCharMap g_rgSpecialCharMap[4][2];
|
|
extern TCHAR g_szAppName[];
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
//////////////////////// Defines //////////////////////////////////////////////
|
|
|
|
#define MEM_ERR MessageBox(NULL, GetString(IDS_EXCEPTION, NULL, 0), g_szAppName,MB_ICONWARNING|MB_OK);
|
|
|
|
#define SafeCpyN(pszDest, pszSource, nDestSize) StringCchCopy(pszDest, nDestSize, pszSource)
|
|
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
/*++
|
|
|
|
Used to convert from special chars viz. <, >, &, " to the XML equivalents
|
|
|
|
--*/
|
|
typedef struct _tagSpecialCharMap {
|
|
|
|
TCHAR* szString; // The string
|
|
INT iLength; // Length of the string in TCHARs
|
|
} SpecialCharMap;
|
|
|
|
|
|
PTSTR
|
|
GetString(
|
|
UINT iResource,
|
|
PTSTR szStr,
|
|
int nLength
|
|
);
|
|
|
|
int
|
|
CDECL
|
|
MSGF(
|
|
HWND hwndParent,
|
|
PCTSTR pszCaption,
|
|
UINT uType,
|
|
PCTSTR pszFormat,
|
|
...
|
|
);
|
|
|
|
|
|
//
|
|
// The string class
|
|
//
|
|
class CSTRING {
|
|
public:
|
|
|
|
WCHAR* pszString; // The wide string
|
|
LPSTR pszANSI; // The ansi string
|
|
|
|
public:
|
|
|
|
CSTRING();
|
|
|
|
CSTRING(CSTRING& Str);
|
|
|
|
CSTRING(LPCTSTR szString);
|
|
|
|
CSTRING(UINT uID);
|
|
|
|
~CSTRING();
|
|
|
|
void Init(void);
|
|
|
|
void Release(void);
|
|
|
|
BOOL SetString(UINT uID);
|
|
|
|
BOOL SetString(LPCTSTR szStringIn);
|
|
|
|
CSTRING operator + (CSTRING& str)
|
|
{
|
|
return(*this + str.pszString);
|
|
}
|
|
|
|
CSTRING operator + (LPCTSTR szStr)
|
|
{
|
|
CSTRING strStr;
|
|
strStr = *this;
|
|
strStr.Strcat(szStr);
|
|
|
|
return strStr;
|
|
}
|
|
|
|
CSTRING& operator += (LPCTSTR szString)
|
|
{
|
|
if (szString) {
|
|
Strcat(szString);
|
|
}
|
|
|
|
return *this;
|
|
}
|
|
|
|
CSTRING& operator += (CSTRING& string)
|
|
{
|
|
Strcat((LPCTSTR)string);
|
|
return *this;
|
|
}
|
|
|
|
BOOL
|
|
ConvertToLongFileName()
|
|
{
|
|
TCHAR szLongPath[MAX_PATH];
|
|
DWORD dwReturn = 0;
|
|
BOOL bOk = TRUE;
|
|
|
|
dwReturn = GetLongPathName(pszString, szLongPath, MAX_PATH);
|
|
|
|
if (dwReturn > 0 && dwReturn <= sizeof(szLongPath) / sizeof(szLongPath[0])) {
|
|
SetString(szLongPath);
|
|
} else {
|
|
ASSERT(FALSE);
|
|
bOk = FALSE;
|
|
}
|
|
|
|
return bOk;
|
|
}
|
|
|
|
PCTSTR GetFileNamePointer()
|
|
{
|
|
if (pszString) {
|
|
|
|
return PathFindFileName(pszString);
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
BOOL GetWindowsDirectory()
|
|
/*++
|
|
Desc: Gets the windows directory. Will always be appended by a slash
|
|
--*/
|
|
{
|
|
TCHAR szPath[MAX_PATH];
|
|
INT iLength;
|
|
const size_t kszPath = sizeof(szPath) / sizeof(szPath[0]);
|
|
UINT uResult = 0;
|
|
|
|
*szPath = 0;
|
|
|
|
uResult = ::GetWindowsDirectory(szPath, kszPath - 1);
|
|
|
|
if (uResult > 0 && uResult < (kszPath - 1)) {
|
|
|
|
iLength = lstrlen(szPath);
|
|
|
|
if ((iLength < kszPath - 1 && iLength > 0) && szPath[iLength - 1] != TEXT('\\')) {
|
|
|
|
*(szPath + iLength) = TEXT('\\');
|
|
*(szPath + iLength + 1) = 0;
|
|
|
|
SetString(szPath);
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL GetSystemWindowsDirectory()
|
|
/*++
|
|
Desc: Gets the system directory. Will always be appended by a slash
|
|
--*/
|
|
{
|
|
TCHAR szPath[MAX_PATH];
|
|
INT iLength;
|
|
const size_t kszPath = sizeof(szPath) / sizeof(szPath[0]);
|
|
UINT uResult = 0;
|
|
|
|
*szPath = 0;
|
|
|
|
uResult = ::GetSystemWindowsDirectory(szPath, kszPath - 1);
|
|
|
|
if (uResult > 0 && uResult < (kszPath - 1)) {
|
|
|
|
iLength = lstrlen(szPath);
|
|
|
|
if ((iLength < kszPath - 1 && iLength > 0) && szPath[iLength - 1] != TEXT('\\')) {
|
|
|
|
*(szPath + iLength) = TEXT('\\');
|
|
*(szPath + iLength + 1) = 0;
|
|
|
|
SetString(szPath);
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL GetSystemDirectory()
|
|
/*++
|
|
Desc: Gets the system directory. Will always be appended by a slash
|
|
--*/
|
|
{
|
|
TCHAR szPath[MAX_PATH];
|
|
INT iLength;
|
|
const size_t kszPath = sizeof(szPath) / sizeof(szPath[0]);
|
|
UINT uResult = 0;
|
|
|
|
*szPath = 0;
|
|
|
|
uResult = ::GetSystemDirectory(szPath, kszPath - 1);
|
|
|
|
if (uResult > 0 && uResult < (kszPath - 1)) {
|
|
|
|
iLength = lstrlen(szPath);
|
|
|
|
if ((iLength < kszPath - 1 && iLength > 0) && szPath[iLength - 1] != TEXT('\\')) {
|
|
|
|
*(szPath + iLength) = TEXT('\\');
|
|
*(szPath + iLength + 1) = 0;
|
|
|
|
SetString(szPath);
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
operator LPWSTR()
|
|
{
|
|
return pszString;
|
|
}
|
|
|
|
operator LPCWSTR()
|
|
{
|
|
return pszString;
|
|
|
|
}
|
|
|
|
CSTRING& operator =(LPCWSTR szStringIn)
|
|
{
|
|
SetString(szStringIn);
|
|
return *this;
|
|
}
|
|
|
|
CSTRING& operator =(CSTRING & szStringIn)
|
|
{
|
|
SetString(szStringIn.pszString);
|
|
return *this;
|
|
}
|
|
|
|
BOOL operator == (CSTRING & szString)
|
|
{
|
|
return(*this == szString.pszString);
|
|
}
|
|
|
|
BOOL operator == (LPCTSTR szString)
|
|
{
|
|
//
|
|
// Both of them are NULL, we say that they are similar
|
|
//
|
|
if (NULL == pszString && NULL == szString) {
|
|
return TRUE;
|
|
}
|
|
|
|
//
|
|
// One of them is NULL, but the other one is NOT, we return dissimilar
|
|
//
|
|
if (NULL == pszString || NULL == szString) {
|
|
return FALSE;
|
|
}
|
|
|
|
if (0 == lstrcmpi(szString, pszString)) {
|
|
return TRUE;
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
BOOL operator != (CSTRING& szString)
|
|
{
|
|
if (NULL == pszString && NULL == szString.pszString) {
|
|
return FALSE;
|
|
}
|
|
|
|
if (NULL == pszString || NULL == szString.pszString) {
|
|
return TRUE;
|
|
}
|
|
|
|
if (0 == lstrcmpi(szString.pszString,pszString)) {
|
|
return FALSE;
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
BOOL operator != (LPCTSTR szString)
|
|
{
|
|
return(! (*this == szString));
|
|
}
|
|
|
|
BOOL operator <= (CSTRING &szString)
|
|
{
|
|
return((lstrcmpi (*this,szString) <= 0) ? TRUE : FALSE);
|
|
}
|
|
|
|
BOOL operator < (CSTRING &szString)
|
|
{
|
|
return((lstrcmpi (*this,szString) < 0) ? TRUE : FALSE);
|
|
}
|
|
|
|
BOOL operator >= (CSTRING &szString)
|
|
{
|
|
return((lstrcmpi (*this,szString) >= 0) ? TRUE : FALSE);
|
|
}
|
|
|
|
BOOL operator > (CSTRING &szString)
|
|
{
|
|
return((lstrcmpi (*this, szString) > 0) ? TRUE : FALSE);
|
|
}
|
|
|
|
void __cdecl Sprintf(LPCTSTR szFormat, ...);
|
|
|
|
UINT Trim(void);
|
|
|
|
static INT Trim(IN OUT LPTSTR str);
|
|
|
|
BOOL SetChar(int nPos, TCHAR chValue);
|
|
|
|
BOOL GetChar(int nPos, TCHAR* chReturn);
|
|
|
|
CSTRING SpecialCharToXML(BOOL bApphelpMessage = FALSE);
|
|
|
|
TCHAR* XMLToSpecialChar(void);
|
|
|
|
static TCHAR* StrStrI(const TCHAR* szString,const TCHAR* szMatch);
|
|
|
|
BOOL BeginsWith(LPCTSTR szPrefix);
|
|
|
|
BOOL EndsWith(LPCTSTR szSuffix);
|
|
|
|
static BOOL EndsWith(LPCTSTR szString, LPCTSTR szSuffix);
|
|
|
|
LPCTSTR Strcat(CSTRING & szStr);
|
|
|
|
LPCTSTR Strcat(LPCTSTR pString);
|
|
|
|
BOOL isNULL(void);
|
|
|
|
int Length(void);
|
|
|
|
void GUID(GUID& Guid);
|
|
|
|
CSTRING& ShortFilename(void);
|
|
|
|
BOOL RelativeFile(CSTRING& szPath);
|
|
|
|
BOOL RelativeFile(LPCTSTR pExeFile);
|
|
|
|
TCHAR* Replace(PCTSTR pszToFind, PCTSTR pszWith);
|
|
};
|
|
|
|
/*++
|
|
CSTRINGLIST is a list of these
|
|
--*/
|
|
typedef struct _tagSList {
|
|
CSTRING szStr; // The string
|
|
int data ; // Any data that is associated with this string
|
|
struct _tagSList * pNext; // The next string
|
|
|
|
} STRLIST, *PSTRLIST;
|
|
|
|
/*++
|
|
A linked list of PSTRLIST
|
|
--*/
|
|
class CSTRINGLIST {
|
|
public:
|
|
|
|
UINT m_uCount; // The total number of elements
|
|
PSTRLIST m_pHead; // The first element
|
|
PSTRLIST m_pTail; // The last element
|
|
|
|
public:
|
|
|
|
CSTRINGLIST();
|
|
|
|
~CSTRINGLIST();
|
|
|
|
BOOL IsEmpty(void);
|
|
|
|
void DeleteAll(void);
|
|
|
|
BOOL AddString(CSTRING& Str, int data = 0);
|
|
|
|
BOOL AddStringAtBeg(LPCTSTR lpszStr,int data = 0);
|
|
|
|
BOOL AddStringInOrder(LPCTSTR pStr,int data = 0);
|
|
|
|
BOOL GetElement(UINT uPos, CSTRING& str);
|
|
|
|
BOOL AddString(LPCTSTR pStr, int data = 0);
|
|
|
|
CSTRINGLIST& operator =(CSTRINGLIST& strlTemp);
|
|
|
|
BOOL operator != (CSTRINGLIST &strlTemp);
|
|
|
|
BOOL operator == (CSTRINGLIST &strlTemp);
|
|
|
|
BOOL Remove(CSTRING &str);
|
|
|
|
void RemoveLast(void);
|
|
};
|
|
|
|
#endif
|