home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Datafile PD-CD 2
/
DATAFILE_PDCD2.iso
/
utilities3
/
discindex
/
DiscIndex
/
Source
/
C
/
Mem_Man
< prev
next >
Wrap
Text File
|
1994-08-04
|
2KB
|
115 lines
/* DiscIndex 1.00
* Memory manager - Mem_Man.c
* By Neil A Carson 1994 A.D.
* The hard bit! (I hate linked lists)
*/
#include "discindex.h"
#include "heap.h"
#include "werr.h"
#include <stdlib.h>
#include <string.h>
var_type records;
void mem_man_init(void)
{
memset(&records.discs, 0, sizeof(disc_type));
records.no = 1;
}
disc_type *disc_create(void)
{
disc_type *temp;
/* Check if the last one is not used
*/
temp = disc_locate(records.no - 1);
if ((temp->files == 0) && (temp->no == 0) && (temp->disc_name[0] == 0)
&& (temp->used == 0))
return temp;
temp->next = heap_alloc(sizeof(disc_type));
if (temp->next == 0)
{
werr(0, "Out of memory, sorry!");
return 0;
}
memset(temp->next, 0, sizeof(disc_type));
records.no ++;
return temp->next;
}
BOOL disc_insert(int off)
{
disc_type *next, *prev, *cur;
if (off == 0)
{
werr(0, "Can't create a disc before disc 0!");
return FALSE;
}
next = disc_locate(off);
prev = disc_locate(off - 1);
if ((cur = disc_create()) == 0) return FALSE;
prev->next = cur;
cur->next = next;
return TRUE;
}
int disc_destroy(int no)
{
disc_type *prev, *current, *next;
prev = disc_locate(no - 1);
current = prev->next;
if (prev == 0)
{
werr(0, "Disc %d does not exist (prev)!", no);
return 0;
}
if (current == 0)
{
werr(0, "Disc %d does not exist!", no);
return 0;
}
next = current->next;
if ((current->files != 0) && (current->no != 0)) heap_free(current->files);
heap_free(current);
prev->next = next;
records.no --;
return 1;
}
disc_type *disc_locate(int no)
{
int cnt;
disc_type *temp;
if ((no >= records.no) || (no < 0))
werr(1, "Fatal error in disc_locate!");
temp = &records.discs;
for (cnt = 0; cnt < no; cnt ++)
{
temp = temp->next;
if (temp == 0) return 0;
}
return temp;
}
void mem_free(void)
{
int cnt;
for (cnt = (records.no - 1); cnt >= 1; cnt --)
disc_destroy(cnt);
if ((records.discs.files != 0) && (records.discs.no != 0))
heap_free(records.discs.files);
memset(&records.discs, 0, sizeof(disc_type));
records.no = 1;
set_current_disc(0);
}