home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / games / tinymud2.zip / PLAYER_L.C < prev    next >
C/C++ Source or Header  |  1990-09-02  |  2KB  |  118 lines

  1. #ifdef PLAYER_LIST
  2.  
  3. #include "copyright.h"
  4.  
  5. #include "db.h"
  6. #include "config.h"
  7. #include "interface.h"
  8. #include "externs.h"
  9.  
  10. #include <ctype.h>
  11.  
  12. #define PLAYER_LIST_SIZE (1 << 12) /* must be a power of 2 */
  13.  
  14. static dbref hash_function_table[256];
  15. static int hft_initialized = 0;
  16.  
  17. #define DOWNCASE(x) (isupper(x) ? tolower(x) : (x))
  18.  
  19. static void init_hft(void)
  20. {
  21.     int i;
  22.  
  23.     for(i = 0; i < 256; i++) {
  24.     hash_function_table[i] = random() & (PLAYER_LIST_SIZE - 1);
  25.     }
  26.     hft_initialized = 1;
  27. }
  28.  
  29. static dbref hash_function(const char *string)
  30. {
  31.     dbref hash;
  32.  
  33.     if(!hft_initialized) init_hft();
  34.     hash = 0;
  35.     for(; *string; string++) {
  36.     hash ^= ((hash >> 1) ^ hash_function_table[DOWNCASE(*string)]);
  37.     }
  38.     return(hash);
  39. }
  40.  
  41. struct pl_elt {
  42.     dbref player;        /* pointer to player */
  43.                 /* key is db[player].name */
  44.     struct pl_elt *next;
  45. };
  46.  
  47. static struct pl_elt *player_list[PLAYER_LIST_SIZE];
  48. static int pl_used = 0;
  49.  
  50. void clear_players(void)
  51. {
  52.     int i;
  53.     struct pl_elt *e;
  54.     struct pl_elt *next;
  55.  
  56.     for(i = 0; i < PLAYER_LIST_SIZE; i++) {
  57.     if(pl_used) {
  58.         for(e = player_list[i]; e; e = next) {
  59.         next = e->next;
  60.         free((void *) e);
  61.         }
  62.     }
  63.     player_list[i] = 0;
  64.     }
  65.     pl_used = 1;
  66. }
  67.  
  68. void add_player(dbref player)
  69. {
  70.     dbref hash;
  71.     struct pl_elt *e;
  72.  
  73.     hash = hash_function(db[player].name);
  74.  
  75.     e = (struct pl_elt *) malloc(sizeof(struct pl_elt));
  76.     e->player = player;
  77.     e->next = player_list[hash];
  78.     player_list[hash] = e;
  79. }
  80.  
  81. dbref lookup_player(const char *name)
  82. {
  83.     struct pl_elt *e;
  84.  
  85.     for(e = player_list[hash_function(name)]; e; e = e->next) {
  86.     if(!string_compare(db[e->player].name, name)) return e->player;
  87.     }
  88.     return NOTHING;
  89. }
  90.  
  91. void delete_player(dbref player)
  92. {
  93.     dbref hash;
  94.     struct pl_elt *prev;
  95.     struct pl_elt *e;
  96.  
  97.     hash = hash_function(db[player].name);
  98.     if((e = player_list[hash]) == 0) {
  99.     return;
  100.     } else if(e->player == player) {
  101.     /* it's the first one */
  102.     player_list[hash] = e->next;
  103.     free((void *) e);
  104.     } else {
  105.     for(prev = e, e = e->next; e; prev = e, e = e->next) {
  106.         if(e->player == player) {
  107.         /* got it */
  108.         prev->next = e->next;
  109.         free((void *) e);
  110.         break;
  111.         }
  112.     }
  113.     }
  114. }
  115.  
  116. #endif /* PLAYER_LIST */
  117.  
  118.