/* help.c */
#include "copyright.h"
/* commands for giving help */
#include <stdio.h>
#ifdef WANT_ANSI
#ifdef __STDC__
#include <stddef.h>
#include <unistd.h>
#endif /* __STDC__ */
#endif /* WANT_ANSI */
#include <string.h>
#include "mudconf.h"
#include "config.h"
#include "db.h"
#include "interface.h"
#include "externs.h"
#include "help.h"
void spit_file(dbref player, const char *filename)
{
FILE *f;
char *buf, *fname, *p;
fname = alloc_mbuf("spit_file.fname");
strcpy(fname, FILEDIR);
strcat(fname, filename);
close(mudstate.reserved_fileid);
if ((f = fopen(fname, "r")) == NULL) {
notify(player, tprintf("Sorry, %s is unavailable.", fname));
STARTLOG(LOG_PROBLEMS,"HLP","OPEN")
buf = alloc_lbuf("spit_file.LOG.open");
sprintf(buf, "Can't open %s for reading.", fname);
log_text(buf);
free_lbuf(buf);
ENDLOG
} else {
buf = alloc_lbuf("spit_file.buf");
while (fgets(buf, LBUF_SIZE - 1, f)) {
for (p = buf; *p; p++)
if (*p == '\n') {
*p = '\0';
break;
}
notify(player, buf);
}
fclose(f);
free_lbuf(buf);
}
free_mbuf(fname);
mudstate.reserved_fileid = open(DEV_NULL, O_RDWR, 0);
}
/*
* Cat file 'filename' to player 'destplayer'. (If destplayer==NULL, cat the
* file to 'player'.)
*/
void do_cat(dbref player, dbref cause, int key, char *filename, char *dest)
{
dbref player2;
if (dest && *dest) {
player2 = lookup_player(player, dest, 1);
if (player2 == NOTHING) {
notify(player, "I couldn't find that player.");
return;
} else
player = player2;
}
if (!strchr(filename, '/') && !strchr(filename, '\\'))
spit_file(player, filename);
}
int helpindex_read (HASHTAB *htab, char *filename)
{
help_indx entry;
char *p;
int count;
FILE *fp;
hashflush(htab, 0);
close(mudstate.reserved_fileid);
if ((fp = fopen(filename, "r")) == NULL) {
STARTLOG(LOG_PROBLEMS,"HLP","RDINDX")
p = alloc_lbuf("helpindex_read.LOG");
sprintf(p, "Can't open %s for reading.", filename);
log_text(p);
free_lbuf(p);
ENDLOG
mudstate.reserved_fileid = open(DEV_NULL, O_RDWR, 0);
return -1;
}
count = 0;
while ((fread(&entry, sizeof(help_indx), 1, fp)) == 1) {
/* Lowercase the entry and add all leftmost substrings.
* Substrings already added will be rejected by hashadd.
*/
for (p=entry.topic; *p; p++) *p = ToLower(*p);
while (p>entry.topic) {
p--;
if (!isspace(*p))
if ((hashadd(entry.topic, (int *)entry.pos, htab)) == 0)
count++;
*p = '\0';
}
}
fclose(fp);
mudstate.reserved_fileid = open(DEV_NULL, O_RDWR, 0);
hashreset(htab);
return count;
}
void helpindex_load(dbref player)
{
int news, help, whelp;
news = helpindex_read(&mudstate.news_htab, mudconf.news_indx);
help = helpindex_read(&mudstate.help_htab, mudconf.help_indx);
whelp = helpindex_read(&mudstate.wizhelp_htab, mudconf.whelp_indx);
if ((player != NOTHING) && !Quiet(player))
notify(player,
tprintf("Index entries: News...%d Help...%d Wizhelp...%d",
news, help, whelp));
}
void helpindex_init()
{
hashinit(&mudstate.news_htab, 17);
hashinit(&mudstate.help_htab, 37);
hashinit(&mudstate.wizhelp_htab, 37);
helpindex_load(NOTHING);
}
void help_write(dbref player, char *topic, HASHTAB *htab, char *filename)
{
FILE *fp;
char *p, *line;
int offset;
if (*topic == '\0')
topic = (char *) "help";
else
for (p=topic; *p; p++) *p = ToLower(*p);
offset = (int)hashfind(topic, htab);
if (offset <= 0) {
notify(player, tprintf("No entry for '%s'.", topic));
return;
}
close(mudstate.reserved_fileid);
if ((fp = fopen(filename, "r")) == NULL) {
notify(player,
"Sorry, that function is temporarily unavailable.");
STARTLOG(LOG_PROBLEMS,"HLP","OPEN")
line = alloc_lbuf("help_write.LOG.open");
sprintf(line, "Can't open %s for reading.", filename);
log_text(line);
free_lbuf(line);
ENDLOG
mudstate.reserved_fileid = open(DEV_NULL, O_RDWR, 0);
return;
}
if (fseek(fp, offset, 0) < 0L) {
notify(player,
"Sorry, that function is temporarily unavailable.");
STARTLOG(LOG_PROBLEMS,"HLP","SEEK")
line = alloc_lbuf("help_write.LOG.seek");
sprintf(line, "Seek error in file %s.", filename);
log_text(line);
free_lbuf(line);
ENDLOG
fclose(fp);
mudstate.reserved_fileid = open(DEV_NULL, O_RDWR, 0);
return;
}
line = alloc_lbuf("help_write");
for (;;) {
if (fgets(line, LBUF_SIZE - 1, fp) == NULL)
break;
if (line[0] == '&')
break;
for (p = line; *p != '\0'; p++)
if (*p == '\n')
*p = '\0';
notify(player, line);
}
free_lbuf(line);
fclose(fp);
mudstate.reserved_fileid = open(DEV_NULL, O_RDWR, 0);
}
/* ---------------------------------------------------------------------------
* do_help: display information from new-format news and help files
*/
void do_help(dbref player, dbref cause, int key, char *message)
{
char *buf;
switch (key) {
case HELP_HELP:
help_write(player, message, &mudstate.help_htab,
mudconf.help_file);
break;
case HELP_NEWS:
help_write(player, message, &mudstate.news_htab,
mudconf.news_file);
break;
case HELP_WIZHELP:
help_write(player, message, &mudstate.wizhelp_htab,
mudconf.whelp_file);
break;
default:
STARTLOG(LOG_BUGS,"BUG","HELP")
buf = alloc_mbuf("do_help.LOG");
sprintf(buf, "Unknown help file number: %d", key);
log_text(buf);
free_mbuf(buf);
ENDLOG
}
}