/* ptable.c */ #include "config.h" /* * This file is part of TeenyMUD II. * Copyright(C) 1993, 1994, 1995 by Jason Downs. * All rights reserved. * * TeenyMUD II is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * TeenyMUD II is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program (see the file 'COPYING'); if not, write to * the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, * MA 02111-1307, USA. * */ #include <stdio.h> #include <sys/types.h> #include "conf.h" #include "teeny.h" #include "teenydb.h" #include "ptable.h" #include "externs.h" #include "hash/hash.h" /* internal player name lookups */ static Hash_Table phash_num; static Hash_Table phash_name; static Hash_Table phash_alias; static int phash_inited = 0; void ptable_add(num, name) int num; char *name; { register Hash_Entry *new1, *new2; if (name == (char *) NULL) return; /* fuck you, too */ if (!phash_inited) { Hash_InitTable(&phash_name, 0, HASH_STRCASE_KEYS); Hash_InitTable(&phash_alias, 0, HASH_STRCASE_KEYS); Hash_InitTable(&phash_num, 0, HASH_ONE_WORD_KEYS); phash_inited = 1; } /* add to name table */ new1 = Hash_CreateEntry(&phash_name, name, NULL); Hash_SetValue(new1, (int *) num); /* add to num table */ new2 = Hash_CreateEntry(&phash_num, (char *) num, NULL); Hash_SetValue(new2, (int *) Hash_GetKey(&phash_name, new1)); } #if defined(__STDC__) void ptable_alias(int num, char *alias, enum palias_flags flag) #else void ptable_alias(num, alias, flag) int num; char *alias; enum palias_flags flag; #endif { register Hash_Entry *newa; if (!phash_inited) { Hash_InitTable(&phash_name, 0, HASH_STRCASE_KEYS); Hash_InitTable(&phash_alias, 0, HASH_STRCASE_KEYS); Hash_InitTable(&phash_num, 0, HASH_ONE_WORD_KEYS); phash_inited = 1; } if(flag == PTABLE_UNALIAS) { newa = Hash_FindEntry(&phash_alias, alias); if(newa != (Hash_Entry *)NULL) Hash_DeleteEntry(&phash_alias, newa); } else { /* add it in. */ newa = Hash_CreateEntry(&phash_alias, alias, NULL); Hash_SetValue(newa, (int *) num); } } void ptable_delete(num) int num; { register Hash_Entry *entry1, *entry2; register char *name; if (!phash_inited) return; if ((entry1 = Hash_FindEntry(&phash_num, (char *) num))) { name = (char *)Hash_GetValue(entry1); if ((entry2 = Hash_FindEntry(&phash_name, name))) Hash_DeleteEntry(&phash_name, entry2); Hash_DeleteEntry(&phash_num, entry1); } } char *ptable_lookup(num) int num; { register Hash_Entry *entry; if (phash_inited) { if ((entry = Hash_FindEntry(&phash_num, (char *) num))) return ((char *) Hash_GetValue(entry)); } return ((char *) NULL); } int match_player(name) char *name; { register Hash_Entry *entry; if (phash_inited) { if ((entry = Hash_FindEntry(&phash_name, name))) return ((int) Hash_GetValue(entry)); if ((entry = Hash_FindEntry(&phash_alias, name))) return ((int) Hash_GetValue(entry)); } return(-1); } void ptable_init() { register struct obj_data *obj; register int i; register int total; int aflags; char *alias; if (phash_inited) return; for (i = 0, total = 0; i < mudstat.total_objects; i++) { if (main_index[i] == (struct dsc *) NULL) continue; if (DSC_TYPE(main_index[i]) == TYP_PLAYER) total++; } if (total == 0) /* BUH? */ return; Hash_InitTable(&phash_name, total, HASH_STRCASE_KEYS); Hash_InitTable(&phash_alias, total, HASH_STRCASE_KEYS); Hash_InitTable(&phash_num, total, HASH_ONE_WORD_KEYS); phash_inited = 1; for (i = 0; i < mudstat.total_objects; i++) { if (main_index[i] == (struct dsc *) NULL) continue; if (DSC_TYPE(main_index[i]) == TYP_PLAYER) { if ((obj = lookup_obj(i)) != (struct obj_data *) NULL) { ptable_add(i, obj->name); if(attr_get(i, ALIAS, &alias, &aflags) != -1) { if((alias != (char *)NULL) && alias[0]) ptable_alias(i, alias, 0); } cache_trim(); } } } }