278 lines
5.4 KiB
C++
278 lines
5.4 KiB
C++
// ==========================================================================
|
|
// Class Implementation : COXDoubleStringList
|
|
// ==========================================================================
|
|
|
|
// Source file :dstrlist.cpp
|
|
|
|
// Version: 9.3
|
|
|
|
// This software along with its related components, documentation and files ("The Libraries")
|
|
// is © 1994-2007 The Code Project (1612916 Ontario Limited) and use of The Libraries is
|
|
// governed by a software license agreement ("Agreement"). Copies of the Agreement are
|
|
// available at The Code Project (www.codeproject.com), as part of the package you downloaded
|
|
// to obtain this file, or directly from our office. For a copy of the license governing
|
|
// this software, you may contact us at legalaffairs@codeproject.com, or by calling 416-849-8900.
|
|
|
|
// //////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "stdafx.h" // standard MFC include
|
|
#include "returns.h" // internal return codes
|
|
#include "dstrlist.h" // class specification
|
|
|
|
#include "UTBStrOp.h"
|
|
|
|
#ifdef _DEBUG
|
|
#undef THIS_FILE
|
|
static char BASED_CODE THIS_FILE[] = __FILE__;
|
|
#endif
|
|
|
|
#define new DEBUG_NEW
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// Definition of static members
|
|
|
|
|
|
// Data members -------------------------------------------------------------
|
|
// protected:
|
|
|
|
// private:
|
|
// STRINGLIST* m_pHead;
|
|
// --- pointer to the head of the linked list
|
|
|
|
// STRINGLIST* m_pCurrent;
|
|
// --- pointer to the current entry in the list
|
|
|
|
// STRINGLIST* m_pTail;
|
|
// --- pointer to the tail of the linked list
|
|
|
|
// short m_nCount;
|
|
// --- number of entries in the list
|
|
|
|
// Member functions ---------------------------------------------------------
|
|
// public:
|
|
|
|
COXDoubleStringList::COXDoubleStringList()
|
|
{
|
|
m_pHead = NULL;
|
|
m_pCurrent = NULL;
|
|
m_pTail = NULL;
|
|
m_nCount = 0;
|
|
}
|
|
|
|
COXDoubleStringList::~COXDoubleStringList()
|
|
{
|
|
RemoveAll();
|
|
}
|
|
|
|
short COXDoubleStringList::Find(LPCTSTR pStr, int* pnSel /* = NULL */)
|
|
{
|
|
LPTSTR lp;
|
|
int i;
|
|
|
|
for (i = 0, lp = GetFirst(); lp; lp = GetNext(), i++)
|
|
{
|
|
if (_tcscmp(pStr, lp) == 0)
|
|
{
|
|
if (pnSel != NULL)
|
|
*pnSel = i;
|
|
|
|
return SUCCESS;
|
|
}
|
|
}
|
|
|
|
return F_NOTFOUND;
|
|
}
|
|
|
|
LPTSTR COXDoubleStringList::GetAt(short nIndex)
|
|
{
|
|
LPTSTR lp;
|
|
int i;
|
|
|
|
if (nIndex > m_nCount)
|
|
return NULL;
|
|
|
|
for (i = 0, lp = GetFirst(); lp; lp = GetNext(), i++)
|
|
{
|
|
if (i == nIndex)
|
|
return lp;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
void COXDoubleStringList::SetMarked(short nIndex, BOOL bMark)
|
|
{
|
|
int i;
|
|
STRINGLIST *pList;
|
|
|
|
if (nIndex > m_nCount)
|
|
return;
|
|
|
|
for (i = 0, pList = m_pHead; pList; pList = pList->pNext, i++)
|
|
{
|
|
if (i == nIndex)
|
|
{
|
|
pList->bMarked = bMark;
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
BOOL COXDoubleStringList::IsMarked(short nIndex)
|
|
{
|
|
int i;
|
|
STRINGLIST *pList;
|
|
|
|
if (nIndex > m_nCount)
|
|
return FALSE;
|
|
|
|
for (i = 0, pList = m_pHead; pList; pList = pList->pNext, i++)
|
|
{
|
|
if (i == nIndex)
|
|
{
|
|
return pList->bMarked;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
short COXDoubleStringList::AddUnique(LPCTSTR pStr)
|
|
{
|
|
if (Find(pStr) == SUCCESS)
|
|
return F_CANCEL;
|
|
|
|
return Add(pStr);
|
|
}
|
|
|
|
short COXDoubleStringList::Add(LPCTSTR pStr)
|
|
{
|
|
int nLen;
|
|
|
|
if (m_pHead == NULL)
|
|
{
|
|
m_pHead = new STRINGLIST;
|
|
m_pHead->pPrev = NULL;
|
|
m_pTail = m_pHead;
|
|
}
|
|
else
|
|
{
|
|
m_pTail->pNext = new STRINGLIST;
|
|
m_pTail->pNext->pPrev = m_pTail;
|
|
m_pTail = m_pTail->pNext;
|
|
}
|
|
|
|
// Init the entry
|
|
m_pTail->pNext = NULL;
|
|
|
|
nLen = (int)_tcsclen(pStr);
|
|
|
|
m_pTail->pString = new TCHAR[nLen+1];
|
|
|
|
UTBStr::tcscpy(m_pTail->pString, nLen, pStr);
|
|
m_pTail->bMarked = FALSE;
|
|
m_nCount ++;
|
|
|
|
return SUCCESS;
|
|
}
|
|
|
|
short COXDoubleStringList::Remove(int nSel)
|
|
{
|
|
int i;
|
|
|
|
for (i = 0, m_pCurrent = m_pHead; m_pCurrent; m_pCurrent = m_pCurrent->pNext, i++)
|
|
{
|
|
if (i == nSel)
|
|
{
|
|
// is this the head
|
|
if (m_pHead == m_pCurrent)
|
|
{
|
|
m_pHead = m_pCurrent->pNext;
|
|
if (m_pHead)
|
|
m_pHead->pPrev = NULL;
|
|
}
|
|
else if (m_pCurrent == m_pTail) // is this the tail
|
|
{
|
|
m_pCurrent->pPrev->pNext = NULL;
|
|
m_pTail = m_pCurrent->pPrev;
|
|
}
|
|
else
|
|
{
|
|
m_pCurrent->pPrev->pNext = m_pCurrent->pNext;
|
|
m_pCurrent->pNext->pPrev = m_pCurrent->pPrev;
|
|
}
|
|
|
|
if (m_pCurrent->pString)
|
|
{
|
|
delete [] m_pCurrent->pString;
|
|
}
|
|
|
|
delete m_pCurrent;
|
|
m_nCount --;
|
|
|
|
m_pCurrent = NULL;
|
|
|
|
return SUCCESS;
|
|
}
|
|
}
|
|
|
|
return F_NOTFOUND;
|
|
}
|
|
|
|
LPTSTR COXDoubleStringList::GetLast()
|
|
{
|
|
if (m_pTail == NULL)
|
|
return NULL;
|
|
m_pCurrent = m_pTail;
|
|
return m_pCurrent->pString;
|
|
}
|
|
|
|
LPTSTR COXDoubleStringList::GetPrev()
|
|
{
|
|
if (m_pCurrent->pPrev == NULL)
|
|
return NULL;
|
|
|
|
m_pCurrent = m_pCurrent->pPrev;
|
|
return m_pCurrent->pString;
|
|
}
|
|
|
|
LPTSTR COXDoubleStringList::GetFirst()
|
|
{
|
|
if (m_pHead == NULL)
|
|
return NULL;
|
|
|
|
m_pCurrent = m_pHead;
|
|
return m_pCurrent->pString;
|
|
}
|
|
|
|
LPTSTR COXDoubleStringList::GetNext()
|
|
{
|
|
if (m_pCurrent->pNext == NULL)
|
|
return NULL;
|
|
|
|
m_pCurrent = m_pCurrent->pNext;
|
|
return m_pCurrent->pString;
|
|
}
|
|
|
|
|
|
void COXDoubleStringList::RemoveAll()
|
|
{
|
|
// Free all the memory allocated
|
|
m_pCurrent = m_pHead;
|
|
while (m_pHead != NULL)
|
|
{
|
|
m_pHead = m_pCurrent->pNext;
|
|
if (m_pCurrent->pString)
|
|
{
|
|
delete [] m_pCurrent->pString;
|
|
}
|
|
delete m_pCurrent;
|
|
m_pCurrent = m_pHead;
|
|
}
|
|
|
|
m_pHead = NULL;
|
|
m_pTail = NULL;
|
|
m_pCurrent = NULL;
|
|
m_nCount = 0;
|
|
}
|