/*
* aliases.c
*/
#include <ctype.h>
#include <string.h>
#include <malloc.h>
#include <fcntl.h>
#include <memory.h>
#include "config.h"
#include "player.h"
#include "fix.h"
/* externs */
extern char *upper_from_saved(saved_player * sp);
extern char *check_legal_entry(player *, char *, int);
extern char *store_string(), *store_int();
extern char *get_string(), *get_int();
extern char *gstring_possessive(), *end_string(), *next_space();
extern player *find_player_global_quiet(char *), *find_player_global(char *);
extern player *find_player_absolute_quiet(char *);
extern saved_player *find_saved_player(char *);
extern void log(char *, char *);
extern char *number2string(int);
extern char *full_name(player *);
extern char *get_gender_string(player *);
extern void save_player(player *);
extern void pager(player *, char *, int);
extern int global_tag(player *, char *);
extern void cleanup_tag(player **, int);
extern saved_player **saved_hash[];
int strnomatch(char *, char *, int);
/* delete and entry from someones list */
void delete_entry_alias(saved_player * sp, alias * l)
{
alias *scan;
if (!sp)
return;
scan = sp->alias_top;
if (scan == l)
{
sp->alias_top = l->next;
FREE(l);
return;
}
while (scan)
if (scan->next == l)
{
scan->next = l->next;
FREE(l);
return;
} else
scan = scan->next;
log("error", "Tried to delete alias that wasn't there.\n");
}
/* compress list */
void tmp_comp_alias(saved_player * sp)
{
char *oldstack;
alias *l, *next;
l = sp->alias_top;
oldstack = stack;
stack = store_int(stack, 0);
while (l)
{
next = l->next;
if (!l->cmd[0])
{
log("error", "Bad list entry on compress .. auto deleted.\n");
delete_entry_alias(sp, l);
} else
{
stack = store_string(stack, l->cmd);
stack = store_string(stack, l->sub);
}
l = next;
}
store_int(oldstack, ((int) stack - (int) oldstack));
}
/* */
void compress_alias(saved_player * sp)
{
char *oldstack;
int length;
alias *new, *l, *next;
if (sp->system_flags & COMPRESSED_ALIAS)
return;
sp->system_flags |= COMPRESSED_ALIAS;
oldstack = stack;
tmp_comp_alias(sp);
length = (int) stack - (int) oldstack;
if (length == 4)
{
sp->alias_top = 0;
stack = oldstack;
return;
}
new = (alias *) MALLOC(length);
memcpy(new, oldstack, length);
l = sp->alias_top;
while (l)
{
next = l->next;
FREE(l);
l = next;
}
sp->alias_top = new;
stack = oldstack;
}
/* decompress list */
void decompress_alias(saved_player * sp)
{
alias *l;
char *old, *end, *start;
int length;
if (!(sp->system_flags & COMPRESSED_ALIAS))
return;
sp->system_flags &= ~COMPRESSED_ALIAS;
old = (char *) sp->alias_top;
start = old;
if (!old)
return;
old = get_int(&length, old);
end = old + length - 4;
sp->alias_top = 0;
while (old < end)
{
l = (alias *) MALLOC(sizeof(alias));
old = get_string(stack, old);
strncpy(l->cmd, stack, MAX_NAME - 3);
old = get_string(stack, old);
strncpy(l->sub, stack, MAX_DESC - 3);
l->next = sp->alias_top;
sp->alias_top = l;
}
FREE(start);
}
/* save list */
void construct_alias_save(saved_player * sp)
{
int length;
char *where;
if (!(sp->system_flags & COMPRESSED_ALIAS) &&
(!find_player_absolute_quiet(sp->lower_name)))
compress_alias(sp);
if (sp->system_flags & COMPRESSED_ALIAS)
{
if (sp->alias_top)
{
where = (char *) sp->alias_top;
(void) get_int(&length, where);
memcpy(stack, where, length);
stack += length;
} else
stack = store_int(stack, 4);
} else
tmp_comp_alias(sp);
}
/* retrieve list */
char *retrieve_alias_data(saved_player * sp, char *where)
{
int length;
(void) get_int(&length, where);
if (length == 4)
sp->alias_top = 0;
else
{
sp->system_flags |= COMPRESSED_ALIAS;
sp->alias_top = (alias *) MALLOC(length);
memcpy(sp->alias_top, where, length);
}
where += length;
return where;
}
/* count list entries */
int count_alias(player * p)
{
alias *l;
int count = 0;
if (!p->saved)
return 0;
if (!p->saved->alias_top)
return 0;
for (l = p->saved->alias_top; l; l = l->next)
count++;
return count;
}
/* find list entry for a person */
alias *find_alias_entry(player * p, char *name)
{
alias *l;
if (!p->saved)
return 0;
decompress_alias(p->saved);
l = p->saved->alias_top;
while (l)
if (!strcasecmp(l->cmd, name))
return l;
else
l = l->next;
return 0;
}
char *do_alias_match(player * p, char *str)
{
char *t;
alias *scan;
int g;
if (!p->saved)
return "\n";
scan = p->saved->alias_top;
while (scan) {
g = 1;
if (strnomatch(scan->cmd, str, 0))
g=0;
if (g) {
while (*str && *str != ' ')
str++;
while (*str && isspace(*str))
str++;
return str;
}
scan = scan->next;
}
return "\n";
}
alias *get_alias(player * p, char *str)
{
char *t;
alias *scan;
int g;
if (!p->saved)
return 0;
scan = p->saved->alias_top;
while (scan) {
g = 1;
if (strnomatch(scan->cmd, str, 0))
g=0;
if (g) {
return scan;
}
scan = scan->next;
}
return 0;
}
int strnomatch(char *str1, char *str2, int unanal) {
char *s1p, *s2p;
s1p = str1;
s2p = str2;
for (;*s1p;s1p++,s2p++) {
if (unanal && *s1p != *s2p)
return 1;
else
if (tolower(*s1p) != tolower(*s2p))
return 1;
}
if (!unanal && *s2p && (!isspace(*s2p)))
return 1;
return 0;
}