2025-11-27 16:46:48 +09:00

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;
}