pennmush/game/
pennmush/game/data/
pennmush/game/log/
pennmush/game/save/
pennmush/game/txt/evt/
pennmush/game/txt/nws/
pennmush/os2/
#include "copyrite.h"

#include "config.h"
#ifdef I_STRING
#include <string.h>
#else
#include <strings.h>
#endif
#include <ctype.h>
#include "externs.h"
#include "parse.h"
#include "confmagic.h"

extern time_t mudtime;
int do_convtime _((char *str, struct tm * ttm));

/* ARGSUSED */
FUNCTION(fun_time)
{
  char *s;

  s = (char *) ctime(&mudtime);
  s[strlen(s) - 1] = '\0';
  if (s[8] == ' ')
    s[8] = '0';
  safe_str(s, buff, bp);
}

/* ARGSUSED */
FUNCTION(fun_secs)
{
  safe_str(unparse_integer(mudtime), buff, bp);
}

/* ARGSUSED */
FUNCTION(fun_convsecs)
{
  /* converts seconds to a time string */

  time_t tt;
  char *s;

  if (!is_integer(args[0])) {
    safe_str(e_int, buff, bp);
    return;
  }
  tt = parse_integer(args[0]);
  if (tt < 0) {
    safe_str("#-1 ARGUMENT MUST BE POSITIVE", buff, bp);
    return;
  }
  s = (char *) ctime(&tt);
  s[strlen(s) - 1] = '\0';
  if (s[8] == ' ')
    s[8] = '0';
  safe_str(s, buff, bp);
}

/* ARGSUSED */
FUNCTION(fun_timestring)
{
  /* Convert seconds to #d #h #m #s
   * If pad > 0, pad with 0's (i.e. 0d 0h 5m 1s)
   */
  int secs, pad;
  int days, hours, mins;

  if (!is_integer(args[0])) {
    safe_str(e_ints, buff, bp);
    return;
  }
  if (nargs == 1)
    pad = 0;
  else {
    if (!is_integer(args[1])) {
      safe_str(e_ints, buff, bp);
      return;
    }
    pad = parse_integer(args[1]);
  }

  secs = parse_integer(args[0]);
  if (secs < 0) {
    safe_str("#-1 OUT OF RANGE", buff, bp);
    return;
  }
  days = secs / 86400;
  secs %= 86400;
  hours = secs / 3600;
  secs %= 3600;
  mins = secs / 60;
  secs %= 60;
  if (pad || (days > 0))
    safe_str(tprintf("%dd %2dh %2dm %2ds", days, hours, mins, secs), buff, bp);
  else if (hours > 0)
    safe_str(tprintf("%2dh %2dm %2ds", hours, mins, secs), buff, bp);
  else if (mins > 0)
    safe_str(tprintf("%2dm %2ds", mins, secs), buff, bp);
  else
    safe_str(tprintf("%2ds", secs), buff, bp);
}


static const char *month_table[] =
{
  "Jan",
  "Feb",
  "Mar",
  "Apr",
  "May",
  "Jun",
  "Jul",
  "Aug",
  "Sep",
  "Oct",
  "Nov",
  "Dec",
};

int
do_convtime(str, ttm)
    char *str;
    struct tm *ttm;
{
  /* converts time string to a struct tm. Returns 1 on success, 0 on fail.
   * Time string format is always 24 characters long, in format
   * Ddd Mmm DD HH:MM:SS YYYY
   */

  char *p, *q;
  int i;

  if (strlen(str) != 24)
    return 0;

  /* move over the day of week and truncate. Will always be 3 chars.
   * we don't need this, so we can ignore it.
   */
  if (!(p = strchr(str, ' ')))
    return 0;
  *p++ = '\0';
  if (strlen(str) != 3)
    return 0;

  /* get the month (3 chars), and convert it to a number */
  if (!(q = strchr(p, ' ')))
    return 0;
  *q++ = '\0';
  if (strlen(p) != 3)
    return 0;
  for (i = 0; (i < 12) && strcmp(month_table[i], p); i++) ;
  if (i == 12)			/* not found */
    return 0;
  else
    ttm->tm_mon = i;

  /* get the day of month */
  p = q;
  while (isspace(*p))		/* skip leading space */
    p++;
  if (!(q = strchr(p, ' ')))
    return 0;
  *q++ = '\0';
  ttm->tm_mday = atoi(p);

  /* get hours */
  if (!(p = (char *) strchr(q, ':')))
    return 0;
  *p++ = '\0';
  ttm->tm_hour = atoi(q);

  /* get minutes */
  if (!(q = strchr(p, ':')))
    return 0;
  *q++ = '\0';
  ttm->tm_min = atoi(p);

  /* get seconds */
  if (!(p = strchr(q, ' ')))
    return 0;
  *p++ = '\0';
  ttm->tm_sec = atoi(q);

  /* get year */
  ttm->tm_year = atoi(p) - 1900;

  ttm->tm_isdst = -1;

  return 1;
}

/* ARGSUSED */
FUNCTION(fun_convtime)
{
  /* converts time string to seconds */

  struct tm ttm;

  if (do_convtime(args[0], &ttm)) {
#ifdef SUN_OS
    safe_str(unparse_integer(timelocal(&ttm)), buff, bp);
#else
    safe_str(unparse_integer(mktime(&ttm)), buff, bp);
#endif				/* SUN_OS */
  } else {
    safe_str("-1", buff, bp);
  }
}

#ifdef WIN32
#pragma warning( disable : 4761)	/* NJG: disable warning re conversion */
#endif
/* ARGSUSED */
FUNCTION(fun_isdaylight)
{
  struct tm *ltime;
  time_t tt;

  time(&tt);
  ltime = localtime(&tt);

  safe_chr((ltime->tm_isdst > 0) ? '1' : '0', buff, bp);
}

#ifdef WIN32
#pragma warning( default : 4761)	/* NJG: enable warning re conversion */
#endif