| /* | |
| * | |
| * Character List | |
| * | |
| * Copyright (c) 2000 by Jean-Claude Batista | |
| * | |
| * This library is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU Lesser General Public | |
| * License as published by the Free Software Foundation; either | |
| * version 2.1 of the License, or (at your option) any later version. | |
| * | |
| * This library is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| * Lesser General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU Lesser General Public | |
| * License along with this library; if not, write to the Free Software | |
| * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
| */ | |
| #include <stdio.h> | |
| #include <string.h> | |
| #include <stddef.h> | |
| #include <ctype.h> | |
| #include <stdlib.h> | |
| #include "charlist.h" | |
| #include "windef.h" | |
| #include "winbase.h" | |
| #include "wine/debug.h" | |
| WINE_DEFAULT_DEBUG_CHANNEL(richedit); | |
| extern HANDLE RICHED32_hHeap; | |
| void CHARLIST_Enqueue( CHARLIST* pCharList, char myChar ) | |
| { | |
| CHARLISTENTRY* pNewEntry = HeapAlloc(RICHED32_hHeap, 0,sizeof(CHARLISTENTRY)); | |
| pNewEntry->pNext = NULL; | |
| pNewEntry->myChar = myChar; | |
| TRACE("\n"); | |
| if(pCharList->pTail == NULL) | |
| { | |
| pCharList->pHead = pCharList->pTail = pNewEntry; | |
| } | |
| else | |
| { | |
| CHARLISTENTRY* pCurrent = pCharList->pTail; | |
| pCharList->pTail = pCurrent->pNext = pNewEntry; | |
| } | |
| pCharList->nCount++; | |
| } | |
| void CHARLIST_Push( CHARLIST* pCharList, char myChar) | |
| { | |
| CHARLISTENTRY* pNewEntry = malloc(sizeof(CHARLISTENTRY)); | |
| TRACE("\n"); | |
| pNewEntry->myChar = myChar; | |
| if(pCharList->pHead == NULL) | |
| { | |
| pCharList->pHead = pCharList->pTail = pNewEntry; | |
| pNewEntry->pNext = NULL; | |
| } | |
| else | |
| { | |
| pNewEntry->pNext = pCharList->pHead; | |
| pCharList->pHead = pNewEntry; | |
| } | |
| pCharList->nCount++; | |
| } | |
| char CHARLIST_Dequeue(CHARLIST* pCharList) | |
| { | |
| CHARLISTENTRY* pCurrent; | |
| char myChar; | |
| TRACE("\n"); | |
| if(pCharList->nCount == 0) | |
| return 0; | |
| pCharList->nCount--; | |
| myChar = pCharList->pHead->myChar; | |
| pCurrent = pCharList->pHead->pNext; | |
| HeapFree(RICHED32_hHeap, 0,pCharList->pHead); | |
| if(pCharList->nCount == 0) | |
| { | |
| pCharList->pHead = pCharList->pTail = NULL; | |
| } | |
| else | |
| { | |
| pCharList->pHead = pCurrent; | |
| } | |
| return myChar; | |
| } | |
| int CHARLIST_GetNbItems(CHARLIST* pCharList) | |
| { | |
| TRACE("\n"); | |
| return pCharList->nCount; | |
| } | |
| void CHARLIST_FreeList(CHARLIST* pCharList){ | |
| TRACE("\n"); | |
| while(pCharList->nCount) | |
| CHARLIST_Dequeue(pCharList); | |
| } | |
| /* this function counts the number of occurrences of a caracter */ | |
| int CHARLIST_CountChar(CHARLIST* pCharList, char myChar) | |
| { | |
| CHARLISTENTRY *pCurrent; | |
| int nCount = 0; | |
| TRACE("\n"); | |
| for(pCurrent =pCharList->pHead ;pCurrent;pCurrent=pCurrent->pNext) | |
| if(pCurrent->myChar == myChar) | |
| nCount++; | |
| return nCount; | |
| } | |
| int CHARLIST_toBuffer(CHARLIST* pCharList, char* pBuffer, int nBufferSize) | |
| { | |
| TRACE("\n"); | |
| /* we add one to store a NULL caracter */ | |
| if(nBufferSize < pCharList->nCount + 1) | |
| return pCharList->nCount; | |
| for(;pCharList->nCount;pBuffer++) | |
| *pBuffer = CHARLIST_Dequeue(pCharList); | |
| *pBuffer = '\0'; | |
| return 0; | |
| } | |