home *** CD-ROM | disk | FTP | other *** search
- /* 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);
- }
-