home *** CD-ROM | disk | FTP | other *** search
/ DP Tool Club 24 / CD_ASCQ_24_0995.iso / vrac / ged2ht23.zip / INDEX.C < prev    next >
C/C++ Source or Header  |  1995-06-23  |  3KB  |  111 lines

  1. /*
  2.  * Copyright (c) 1995 Eugene W. Stark
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *    This product includes software developed by Eugene W. Stark.
  16.  * 4. The name of the author may not be used to endorse or promote products
  17.  *    derived from this software without specific prior written permission.
  18.  * 5. No copying or redistribution in any form for commercial purposes is
  19.  *    permitted without specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY EUGENE W. STARK (THE AUTHOR) ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
  25.  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  26.  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  27.  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  */
  33.  
  34. /*
  35.  * XREF ID --> pointer index routines
  36.  *
  37.  * If too much time is being spent in this code, replace it with something
  38.  * more sophisticated.
  39.  */
  40.  
  41. #include <stdio.h>
  42. #include <stdlib.h>
  43. #include <string.h>
  44. #include "index.h"
  45.  
  46. #ifndef HAVE_STRDUP
  47. char *strdup(const char *s);
  48. #endif
  49.  
  50. struct ientry {
  51.   char *id;
  52.   void *value;
  53.   struct ientry *next;
  54. };
  55.  
  56. void out_of_memory();
  57.  
  58. #define HASHSIZE 5003
  59. #define HASHMULT 251
  60.  
  61. struct ientry *hashtab[HASHSIZE];
  62.  
  63. int hash(char *id)
  64. {
  65.   unsigned int h = 0;
  66.   while(*id) {
  67.     h = (h * HASHMULT) + *id;
  68.     id++;
  69.   }
  70.   return(h % HASHSIZE);
  71. }
  72.  
  73. int index_enter(char *id, void *value)
  74. {
  75.   int h;
  76.   struct ientry *ip, *pip, *new;
  77.  
  78.   h = hash(id);
  79.   for(ip = hashtab[h], pip = NULL; ip != NULL; pip = ip, ip = ip->next) {
  80.     if(!strcmp(ip->id, id)) {
  81.       fprintf(stderr, "Multiply defined cross-reference ID: %s\n", id);
  82.       return(-1);
  83.     }
  84.   }
  85.   if((new = malloc(sizeof(struct ientry))) == NULL)
  86.     out_of_memory();
  87.   if((new->id = strdup(id)) == NULL)
  88.     out_of_memory();
  89.   new->value = value;
  90.   new->next = NULL;
  91.   if(pip == NULL) {
  92.     hashtab[h] = new;
  93.   } else {
  94.     pip->next = new;
  95.   }
  96.   return(0);
  97. }
  98.  
  99. void *index_find(char *id)
  100. {
  101.   int h;
  102.   struct ientry *ip;
  103.  
  104.   h = hash(id);
  105.   for(ip = hashtab[h]; ip != NULL; ip = ip->next) {
  106.     if(!strcmp(ip->id, id))
  107.       return(ip->value);
  108.   }
  109.   return(NULL);
  110. }
  111.