circlemud_squared_0.5.153/cnf/
circlemud_squared_0.5.153/etc/
circlemud_squared_0.5.153/etc/etc/
circlemud_squared_0.5.153/etc/house/
circlemud_squared_0.5.153/etc/misc/
circlemud_squared_0.5.153/etc/plralias/A-E/
circlemud_squared_0.5.153/etc/plralias/F-J/
circlemud_squared_0.5.153/etc/plralias/K-O/
circlemud_squared_0.5.153/etc/plralias/P-T/
circlemud_squared_0.5.153/etc/plralias/U-Z/
circlemud_squared_0.5.153/etc/plralias/ZZZ/
circlemud_squared_0.5.153/etc/plrobjs/
circlemud_squared_0.5.153/etc/plrobjs/A-E/
circlemud_squared_0.5.153/etc/plrobjs/F-J/
circlemud_squared_0.5.153/etc/plrobjs/K-O/
circlemud_squared_0.5.153/etc/plrobjs/P-T/
circlemud_squared_0.5.153/etc/plrobjs/U-Z/
circlemud_squared_0.5.153/etc/plrobjs/ZZZ/
circlemud_squared_0.5.153/etc/text/
circlemud_squared_0.5.153/etc/text/help/
circlemud_squared_0.5.153/src/util/
circlemud_squared_0.5.153/src/util/worldconv/
/* ************************************************************************
*   File: utils.c                                       Part of CircleMUD *
*  Usage: various internal functions of a utility nature                  *
*                                                                         *
*  All rights reserved.  See license.doc for complete information.        *
*                                                                         *
*  Copyright (C) 1993, 94 by the Trustees of the Johns Hopkins University *
*  CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991.               *
************************************************************************ */
/*
 * Code from utils.c needed for world conversion process
 *
 * Same as the others.  If you have made any changes, make sure they're
 * done here too.
 */

#include "sysdep.h"
#include "structs.h"
#include "utils.h"
#include "main.h"
#include "db.h"

/*
 * get_line reads the next non-blank line off of the input stream.
 * The newline character is removed from the input.  Lines which begin
 * with '*' are considered to be comments.
 *
 * Returns the number of lines advanced in the file. Buffer given must
 * be at least READ_SIZE (256) characters large.
 */
int get_line(FILE *fl, char *buf)
{
  char temp[READ_SIZE];
  int lines = 0;
  int sl;

  do {
    if (!fgets(temp, READ_SIZE, fl))
      return (0);
    lines++;
  } while (*temp == '*' || *temp == '\n' || *temp == '\r');

  /* Last line of file doesn't always have a \n, but it should. */
  sl = strlen(temp);
  while (sl > 0 && (temp[sl - 1] == '\n' || temp[sl - 1] == '\r'))
    temp[--sl] = '\0';

  strcpy(buf, temp); /* strcpy: OK, if buf >= READ_SIZE (256) */
  return (lines);
}

size_t strlcpy(char *dest, const char *source, size_t totalsize)
{
  strncpy(dest, source, totalsize - 1); /* strncpy: OK (we must assume 'totalsize' is correct) */
  dest[totalsize - 1] = '\0';
  return strlen(source);
}

char *CAP(char *txt)
{
  *txt = UPPER(*txt);
  return (txt);
}

char *fname(const char *namelist)
{
  static char holder[30];
  char *point;

  for (point = holder; isalpha(*namelist); namelist++, point++)
    *point = *namelist;

  *point = '\0';

  return (holder);
}

/* Be wary of sign issues with this. */
int MIN(int a, int b)
{
  return (a < b ? a : b);
}

/* Be wary of sign issues with this. */
int MAX(int a, int b)
{
  return (a > b ? a : b);
}

int get_filename(char *filename, size_t fbufsize, int mode, const char *orig_name)
{
  const char *prefix = NULL, *middle = NULL, *suffix = NULL;
  char name[PATH_MAX], *ptr;

  if (filename == NULL) {
    log("get_filename(): invalid 'filename' string.");
  } else if (orig_name == NULL || *orig_name == '\0') {
    log("get_filename(): invalid 'orig_name' string.");
  } else {
    switch (mode) {
    case CRASH_FILE:
      prefix = ETC_PLROBJS;
      suffix = SUF_OBJS;
      break;
    case ALIAS_FILE:
      prefix = ETC_PLRALIAS;
      suffix = SUF_ALIAS;
      break;
    case ETEXT_FILE:
      prefix = ETC_PLRTEXT;
      suffix = SUF_TEXT;
      break;
    case ZONE_FILE:
      prefix = ETC_ZONES;
      suffix = SUF_ZONE;
      break;
    default:
      return (FALSE);
    }

    strlcpy(name, orig_name, sizeof(name));
    for (ptr = name; *ptr; ptr++)
      *ptr = LOWER(*ptr);

    if (mode != ZONE_FILE) {
      switch (LOWER(*name)) {
      case 'a':  case 'b':  case 'c':  case 'd':  case 'e':
        middle = "A-E";
        break;
      case 'f':  case 'g':  case 'h':  case 'i':  case 'j':
        middle = "F-J";
        break;
      case 'k':  case 'l':  case 'm':  case 'n':  case 'o':
        middle = "K-O";
        break;
      case 'p':  case 'q':  case 'r':  case 's':  case 't':
        middle = "P-T";
        break;
      case 'u':  case 'v':  case 'w':  case 'x':  case 'y':  case 'z':
        middle = "U-Z";
        break;
      default:
        middle = "ZZZ";
        break;
      }
    }
    snprintf(filename, fbufsize, "%s%s%s%s.%s",
      prefix,
      middle && *middle != '\0' ? middle : "",
      middle && *middle != '\0' ? SLASH : "",
      name,
      suffix);
    return (TRUE);
  }
  return (FALSE);
}

size_t sprinttype(int type, const char *names[], char *result, size_t reslen)
{
  int nr = 0;

  while (type && *names[nr] != '\n') {
    type--;
    nr++;
  }

  return strlcpy(result, *names[nr] != '\n' ? names[nr] : "UNDEFINED", reslen);
}