home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 2 / DATAFILE_PDCD2.iso / utilities3 / discindex / DiscIndex / Source / C / Mem_Man < prev    next >
Text File  |  1994-08-04  |  2KB  |  115 lines

  1. /* DiscIndex 1.00
  2.  * Memory manager - Mem_Man.c
  3.  * By Neil A Carson 1994 A.D.
  4.  * The hard bit! (I hate linked lists)
  5.  */
  6.  
  7. #include "discindex.h"
  8. #include "heap.h"
  9. #include "werr.h"
  10.  
  11. #include <stdlib.h>
  12. #include <string.h>
  13.  
  14. var_type records;
  15.  
  16. void mem_man_init(void)
  17. {
  18.     memset(&records.discs, 0, sizeof(disc_type));
  19.     records.no = 1;
  20. }
  21.  
  22. disc_type *disc_create(void)
  23. {
  24.     disc_type *temp;
  25.  
  26.     /* Check if the last one is not used
  27.      */
  28.     temp = disc_locate(records.no - 1);
  29.     if ((temp->files == 0) && (temp->no == 0) && (temp->disc_name[0] == 0)
  30.         && (temp->used == 0))
  31.         return temp;
  32.  
  33.     temp->next = heap_alloc(sizeof(disc_type));
  34.  
  35.     if (temp->next == 0)
  36.     {
  37.         werr(0, "Out of memory, sorry!");
  38.         return 0;
  39.     }
  40.     memset(temp->next, 0, sizeof(disc_type));
  41.     records.no ++;
  42.     return temp->next;
  43. }
  44.  
  45. BOOL disc_insert(int off)
  46. {
  47.     disc_type *next, *prev, *cur;
  48.  
  49.     if (off == 0)
  50.     {
  51.         werr(0, "Can't create a disc before disc 0!");
  52.         return FALSE;
  53.     }
  54.  
  55.     next = disc_locate(off);
  56.     prev = disc_locate(off - 1);
  57.     if ((cur = disc_create()) == 0) return FALSE;
  58.     prev->next = cur;
  59.     cur->next = next;
  60.     return TRUE;
  61. }
  62.  
  63. int disc_destroy(int no)
  64. {
  65.     disc_type *prev, *current, *next;
  66.  
  67.     prev = disc_locate(no - 1);
  68.     current = prev->next;
  69.     if (prev == 0)
  70.     {
  71.         werr(0, "Disc %d does not exist (prev)!", no);
  72.         return 0;
  73.     }
  74.     if (current == 0)
  75.     {
  76.         werr(0, "Disc %d does not exist!", no);
  77.         return 0;
  78.     }
  79.     next = current->next;
  80.     if ((current->files != 0) && (current->no != 0)) heap_free(current->files);
  81.     heap_free(current);
  82.     prev->next = next;
  83.     records.no --;
  84.     return 1;
  85. }
  86.  
  87. disc_type *disc_locate(int no)
  88. {
  89.     int cnt;
  90.     disc_type *temp;
  91.  
  92.     if ((no >= records.no) || (no < 0))
  93.         werr(1, "Fatal error in disc_locate!");
  94.     temp = &records.discs;
  95.     for (cnt = 0; cnt < no; cnt ++)
  96.     {
  97.         temp = temp->next;
  98.         if (temp == 0) return 0;
  99.     }
  100.     return temp;
  101. }
  102.  
  103. void mem_free(void)
  104. {
  105.     int cnt;
  106.  
  107.     for (cnt = (records.no - 1); cnt >= 1; cnt --)
  108.         disc_destroy(cnt);
  109.     if ((records.discs.files != 0) && (records.discs.no != 0))
  110.         heap_free(records.discs.files);
  111.     memset(&records.discs, 0, sizeof(disc_type));
  112.     records.no = 1;
  113.     set_current_disc(0);
  114. }
  115.