home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 9 / FreshFishVol9-CD2.bin / bbs / disk / mkisofs-1.00.7.lha / mkisofs / hash.c < prev    next >
C/C++ Source or Header  |  1994-05-29  |  5KB  |  185 lines

  1. /*
  2.  * File hash.c - generate hash tables for iso9660 filesystem.
  3.  
  4.    Written by Eric Youngdale (1993).
  5.  
  6.    Copyright 1993 Yggdrasil Computing, Incorporated
  7.  
  8.    This program is free software; you can redistribute it and/or modify
  9.    it under the terms of the GNU General Public License as published by
  10.    the Free Software Foundation; either version 2, or (at your option)
  11.    any later version.
  12.  
  13.    This program is distributed in the hope that it will be useful,
  14.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.    GNU General Public License for more details.
  17.  
  18.    You should have received a copy of the GNU General Public License
  19.    along with this program; if not, write to the Free Software
  20.    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
  21.  
  22. #include <stdlib.h>
  23. #include "mkisofs.h"
  24.  
  25. #define NR_HASH 1024
  26.  
  27. #ifndef AMIGA
  28.  
  29. #define HASH_FN(DEV, INO) ((DEV + INO + (INO >> 2) + (INO << 8)) % NR_HASH)
  30.  
  31. static struct file_hash * hash_table[NR_HASH] = {0,};
  32.  
  33. void FDECL1(add_hash, struct directory_entry *, spnt){
  34.   struct file_hash * s_hash;
  35.   unsigned int hash_number;
  36.  
  37.   if(spnt->size == 0 || spnt->starting_block == 0) 
  38.     if(spnt->size != 0 || spnt->starting_block != 0) {
  39.       fprintf(stderr,"Non zero-length file assigned zero extent.\n");
  40.       exit(1);
  41.     };
  42.  
  43.   if (spnt->dev == UNCACHED_DEVICE || spnt->inode == UNCACHED_INODE) return;
  44.   hash_number = HASH_FN((unsigned int) spnt->dev, (unsigned int) spnt->inode);
  45.  
  46. #if 0
  47.   if (verbose) fprintf(stderr,"%s ",spnt->name);
  48. #endif
  49.   s_hash = (struct file_hash *) malloc(sizeof(struct file_hash));
  50.   s_hash->next = hash_table[hash_number];
  51.   s_hash->inode = spnt->inode;
  52.   s_hash->dev = spnt->dev;
  53.   s_hash->starting_block = spnt->starting_block;
  54.   s_hash->size = spnt->size;
  55.   hash_table[hash_number] = s_hash;
  56. }
  57.  
  58. struct file_hash * FDECL2(find_hash, dev_t, dev, ino_t, inode){
  59.   unsigned int hash_number;
  60.   struct file_hash * spnt;
  61.   hash_number = HASH_FN((unsigned int) dev, (unsigned int) inode);
  62.   if (dev == UNCACHED_DEVICE || inode == UNCACHED_INODE) return NULL;
  63.  
  64.   spnt = hash_table[hash_number];
  65.   while(spnt){
  66.     if(spnt->inode == inode && spnt->dev == dev) return spnt;
  67.     spnt = spnt->next;
  68.   };
  69.   return NULL;
  70. }
  71.  
  72. #endif
  73.  
  74. #ifndef AMIGA
  75.  
  76. static struct file_hash * directory_hash_table[NR_HASH] = {0,};
  77.  
  78. void FDECL2(add_directory_hash, dev_t, dev, ino_t, inode){
  79.   struct file_hash * s_hash;
  80.   unsigned int hash_number;
  81.  
  82.   if (dev == UNCACHED_DEVICE || inode == UNCACHED_INODE) return;
  83.   hash_number = HASH_FN((unsigned int) dev, (unsigned int) inode);
  84.  
  85.   s_hash = (struct file_hash *) malloc(sizeof(struct file_hash));
  86.   s_hash->next = directory_hash_table[hash_number];
  87.   s_hash->inode = inode;
  88.   s_hash->dev = dev;
  89.   directory_hash_table[hash_number] = s_hash;
  90. }
  91.  
  92. struct file_hash * FDECL2(find_directory_hash, dev_t, dev, ino_t, inode){
  93.   unsigned int hash_number;
  94.   struct file_hash * spnt;
  95.   hash_number = HASH_FN((unsigned int) dev, (unsigned int) inode);
  96.   if (dev == UNCACHED_DEVICE || inode == UNCACHED_INODE) return NULL;
  97.  
  98.   spnt = directory_hash_table[hash_number];
  99.   while(spnt){
  100.     if(spnt->inode == inode && spnt->dev == dev) return spnt;
  101.     spnt = spnt->next;
  102.   };
  103.   return NULL;
  104. }
  105.  
  106. #endif
  107.  
  108. struct  name_hash{
  109.     struct name_hash * next;
  110.     struct directory_entry * de;
  111. };
  112.  
  113. #define NR_NAME_HASH 128
  114.  
  115. static struct name_hash * name_hash_table[NR_NAME_HASH] = {0,};
  116.  
  117. static  unsigned int FDECL1(name_hash, const char *, name){
  118.     unsigned int hash = 0;
  119.     const char * p;
  120.  
  121.     p = name;
  122.  
  123.     while (*p) hash = (hash << 15) + (hash << 3) + (hash >> 3) + *p++;
  124.     return hash % NR_NAME_HASH;
  125.  
  126. }
  127.  
  128.  
  129. void FDECL1(add_file_hash, struct directory_entry *, de){
  130.     struct name_hash  * new;
  131.     int hash;
  132.  
  133.     new = (struct  name_hash *) malloc(sizeof(struct name_hash));
  134.     new->de = de;
  135.     new->next = NULL;
  136.     hash = name_hash(de->isorec.iso_name);
  137.  
  138.     /* Now insert into the hash table */
  139.     new->next = name_hash_table[hash];
  140.     name_hash_table[hash] = new;
  141. }
  142.  
  143. struct directory_entry * FDECL1(find_file_hash, char *, name){
  144.     struct name_hash  * nh;
  145.  
  146.     for(nh = name_hash_table[name_hash(name)]; nh; nh = nh->next)
  147.         if(strcmp(nh->de->isorec.iso_name, name) == 0) return nh->de;
  148.     return NULL;
  149. }
  150.  
  151. int FDECL1(delete_file_hash, struct directory_entry *, de){
  152.     struct name_hash  * nh, *prev;
  153.     int hash;
  154.  
  155.     prev = NULL;
  156.     hash = name_hash(de->isorec.iso_name);
  157.     for(nh = name_hash_table[hash]; nh; nh = nh->next) {
  158.         if(nh->de == de) break;
  159.         prev = nh;
  160.     };
  161.     if(!nh) return 1;
  162.     if(!prev)
  163.         name_hash_table[hash] = nh->next;
  164.     else
  165.         prev->next = nh->next;
  166.     free(nh);
  167.     return 0;
  168. }
  169.  
  170. void flush_file_hash(){
  171.     struct name_hash  * nh, *nh1;
  172.     int i;
  173.  
  174.     for(i=0; i<NR_NAME_HASH; i++) {
  175.         nh = name_hash_table[i];
  176.         while(nh) {
  177.             nh1 =  nh->next;
  178.             free(nh);
  179.             nh = nh1;
  180.         };
  181.         name_hash_table[i] =  NULL;
  182.         
  183.     };
  184. }
  185.