| /* |
| * |
| * Character List |
| * |
| * Copyright (c) 2000 by Jean-Claude Batista |
| * |
| */ |
| |
| #include <stdio.h> |
| #include <string.h> |
| #include <stddef.h> |
| #include <ctype.h> |
| #include <stdlib.h> |
| |
| #include "charlist.h" |
| #include "windef.h" |
| #include "winbase.h" |
| |
| 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; |
| |
| 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)); |
| |
| 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; |
| |
| 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) |
| { |
| return pCharList->nCount; |
| } |
| |
| void CHARLIST_FreeList(CHARLIST* pCharList){ |
| while(pCharList->nCount) |
| CHARLIST_Dequeue(pCharList); |
| } |
| |
| /* this function count the number of occurences of a caracter */ |
| int CHARLIST_CountChar(CHARLIST* pCharList, char myChar) |
| { |
| CHARLISTENTRY *pCurrent; |
| int nCount = 0; |
| |
| for(pCurrent =pCharList->pHead ;pCurrent;pCurrent=pCurrent->pNext) |
| if(pCurrent->myChar == myChar) |
| nCount++; |
| |
| return nCount; |
| } |
| |
| int CHARLIST_toBuffer(CHARLIST* pCharList, char* pBuffer, int nBufferSize) |
| { |
| |
| /* 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; |
| } |
| |