untermud/DOC/
untermud/DOC/U/
untermud/DOC/U/U-examples/
untermud/DOC/internals/
untermud/DOC/wizard/
untermud/MISC/
untermud/MISC/dbchk/
untermud/RWHO/
untermud/RWHO/rwhod/
/*
        Copyright (C) 1991, Marcus J. Ranum. All rights reserved.
*/

/* configure all options BEFORE including system stuff. */
#include        "config.h"
#include        "mud.h"



/*
LOW-level miscellaneous routines. Do not call anything high level
from in here. that goes in misc2.c
*/

static FILE *logfil = (FILE *) 0;


int logf_open (char *f)
{
  if (logfil != (FILE *) 0)
    (void) fclose (logfil);
  logfil = fopen (f, "ab");
  if (logfil == (FILE *) 0)
    return (1);
  return (0);
}




void logf_close ()
{
  if (logfil != (FILE *) 0)
    (void) fclose (logfil);
  logfil = (FILE *) 0;
}




/*
fatal error handler. puts strings to stderr as given. if a
given string is == -1, then put the system error message instead.
*/
/* VARARGS */

void fatal (char *first, ...)
{
  char *p = first;
  va_list ap;

  if (logfil == (FILE *) 0) {
    WIN32CLEANUP
    exit (1);
  }

  va_start (ap, first);
  do {
    if (p == (char *) 0)
      break;

    if (p == (char *) -1)
      p = (char *) sys_errlist[errno];

    (void) fprintf (logfil, "%s", p);
    (void) fprintf (stderr, "%s", p);
  } while (p = va_arg (ap, char *));
  va_end (ap);
  (void) fclose (logfil);
  WIN32CLEANUP
  exit (1);
}



extern char *ctime ();


/*
print a series of warnings - do not exit
*/
/* VARARGS */
void log_printf (char *first, ...) {
  char *p = first;
  char *ts;
  time_t tm;
  va_list ap;

  if (logfil == (FILE *) 0)
    return;

  tm = time ((time_t *) 0);
  ts = ctime (&tm);
  ts[24] = 0;
  (void) fprintf (logfil, "%s ", ts + 4);

  va_start (ap, first);
  do {
    if (p == (char *) 0)
      break;

    if (p == (char *) -1)
      p = (char *) sys_errlist[errno];

    (void) fprintf (logfil, "%s", p);
  } while (p = va_arg (ap, char *));
  va_end (ap);
  (void) fflush (logfil);
}

/* print a series of warnings, with a printf() interface. */
/*VARARGS0*/
void plogf (char *fmt, ...) {
  va_list args;
  char *ts;
#ifdef NO_VFPRINTF
  char *a[4];
  int argc = 0;
#endif
  time_t t;

  if (logfil == (FILE *) 0)
    return;

  t = time ((time_t *) 0);
  ts = ctime (&t);
  ts[24] = 0;
  (void) fprintf (logfil, "%s ", ts + 4);

  va_start (args, fmt);
#ifdef NO_VFPRINTF
  while ((a[argc++] = va_arg (args, char *)) != NULL)
    if (argc >= 4)
      break;
  switch (argc) {
  case 1:
    (void) fprintf (logfil, fmt, a[0]);
    break;
  case 2:
    (void) fprintf (logfil, fmt, a[0], a[1]);
    break;
  case 3:
    (void) fprintf (logfil, fmt, a[0], a[1], a[2]);
    break;
  default:
    (void) fprintf (logfil, fmt, a[0], a[1], a[2], a[3]);
    break;
  }
#else
  (void) vfprintf (logfil, fmt, args);
#endif
  va_end (args);
  fflush (logfil);
}




/*
WARNING  - overflows ignored. no big deal
*/
unsigned int objid_hash (char *oid, int hw) {
  unsigned int n = 0;

  while (*oid != '\0' && isdigit (*oid))
    n = *oid++ + 65599 * n;
  return (n % hw);
}




/* WARNING - may need to do different things to set up random #s */
int get_random (int num) {
  static int initt = 0;

  if (!initt) {
    OS_SRAND (time ((time_t *) 0));
    initt++;
  }
  return ((int) OS_RAND () % num);
}



/* from K&R, mostly */
// base ignored but added to signature for Windows compatability - JAL
char *itoa (int num, char *rbuf, int base) {
  int sign;
  int i = 0;

  if ((sign = num) < 0)
    num = -num;

  do {
    rbuf[i++] = num % 10 + '0';
  } while ((num /= 10) > 0);

  if (sign < 0)
    rbuf[i++] = '-';

  rbuf[i--] = '\0';

  for (sign = 0; sign < i; sign++, i--) {
    num = rbuf[sign];
    rbuf[sign] = rbuf[i];
    rbuf[i] = num;
  }
  return (rbuf);
}