dbm/
misc/
old-docs/
/* help.c */

#include "copyright.h"
#include "config.h"

#include <stdio.h>
#include <sys/types.h>
#include <sys/param.h>
#include <sys/stat.h>

#include "teeny.h"
#include "case.h"

#ifndef MAXPATHLEN		/* SysV */
#define MAXPATHLEN 20
#endif				/* MAXPATHLEN */

/*
 * This file contains a fairly simple help and news system.
 */

#ifdef HELPSYSTEM
voidfunc        do_help(player, arg)
  int             player;
  char           *arg;
{
  extern char     cmdwork[];
  char            file[MAXPATHLEN + 1];
  char           *p, *q;
  FILE           *f;

  if (!arg || !*arg) {
    spit_file(player, HELP_FILE);
    return;
  }
  for (p = cmdwork, q = arg; *q && (p - cmdwork) < BUFFSIZ;) {
    if (*q != '/')
      *p++ = DOWNCASE(*q);
    q++;
  }
  *p = '\0';

  strcpy(file, HELP_PATH);
  p = file + strlen(HELP_PATH);
  for (q = cmdwork; *q && (p - file) < MAXPATHLEN; *p++ = *q++);
  *p = '\0';

  if ((f = fopen(file, "r")) == NULL) {
    notify_player(player, "Help on subject \"");
    notify_player(player, arg);
    notify_player(player, "\" does not exist.\r\n");
    notify_player(player, "Type \"help\" for a list of subjects available.\r\n");
    return;
  }
  notify_player(player, "-----\r\nHelp on subject: ");
  notify_player(player, arg);
  notify_player(player, "\r\n-----\r\n");
  while ((fgets(cmdwork, BUFFSIZ - 1, f)) != NULL) {
    fix_newline(cmdwork);
    notify_player(player, cmdwork);
  }
  notify_player(player, "-----\r\n");

  (void) fclose(f);
}

#else				/* HELPSYSTEM */

voidfunc
                do_help(player);
int             player;

{
  spit_file(player, HELP_FILE);
}

#endif				/* HELPSYSTEM */

#ifdef NEWSSYSTEM
voidfunc        do_news(player, arg)
  int             player;
  char           *arg;
{
  extern char     cmdwork[];
  char            file[MAXPATHLEN + 1];
  char           *p, *q;
  FILE           *f;
  struct stat     sbuf;

  extern char    *ctime();

  if (!arg || !*arg) {
    spit_file(player, NEWS_FILE);
    return;
  }
  for (p = cmdwork, q = arg; *q && (p - cmdwork) < BUFFSIZ;) {
    if (*q != '/')
      *p++ = DOWNCASE(*q);
    q++;
  }
  *p = '\0';

  strcpy(file, NEWS_PATH);
  p = file + strlen(NEWS_PATH);
  for (q = cmdwork; *q && (p - file) < MAXPATHLEN; *p++ = *q++);
  *p = '\0';

  if ((f = fopen(file, "r")) == NULL) {
    notify_player(player, "News article \"");
    notify_player(player, arg);
    notify_player(player, "\" does not exist.\r\n");
    notify_player(player, "Type \"news\" for a list of articles available.\r\n");
    return;
  }
  (void) stat(file, &sbuf);

  notify_player(player, "-----\r\nNews article: ");
  notify_player(player, arg);
  notify_player(player, "\r\nLast updated: ");
  notify_player(player, ctime(&sbuf.st_mtime));
  notify_player(player, "-----\r\n");

  while ((fgets(cmdwork, BUFFSIZ - 1, f)) != NULL) {
    fix_newline(cmdwork);
    notify_player(player, cmdwork);
  }
  notify_player(player, "-----\r\n");

  (void) fclose(f);
}

#else				/* NEWSSYSTEM */

voidfunc        do_news(player)
  int             player;

{
  spit_file(player, NEWS_FILE);
}

#endif				/* NEWSSYSTEM */

void            check_news(player)
  int             player;
{
  struct stat     sbuf;
  extern char     cmdwork[];

  (void) stat(NEWS_FILE, &sbuf);
  (void) strcpy(cmdwork, "News file last updated ");
  (void) strcat(cmdwork, ctime(&sbuf.st_mtime));
  cmdwork[strlen(cmdwork) - 1] = 0;
  (void) strcat(cmdwork, "\r\n");

  notify_player(player, cmdwork);
}

/* this is here to save space elsewhere */

int             filesize(name)
  char           *name;
{
  struct stat     sbuf;

  if (stat(name, &sbuf) != 0)
    return -1;
  return sbuf.st_size;
}