diff options
Diffstat (limited to 'libdtv/liblx/xMemMgt.c')
-rw-r--r-- | libdtv/liblx/xMemMgt.c | 624 |
1 files changed, 0 insertions, 624 deletions
diff --git a/libdtv/liblx/xMemMgt.c b/libdtv/liblx/xMemMgt.c deleted file mode 100644 index b1b07de..0000000 --- a/libdtv/liblx/xMemMgt.c +++ /dev/null @@ -1,624 +0,0 @@ -/* - * - * xMemMgt.c: memory management functions of liblx - * - * - * $Revision: 1.1 $ - * $Date: 2001/06/25 12:29:47 $ - * $Author: hakenes $ - * - * (C) 1992-2001 Rolf Hakenes <hakenes@hippomi.de>, under the GNU GPL. - * - * liblx is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * liblx 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 General Public License for more details. - * - * You may have received a copy of the GNU General Public License - * along with liblx; see the file COPYING. If not, write to the - * Free Software Foundation, Inc., 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. - * - */ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> -#include <malloc.h> - -#include "liblx.h" - -#ifdef DEBUG -void logPrintf(int, char *, ...); -#endif - -static struct MEM_CHUNK *xRememberKey = NULL; - -static struct MEM_CHUNK **xRememberPtr = &xRememberKey; - -unsigned long xAllocatedMemory = 0; - -/************************************************************************* - * * - * function : xMemAlloc * - * * - * parameter : Size - size of the requested memory area * - * * - * DataPointer - pointer to data pointer * - * * - * return : none * - * * - *-----------------------------------------------------------------------* - * * - * xMemAlloc() is a clustered, remembering memory management routine. * - * It uses its own tables for free and used memory blocks on private * - * memory area. With xMemFree(), you can free this memory likewise * - * the C free() routine, with xMemFreeAll() all memory at once. * - * By changing the current remember key with xSetRemember() you can * - * define a local memory area, which can be freed by only one call of * - * xMemFreeAll() (see xSetRemember() / xGetRemember()). * - * * - *************************************************************************/ - -void xMemAllo (Size, DataPointer) - -unsigned long Size; -unsigned char **DataPointer; -{ - struct MEM_CHUNK *MemChunk, *MemChunkPred; - struct MEM_ENTRY *MemEntry, *MemEntryPred; - long int NewSize; - unsigned short FoundFlag; -#ifdef DEBUG - unsigned char *ptr; -#endif - - while (Size % 4) Size++; - - if (Size > (MEM_CHUNK_SIZE - sizeof(struct MEM_CHUNK) - - sizeof(struct MEM_ENTRY))) - { - NewSize = Size + sizeof(struct MEM_CHUNK) + sizeof(struct MEM_ENTRY); - - if (MemChunk = (*xRememberPtr)) - { - do - { - MemChunkPred = MemChunk; - } while (MemChunk = MemChunk->Succ); - } - else MemChunkPred = (struct MEM_CHUNK *) &(*xRememberPtr); - - MemChunk = MemChunkPred->Succ = (struct MEM_CHUNK *) malloc (NewSize); - xAllocatedMemory += NewSize; - -#ifdef DEBUG - for (ptr = (unsigned char *) MemChunk; ptr < (unsigned char *) - (MemChunk) + NewSize; ptr++) - *ptr = (((unsigned long)ptr)&1) ? 0x55 : 0xAA; -#endif - - if (!MemChunk) - { -#ifdef DEBUG - logPrintf (0, "Not enough memory...\r\n"); -#endif - exit (1); - } - - MemChunk->Size = NewSize; - MemChunk->Pred = MemChunkPred; - MemChunk->Succ = NULL; - MemChunk->FirstFreeMemEntry = NULL; - MemChunk->FirstUsedMemEntry = - MemEntry = (struct MEM_ENTRY *) ((unsigned char *)MemChunk + - sizeof(struct MEM_CHUNK)); - - MemEntry->Size = Size; - MemEntry->Pred = (struct MEM_ENTRY *) &MemChunk->FirstUsedMemEntry; - MemEntry->Succ = NULL; - - *DataPointer = (unsigned char *) ((unsigned char *)MemEntry + - sizeof(struct MEM_ENTRY)); -#ifdef DEBUG_CALLS - logPrintf (0, "xMemAlloc: %x, %d bytes\r\n", *DataPointer, Size); -#endif - return; - } - - MemEntry = NULL; - FoundFlag = 0; - - if (MemChunk = (*xRememberPtr)) - { - do - { - if (MemEntry = MemChunk->FirstFreeMemEntry) - do - { - if (Size <= MemEntry->Size) FoundFlag = 1; - } while ((FoundFlag == 0) && (MemEntry = MemEntry->Succ)); - MemChunkPred = MemChunk; - } while ((FoundFlag == 0) && (MemChunk = MemChunk->Succ)); - } - else MemChunkPred = (struct MEM_CHUNK *) &(*xRememberPtr); - - if (!MemEntry) - { - MemChunk = MemChunkPred->Succ = - (struct MEM_CHUNK *) malloc (MEM_CHUNK_SIZE); - xAllocatedMemory += MEM_CHUNK_SIZE; - -#ifdef DEBUG - for (ptr = (unsigned char *) MemChunk; ptr < (unsigned char *) - (MemChunk) + MEM_CHUNK_SIZE; ptr++) - *ptr = (((unsigned long)ptr)&1) ? 0x55 : 0xAA; -#endif - - if (!MemChunk) - { -#ifdef DEBUG - logPrintf (0, "Not enough memory...\r\n"); -#endif - exit (1); - } - - MemChunk->Size = MEM_CHUNK_SIZE; - MemChunk->Pred = MemChunkPred; - MemChunk->Succ = NULL; - MemChunk->FirstUsedMemEntry = NULL; - MemChunk->FirstFreeMemEntry = - MemEntry = (struct MEM_ENTRY *) - ((unsigned char *)MemChunk + sizeof(struct MEM_CHUNK)); - - MemEntry->Size = MEM_CHUNK_SIZE - sizeof(struct MEM_CHUNK) - - sizeof(struct MEM_ENTRY); - MemEntry->Pred = (struct MEM_ENTRY *) &MemChunk->FirstFreeMemEntry; - MemEntry->Succ = NULL; - } - - NewSize = MemEntry->Size - sizeof(struct MEM_ENTRY) - Size; - - MemEntry->Size = Size; - *DataPointer = (unsigned char *) - ((unsigned char *)MemEntry + sizeof(struct MEM_ENTRY)); - -#ifdef DEBUG - for (ptr = *DataPointer; ptr < (unsigned char *) - (*DataPointer) + Size; ptr++) - { - if (((unsigned long )ptr)&1) - { if (*ptr != 0x55) - logPrintf (0, "freed memory was used\r\n"); } - else { if (*ptr != 0xAA) - logPrintf (0, "freed memory was used\r\n"); } - } -#endif - - if (MemEntry->Succ) - ((struct MEM_ENTRY *)MemEntry->Succ)->Pred = MemEntry->Pred; - ((struct MEM_ENTRY *)MemEntry->Pred)->Succ = MemEntry->Succ; - - if (MemChunk->FirstUsedMemEntry) - MemChunk->FirstUsedMemEntry->Pred = MemEntry; - MemEntry->Succ = MemChunk->FirstUsedMemEntry; - MemChunk->FirstUsedMemEntry = MemEntry; - MemEntry->Pred = (struct MEM_ENTRY *) &MemChunk->FirstUsedMemEntry; - - if (NewSize > 0) - { - MemEntry = (struct MEM_ENTRY *) - ((unsigned char *)MemEntry + sizeof(struct MEM_ENTRY) + Size); - MemEntry->Size = NewSize; - - if (MemChunk->FirstFreeMemEntry) - MemChunk->FirstFreeMemEntry->Pred = MemEntry; - MemEntry->Succ = MemChunk->FirstFreeMemEntry; - MemChunk->FirstFreeMemEntry = MemEntry; - MemEntry->Pred = (struct MEM_ENTRY *) &MemChunk->FirstFreeMemEntry; - } -#ifdef DEBUG_CALLS - logPrintf (0, "xMemAlloc: %x, %d bytes\r\n", *DataPointer, Size); -#endif - return; -} - - - -/************************************************************************* - * * - * function : xMemFree * - * * - * parameter : DataPointer - data pointer * - * * - * return : none * - * * - *-----------------------------------------------------------------------* - * * - * xMemFree() frees with xMemAlloc() allocated memory. * - * * - *************************************************************************/ - -void xMemFre (DataPointer) - -unsigned char *DataPointer; -{ - struct MEM_CHUNK *MemChunk, *MemChunkPred; - struct MEM_ENTRY *MemEntry, *TempEntry, *PredEntry, *SuccEntry; - unsigned short FoundFlag; -#ifdef DEBUG - unsigned char *ptr; -#endif - - if (!DataPointer) - { - return; - } - else - { - MemEntry = NULL; - FoundFlag = 0; - - if (MemChunk = (*xRememberPtr)) - do - { - if (MemEntry = MemChunk->FirstUsedMemEntry) - do - { - if (DataPointer == (unsigned char *) ((unsigned char *) MemEntry + - sizeof(struct MEM_ENTRY))) FoundFlag = 1; - } while ((FoundFlag == 0) && (MemEntry = MemEntry->Succ)); - } while ((FoundFlag == 0) && (MemChunk = MemChunk->Succ)); - - if (FoundFlag == 1) - { -#ifdef DEBUG_CALLS - logPrintf (0, "xMemFree: %x, %d bytes\r\n", DataPointer, MemEntry->Size); -#endif - if (MemEntry->Succ) - ((struct MEM_ENTRY *)MemEntry->Succ)->Pred = MemEntry->Pred; - ((struct MEM_ENTRY *)MemEntry->Pred)->Succ = MemEntry->Succ; - - if (!MemChunk->FirstUsedMemEntry) - { - if (MemChunk->Succ) - ((struct MEM_CHUNK *)MemChunk->Succ)->Pred = MemChunk->Pred; - ((struct MEM_CHUNK *)MemChunk->Pred)->Succ = MemChunk->Succ; - if (xAllocatedMemory > 0) xAllocatedMemory -= MemChunk->Size; - free (MemChunk); - return; - } - - FoundFlag = 0; - PredEntry = NULL; - SuccEntry = NULL; - if (TempEntry = MemChunk->FirstFreeMemEntry) - do - { - if ((struct MEM_ENTRY *)((unsigned char *)TempEntry + - TempEntry->Size + sizeof(struct MEM_ENTRY)) == MemEntry) - { - FoundFlag ++; - PredEntry = TempEntry; - } - if ((struct MEM_ENTRY *)((unsigned char *)MemEntry + - MemEntry->Size + sizeof(struct MEM_ENTRY)) == TempEntry) - { - FoundFlag ++; - SuccEntry = TempEntry; - } - } while ((FoundFlag != 2) && (TempEntry = TempEntry->Succ)); - - if (PredEntry) - { - if (SuccEntry) - { - /* Vorgdnger + Nachfolger */ - - if (SuccEntry->Succ) - ((struct MEM_ENTRY *)SuccEntry->Succ)->Pred = SuccEntry->Pred; - ((struct MEM_ENTRY *)SuccEntry->Pred)->Succ = SuccEntry->Succ; - - PredEntry->Size += MemEntry->Size + sizeof(struct MEM_ENTRY) + - SuccEntry->Size + sizeof(struct MEM_ENTRY); - } - else - { - /* nur Vorgaenger */ - - PredEntry->Size += MemEntry->Size + sizeof(struct MEM_ENTRY); - } -#ifdef DEBUG - for (ptr = (unsigned char *) (PredEntry) + sizeof(struct MEM_ENTRY); - ptr < (unsigned char *) (PredEntry) + sizeof(struct MEM_ENTRY) + - PredEntry->Size; ptr++) - *ptr = (((unsigned long)ptr)&1) ? 0x55 : 0xAA; -#endif - } - else - { - if (SuccEntry) - { - /* nur Nachfolger */ - - if (SuccEntry->Succ) - ((struct MEM_ENTRY *)SuccEntry->Succ)->Pred = SuccEntry->Pred; - ((struct MEM_ENTRY *)SuccEntry->Pred)->Succ = SuccEntry->Succ; - - MemEntry->Size += SuccEntry->Size + sizeof(struct MEM_ENTRY); - } - - if (MemChunk->FirstFreeMemEntry) - MemChunk->FirstFreeMemEntry->Pred = MemEntry; - MemEntry->Succ = MemChunk->FirstFreeMemEntry; - MemChunk->FirstFreeMemEntry = MemEntry; - MemEntry->Pred = (struct MEM_ENTRY *) &MemChunk->FirstFreeMemEntry; -#ifdef DEBUG - for (ptr = (unsigned char *) (MemEntry) + sizeof(struct MEM_ENTRY); - ptr < (unsigned char *) (MemEntry) + sizeof(struct MEM_ENTRY) + - MemEntry->Size; ptr++) - *ptr = (((unsigned long)ptr)&1) ? 0x55 : 0xAA; -#endif - } - } -#ifdef DEBUG_CALLS - else - logPrintf (0, "xMemFree: tried to free unallocated data %x\r\n", DataPointer); -#endif - } - return; -} - - - -/************************************************************************* - * * - * function : xMemFreeAll * - * * - * parameter : RememberPtr * - * * - * return : none * - * * - *-----------------------------------------------------------------------* - * * - * xMemFreeAll() frees all with xMemAlloc() allocated memory. If Re- * - * memberPtr is not NULL, the MEM_CHUNK structure from the specified * - * Address is freed, otherwise the natural MEM_CHUNK will be done. * - * * - *************************************************************************/ - - -void xMemFreeAll (RememberPtr) - -struct MEM_CHUNK **RememberPtr; -{ - struct MEM_CHUNK *MemChunk, *MemChunkPred; - - if (RememberPtr) - { - if (MemChunkPred = (*RememberPtr)) - do - { - MemChunk = MemChunkPred->Succ; - if (xAllocatedMemory > 0) xAllocatedMemory -= MemChunkPred->Size; - free (MemChunkPred); - } while (MemChunkPred = MemChunk); - *RememberPtr = NULL; - } - else - { - if (MemChunkPred = (*xRememberPtr)) - do - { - MemChunk = MemChunkPred->Succ; - if (xAllocatedMemory > 0) xAllocatedMemory -= MemChunkPred->Size; - free (MemChunkPred); - } while (MemChunkPred = MemChunk); - *xRememberPtr = NULL; - } -} - - -/************************************************************************* - * * - * function : xMemMerge * - * * - * parameter : RememberPtr * - * * - * return : none * - * * - *-----------------------------------------------------------------------* - * * - * xMemMerge() merges the memory area pointed to by RememberKey with * - * the currently used in xRememberPtr. * - * * - *************************************************************************/ - -void xMemMerge (RememberPtr) - -struct MEM_CHUNK **RememberPtr; -{ - struct MEM_CHUNK *MemChunk, *MemChunkPred; - - if (RememberPtr) - { - if (MemChunk = (*xRememberPtr)) - { - while (MemChunk->Succ) MemChunk = MemChunk->Succ; - MemChunk->Succ = (*RememberPtr); - *RememberPtr = NULL; - } - else (*xRememberPtr = *RememberPtr); - } - return; -} - -/************************************************************************* - * * - * function : xGetRemember * - * * - * parameter : none * - * * - * return : pointer to a MEM_CHUNK tree * - * * - *-----------------------------------------------------------------------* - * * - * xGetRemember() returns the currently used MEM_CHUNK tree. * - * * - *************************************************************************/ - - -struct MEM_CHUNK **xGetRemember () -{ - return (xRememberPtr); -} - - -/************************************************************************* - * * - * function : xSetRemember * - * * - * parameter : pointer to a MEM_CHUNK tree * - * * - * return : none * - * * - *-----------------------------------------------------------------------* - * * - * xSetRemember() redefines the currently used MEM_CHUNK pointer. If * - * RememberPtr is NULL, the natural MEM_CHUNK is reloaded. * - * * - *************************************************************************/ - - -void xSetRemember (RememberPtr) - -struct MEM_CHUNK **RememberPtr; -{ - if (RememberPtr) - xRememberPtr = RememberPtr; - else - xRememberPtr = &xRememberKey; -} - -/************************************************************************* - * * - * function : xPrintMemList * - * * - * parameter : pointer to a MEM_CHUNK tree * - * * - * return : none * - * * - *-----------------------------------------------------------------------* - * * - * xPrintMemList() prints the currently allocated memory blocks of * - * the specified RememberPtr. * - * * - *************************************************************************/ - - -void xPrintMemList (Remember) - -struct MEM_CHUNK **Remember; -{ - struct MEM_CHUNK *MemChunk; - struct MEM_ENTRY *MemEntry; - - fprintf (stderr, "MemChunkPtr = %x\n", (int) Remember); - - if (MemChunk = *Remember) - do - { - fprintf (stderr, "\tMemChunk at %x with Size %d\n", (int) MemChunk, - (int) MemChunk->Size); - - if (MemEntry = MemChunk->FirstFreeMemEntry) - do - { - fprintf (stderr, "\t\tFree MemEntry at %x (%x) with Size %d\n", - (int) MemEntry, (int)((unsigned char *)MemEntry + - sizeof(struct MEM_ENTRY)), (int) MemEntry->Size); - - } while (MemEntry = MemEntry->Succ); - - if (MemEntry = MemChunk->FirstUsedMemEntry) - do - { - fprintf (stderr, "\t\tUsed MemEntry at %x (%x) with Size %d\n", - (int) MemEntry, (int)((unsigned char *)MemEntry + - sizeof(struct MEM_ENTRY)), (int) MemEntry->Size); - - } while (MemEntry = MemEntry->Succ); - - } while (MemChunk = MemChunk->Succ); - else fprintf (stderr, "\tNo current MemChunk\n"); -} - - -/************************************************************************* - * * - * function : xGetMemSize * - * * - * parameter : pointer to a MEM_CHUNK tree * - * * - * return : none * - * * - *-----------------------------------------------------------------------* - * * - * xGetMemSize() gets the size of the currently allocated memory * - * blocks of the specified (or natural if NULL) RememberPtr * - * * - *************************************************************************/ - - -unsigned long xGetMemSize (RememberPtr) - -struct MEM_CHUNK **RememberPtr; -{ - struct MEM_CHUNK *MemChunk; - struct MEM_ENTRY *MemEntry; - unsigned long Result = 0; - - if (RememberPtr) MemChunk = *RememberPtr; - else MemChunk = xRememberKey; - - if (MemChunk) - do { Result += (unsigned long) MemChunk->Size; } - while (MemChunk = MemChunk->Succ); - - return (Result); -} - - -/************************************************************************* - * * - * function : xSetText * - * * - * arguments : xText - pointer to a string * - * * - * return : pointer to an new allocated string * - * * - *-----------------------------------------------------------------------* - * * - * xSetText() allocates memory for the string pointed to by 'xText' * - * and duplicates it. * - * * - *************************************************************************/ - -char *xSetText (xText) - -char *xText; -{ - char *NewText; - - if (!xText) return (NULL); - - xMemAlloc (strlen(xText) + 1, &NewText); - strcpy (NewText, xText); - - return (NewText); -} |