/* help.c */
/* $Id: help.c,v 1.11 1993/09/18 19:03:41 nils Exp $ */
#include <stdio.h>
/* commands for giving help */
#include "db.h"
#include "config.h"
#include "interface.h"
#include "externs.h"
#include "help.h"
#ifdef sun
#include <errno.h>
#else
#include <sys/errno.h>
#endif
void spit_file(player,filename,ff)
dbref player;
char *filename;
FILE *ff;
{
FILE *f;
char buf[BUFFER_LEN];
char *p;
if((filename!=NULL)?((f = fopen(filename, "r")) == NULL):((f=ff)==NULL)) {
if(filename)
sprintf(buf, "Sorry, %s is broken. Management has been notified.",
filename);
else
strcpy(buf,"Sorry, it's broken. management has been notified.");
notify(player, buf);
fputs("spit_file:", stderr);
if(filename)
perror(filename);
else
perror("");
} else {
while(fgets(buf, sizeof buf, f)) {
for(p = buf; *p; p++) if(*p == '\n') {
*p = '\0';
break;
}
notify(player, buf);
}
fclose(f);
}
}
/*
void do_news(player)
dbref player;
{
spit_file(player, NEWS_FILE);
}
*/
void do_text(player, arg1, arg2)
dbref player;
char *arg1;
char *arg2;
{
char indx[20];
char text[20];
if (strlen(arg1) <1 || strlen(arg1)>10 || strchr(arg1,'/') || strchr(arg1,'.')) {
notify(player, "illegal text file.");
return;
}
sprintf(indx,"msgs/%sindx",arg1);
sprintf(text,"msgs/%stext",arg1);
do_help(player, arg2, arg1, indx, text, NULL);
}
void do_help(player, arg1, deftopic, indxfile, textfile, trigthis)
dbref player;
char *arg1;
char *deftopic;
char *indxfile;
char *textfile;
ATTR *trigthis;
{
int help_found;
help_indx entry;
FILE *fp;
char *p, line[LINE_SIZE+1];
if ( *arg1 == '\0' )
arg1 = deftopic;
if ( (fp = fopen(indxfile, "r")) == NULL ) {
if ( (fp = fopen(textfile, "r")) == NULL) {
if (errno == ENOENT) {
/* no such file or directory. no such text bundle. */
notify(player,tprintf("No such file or directory: %s",textfile));
return;
} else {
log_error(tprintf("%s: errno %d",textfile,errno));
notify(player,tprintf("%s: error number %d",textfile,errno));
perror(textfile);
return;
}
} else {
notify(player,tprintf("%s isn't indexed.",textfile));
fclose(fp);
return;
}
}
while ( (help_found = fread(&entry, sizeof(help_indx), 1, fp)) == 1 )
if ( string_prefix(entry.topic, arg1) )
break;
fclose(fp);
if ( help_found <= 0 ) {
notify(player, tprintf("No %s for '%s'.", deftopic, arg1));
return;
}
if ( (fp = fopen(textfile, "r")) == NULL ) {
notify(player,
tprintf("%s: sorry, temporarily not available.", deftopic));
log_error(tprintf("can't open %s for reading", textfile));
return;
}
if ( fseek(fp, entry.pos, 0) < 0L ) {
notify(player,
tprintf("%s: sorry, temporarily not available.", deftopic));
log_error(tprintf("seek error in file %s", textfile));
fclose(fp);
return;
}
for (;;) {
if ( fgets(line, LINE_SIZE, fp) == NULL )
break;
if ( line[0] == '&' )
break;
for ( p = line; *p != '\0'; p++ )
if ( *p == '\n' )
*p = '\0';
notify(player, line);
}
fclose(fp);
if (trigthis) {
dbref zon;
wptr[0] = entry.topic;
did_it(player, player, NULL, NULL, NULL, NULL, trigthis);
DOZONE(zon, player)
did_it(player, zon, NULL, NULL, NULL, NULL, trigthis);
}
}