home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / exampleCode / viewkit / xcontact / parody / node.c++ < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-02  |  3.1 KB  |  142 lines

  1. // ----------- node.c++
  2.  
  3. // =======================================
  4. // Parody file Node class member functions
  5. // =======================================
  6.  
  7. #include <unistd.h>
  8. #include <stdio.h>
  9.  
  10. #include "parody.h"
  11.  
  12. // -------- construct a file header
  13. FileHeader::FileHeader(pString filename)
  14. {
  15.     deletednode = highestnode = 0;
  16.     newfile = (pBool) (access(filename, 0) != 0);
  17.     // ----- open the file
  18.     nfile.open(filename, ios::in | ios::out);
  19.     if (!newfile)    {
  20.         // ------- read the header
  21.         nfile.read((char *)&highestnode, sizeof highestnode);
  22.         nfile.read((char *)&deletednode, sizeof deletednode);
  23.         nfile.seekp(nfile.tellg());
  24.     }
  25.     else    {
  26.         // ------- write the header
  27.         nfile.write((char *)&highestnode, sizeof highestnode);
  28.         nfile.write((char *)&deletednode, sizeof deletednode);
  29.         nfile.seekg(nfile.tellp());
  30.     }
  31.     origdeletednode = deletednode;
  32.     orighighestnode = highestnode;
  33. }
  34.  
  35. FileHeader::~FileHeader()
  36. {
  37.     if (deletednode != origdeletednode ||
  38.             highestnode != orighighestnode)    {
  39.         // ---- the file header has changed
  40.         nfile.seekp(0);
  41.         nfile.write((char *)&highestnode, sizeof highestnode);
  42.         nfile.write((char *)&deletednode, sizeof deletednode);
  43.     }
  44.     nfile.close();
  45. }
  46.  
  47. void
  48. FileHeader::Flush()
  49. {
  50.     if (deletednode != origdeletednode ||
  51.             highestnode != orighighestnode)    {
  52.         // ---- the file header has changed
  53.         nfile.seekp(0);
  54.         nfile.write((char *)&highestnode, sizeof highestnode);
  55.         nfile.write((char *)&deletednode, sizeof deletednode);
  56.     }
  57.     nfile.flush();
  58. }
  59.  
  60. // ------- appropriate a new node
  61. NodeNbr FileHeader::NewNode()
  62. {
  63.     NodeNbr newnode;
  64.     if (deletednode)    {
  65.         newnode = deletednode;
  66.         Node node(this, newnode);
  67.         deletednode = node.NextNode();
  68.         node.SetNextNode(0);
  69.     }
  70.     else
  71.         newnode = ++highestnode;
  72.     return newnode;
  73. }
  74.  
  75. // ----------- construct a new node
  76. Node::Node(FileHeader *hd, NodeNbr node)
  77. {
  78.     nextnode = 0;
  79.     nodechanged = deletenode = pFalse;
  80.     nodenbr = node;
  81.     owner = hd;
  82.     if (nodenbr)    {
  83.         fstream& nf = owner->Nfile();
  84.  
  85.         long nad = NodeAddress();
  86.         nf.seekg(nad);
  87.         // ------- read the header
  88.         nf.read((char *) &nextnode, sizeof nextnode);
  89.         nf.seekp(nf.tellg());
  90.  
  91.         if (nf.eof() || nf.fail())    {
  92.             nf.clear();
  93.             // ----- appending a new node
  94.             nf.seekp(nad);
  95.             nf.write((char *) &nextnode, sizeof nextnode);
  96.             nf.seekg(nf.tellp());
  97.         }
  98.     }
  99. }
  100.  
  101. // ------- assignment operator
  102. Node& Node::operator=(Node &node)
  103. {
  104.     nextnode = node.nextnode;
  105.     owner = node.owner;
  106.     nodenbr = node.nodenbr;
  107.     nodechanged = node.nodechanged;
  108.     deletenode = node.deletenode;
  109.     return *this;
  110. }    
  111.  
  112. // ------- destroy the node
  113. Node::~Node()
  114. {
  115.     if (owner && nodenbr && (nodechanged || deletenode))    {
  116.         fstream& nf = owner->Nfile();
  117.         if (deletenode)    {
  118.             nextnode = owner->DeletedNode();
  119.             owner->SetDeletedNode(nodenbr);
  120.         }
  121.         nf.seekp(NodeAddress());
  122.         // ------- write the header
  123.         nf.write((char *) &nextnode, sizeof nextnode);
  124.         if (deletenode)    {
  125.             // ------ zero fill the deleted node
  126.             char fill[nodedatalength];
  127.             memset(fill, 0, nodedatalength);
  128.             nf.write(fill, nodedatalength);
  129.         }
  130.         nf.sync();
  131.     }
  132. }
  133.  
  134. // ---------- compute the disk address of a node
  135. long Node::NodeAddress()
  136. {
  137.     long adr = nodenbr-1;
  138.     adr *= nodelength;
  139.     adr += fileheadersize;
  140.     return adr;
  141. }
  142.