Removed a LOG_LOG message.
[idzebra-moved-to-github.git] / bfile / cfile.c
index 284de86..a6390c2 100644 (file)
@@ -4,7 +4,18 @@
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: cfile.c,v $
- * Revision 1.5  1995-12-08 16:21:14  adam
+ * Revision 1.8  1995-12-15 12:36:52  adam
+ * Moved hash file information to union.
+ * Renamed commit files.
+ *
+ * Revision 1.7  1995/12/15  10:35:07  adam
+ * Changed names of commit files.
+ *
+ * Revision 1.6  1995/12/11  09:03:53  adam
+ * New function: cf_unlink.
+ * New member of commit file head: state (0) deleted, (1) hash file.
+ *
+ * Revision 1.5  1995/12/08  16:21:14  adam
  * Work on commit/update.
  *
  * Revision 1.4  1995/12/01  16:24:28  adam
@@ -31,7 +42,7 @@
 
 static int write_head (CFile cf)
 {
-    int left = cf->head.hash_size * sizeof(int);
+    int left = cf->head.u.hash.hash_size * sizeof(int);
     int bno = 1;
     const char *tab = (char*) cf->array;
 
@@ -48,7 +59,7 @@ static int write_head (CFile cf)
 
 static int read_head (CFile cf)
 {
-    int left = cf->head.hash_size * sizeof(int);
+    int left = cf->head.u.hash.hash_size * sizeof(int);
     int bno = 1;
     char *tab = (char*) cf->array;
 
@@ -73,32 +84,34 @@ CFile cf_open (MFile mf, MFile_area area, const char *fname,
     int hash_bytes;
    
     cf->rmf = mf; 
-    sprintf (path, "%s.b", fname);
+    sprintf (path, "%s-b", fname);
     if (!(cf->block_mf = mf_open (area, path, block_size, wflag)))
     {
         logf (LOG_FATAL|LOG_ERRNO, "Failed to open %s", path);
         exit (1);
     }
-    sprintf (path, "%s.h", fname);
+    sprintf (path, "%s-i", fname);
     if (!(cf->hash_mf = mf_open (area, path, HASH_BSIZE, wflag)))
     {
         logf (LOG_FATAL|LOG_ERRNO, "Failed to open %s", path);
         exit (1);
     }
-    if (!firstp || !mf_read (cf->hash_mf, 0, 0, sizeof(cf->head), &cf->head))
+    assert (firstp);
+    if (!mf_read (cf->hash_mf, 0, 0, sizeof(cf->head), &cf->head) ||
+        !cf->head.state)
     {
-        if (firstp)
-            *firstp = 1;
-        cf->head.block_size = block_size;
-        cf->head.hash_size = 401;
-        hash_bytes = cf->head.hash_size * sizeof(int);
-        cf->head.next_bucket =
+        *firstp = 1;
+        cf->head.state = 1;
+        cf->head.u.hash.block_size = block_size;
+        cf->head.u.hash.hash_size = 401;
+        hash_bytes = cf->head.u.hash.hash_size * sizeof(int);
+        cf->head.u.hash.next_bucket =
             (hash_bytes+sizeof(cf->head))/HASH_BSIZE + 2;
-        cf->head.next_block = 1;
+        cf->head.u.hash.next_block = 1;
         if (wflag)
             mf_write (cf->hash_mf, 0, 0, sizeof(cf->head), &cf->head);
         cf->array = xmalloc (hash_bytes);
-        for (i = 0; i<cf->head.hash_size; i++)
+        for (i = 0; i<cf->head.u.hash.hash_size; i++)
             cf->array[i] = 0;
         if (wflag)
             write_head (cf);
@@ -106,28 +119,28 @@ CFile cf_open (MFile mf, MFile_area area, const char *fname,
     else
     {
         *firstp = 0;
-        assert (cf->head.block_size == block_size);
-        assert (cf->head.hash_size > 2 && cf->head.hash_size < 200000);
-        hash_bytes = cf->head.hash_size * sizeof(int);
-        assert (cf->head.next_bucket > 0);
+        assert (cf->head.u.hash.block_size == block_size);
+        assert (cf->head.u.hash.hash_size > 2);
+        hash_bytes = cf->head.u.hash.hash_size * sizeof(int);
+        assert (cf->head.u.hash.next_bucket > 0);
         cf->array = xmalloc (hash_bytes);
         read_head (cf);
     }
-    cf->parray = xmalloc (cf->head.hash_size * sizeof(*cf->parray));
-    for (i = 0; i<cf->head.hash_size; i++)
+    cf->parray = xmalloc (cf->head.u.hash.hash_size * sizeof(*cf->parray));
+    for (i = 0; i<cf->head.u.hash.hash_size; i++)
         cf->parray[i] = NULL;
     cf->bucket_lru_front = cf->bucket_lru_back = NULL;
     cf->bucket_in_memory = 0;
     cf->max_bucket_in_memory = 400;
     cf->dirty = 0;
-    cf->iobuf = xmalloc (cf->head.block_size);
-    memset (cf->iobuf, 0, cf->head.block_size);
+    cf->iobuf = xmalloc (cf->head.u.hash.block_size);
+    memset (cf->iobuf, 0, cf->head.u.hash.block_size);
     return cf;
 }
 
 static int cf_hash (CFile cf, int no)
 {
-    return (no>>3) % cf->head.hash_size;
+    return (no>>3) % cf->head.u.hash.hash_size;
 }
 
 static void release_bucket (CFile cf, struct CFile_hash_bucket *p)
@@ -215,7 +228,7 @@ static struct CFile_hash_bucket *new_bucket (CFile cf, int *block_no, int hno)
     struct CFile_hash_bucket *p;
     int i;
 
-    *block_no = cf->head.next_bucket++;
+    *block_no = cf->head.u.hash.next_bucket++;
     p = alloc_bucket (cf, *block_no, hno);
 
     for (i = 0; i<HASH_BUCKET; i++)
@@ -264,7 +277,7 @@ int cf_new (CFile cf, int no)
     struct CFile_hash_bucket *hbprev = NULL, *hb = cf->parray[hno];
     int *bucketpp = &cf->array[hno];
     int i;
-    int vno = (cf->head.next_block)++;
+    int vno = (cf->head.u.hash.next_block)++;
     
     for (hb = cf->parray[hno]; hb; hb = hb->h_next)
         if (!hb->ph.vno[HASH_BUCKET-1])