home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_300 / 308_01 / disklist.cpp < prev    next >
C/C++ Source or Header  |  1990-09-22  |  4KB  |  172 lines

  1.  
  2. /*
  3.     TITLE:        Class DiskList;
  4.     DESCRIPTION:    "C++ doubly-linked list with run-time
  5.             data storage on disk";
  6.  
  7.     VERSION:        1.01;
  8.     DATE:           9/22/90;
  9.     COMPILERS:      Borland Turbo C++ V.1.0;
  10.     KEYWORDS:    linked list disk;
  11.     FILENAME:    DiskList.cpp;
  12.     SEE-ALSO:    DiskList.hpp;
  13.  
  14.     AUTHOR:         Michael Kelly
  15.             254 Gold St. Boston, Ma. 02127
  16.             Copyright 1990;
  17.  
  18.     COPYRIGHT:    This code may not be commercially distributed
  19.             without prior arrangement with the author.  It
  20.             may be used by programmers, without royalty, for
  21.             their personal programs and for "one of a kind"
  22.             or "custom" applications, provided that said
  23.             programmers assume all liability concerning
  24.             same.
  25. */
  26.  
  27.  
  28. #include "disklist.hpp"
  29.  
  30.  
  31.  
  32. int dl_compare(void *c1, void *c2)
  33. {
  34.     return strcmp((const char *)c1, (const char *)c2);
  35. }
  36.  
  37. int DiskList::compare(void *item1, void *item2)
  38. {
  39.     int     dif;
  40.     void     *buf1, *buf2;
  41.     DiskLink     *d1 = (DiskLink *) item1,
  42.         *d2 = (DiskLink *) item2;
  43.  
  44.     buf1 = new char[d1->itemsize];
  45.     if(! buf1)  {
  46.     lerror = NO_MEM;
  47.     return 0;
  48.     }
  49.     buf2 = new char[d2->itemsize];
  50.     if(! buf2)  {
  51.     delete buf1;
  52.     lerror = NO_MEM;
  53.     return 0;
  54.     }
  55.  
  56.     if((fseek(fp, d1->item_offset, SEEK_SET))  ||
  57.        (fread(buf1, d1->itemsize, 1, fp) != 1)      ||
  58.        (fseek(fp, d2->item_offset, SEEK_SET))  ||
  59.        (fread(buf2, d2->itemsize, 1, fp) != 1))
  60.     {
  61.     delete buf2;
  62.     delete buf1;
  63.     err_exit("Error reading temporary file");
  64.     }
  65.  
  66.     dif = dl_compare(buf1, buf2);
  67.     delete buf2;
  68.     delete buf1;
  69.     return dif;
  70. }
  71.  
  72. DiskList::DiskList(void)
  73. {
  74.     fp = tmpfile();
  75.     if(! fp)
  76.     err_exit("Cannot create temporary file");
  77. }
  78.  
  79. DiskList::~DiskList(void)
  80. {
  81.     if(fp)
  82.     fclose(fp);
  83. }
  84.  
  85. Boolean DiskList::add_item(void *item, size_t itemsize, Place place)
  86. {
  87.     DiskLink tmplink;
  88.  
  89.     if(fseek(fp, 0L, SEEK_END))
  90.     return False;
  91.     tmplink.dl_id = DL_ID;
  92.     tmplink.item_offset = ftell(fp);
  93.     tmplink.itemsize = itemsize;
  94.     if(! DoubleList::add_item(&tmplink, sizeof(DiskLink), place))
  95.     return False;
  96.     if(fwrite(item, itemsize, 1, fp) != 1)  {
  97.     DoubleList::delete_item();
  98.     return False;
  99.     }
  100.     fflush(fp);
  101.     return True;
  102. }
  103.  
  104. Boolean DiskList::get_item(void *itembuf)
  105. {
  106.     DiskLink this_link;
  107.  
  108.     if(! DoubleList::get_item(&this_link))
  109.     return False;
  110.     if(fseek(fp, this_link.item_offset, SEEK_SET))
  111.     return False;
  112.     if(fread(itembuf, this_link.itemsize, 1, fp) != 1)
  113.     return False;
  114.  
  115.     return True;
  116. }
  117.  
  118. size_t DiskList::get_size(void)
  119. {
  120.     DiskLink this_link;
  121.  
  122.     if(! DoubleList::get_item(&this_link))
  123.     return 0;
  124.     return this_link.itemsize;
  125. }
  126.  
  127. int DiskList::compare_item(void *item1)
  128. {
  129.     void *item2;
  130.     DiskLink this_link;
  131.     int dif;
  132.  
  133.     if(! DoubleList::get_item(&this_link))
  134.     return False;
  135.     if(! (item2 = new char[this_link.itemsize]))  {
  136.     lerror = NO_MEM;
  137.     return False;
  138.     }
  139.     if(! get_item(item2))  {
  140.     delete item2;
  141.     return False;
  142.     }
  143.     dif = dl_compare(item1, item2);
  144.     delete item2;
  145.     return dif;
  146. }
  147.  
  148. Boolean DiskList::remove_item(void *itembuf)
  149. {
  150.     DiskLink *tmplink;
  151.     Boolean on_disk = False;
  152.  
  153.     if(! entries)
  154.     return False;
  155.  
  156.     if(Current->entry->itemsize == sizeof(DiskLink))  {
  157.     tmplink = (DiskLink *)Current->entry->item;
  158.     if(tmplink->dl_id == DL_ID)
  159.         on_disk = True;
  160.     }
  161.  
  162.     if(on_disk)  {
  163.     DiskList::get_item(itembuf);
  164.     return DoubleList::delete_item();
  165.     }
  166.  
  167.     return DoubleList::remove_item(itembuf);
  168. }
  169.  
  170.  
  171.  
  172.