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 extraDesc.c
 * @ingroup extradesc
 *
 * Extra Description code
 *
 * @author Geoff Davis <geoff@circlemudsquared.org>
 * @author Greg Buxton <greg@circlemudsquared.org>
 *
 * @par Copyright:
 *   Copyright (C) 2006 Geoff Davis <geoff@circlemudsquared.org><br>
 *                      Greg Buxton <greg@circlemudsquared.org>
 *
 * @par
 *   Copyright (C) 1993, 94 by the Trustees of the Johns Hopkins University<br>
 *   CircleMUD is based on DikuMUD, Copyright (C) 1990, 1991.
 *
 * @par
 *   All rights reserved.  See license.doc for complete information.
 *
 * @package cs
 * @version 1.0
 */

#define __EXTRADESC_C__

#include "base.h"
#include "structs.h"
#include "utils.h"

#include "comm.h"
#include "constants.h"
#include "dao.h"
#include "db.h"
#include "handler.h"
#include "log.h"
#include "interpreter.h"
#include "spells.h"
#include "extraDesc.h"

/**
 * Converts a list of extra descriptions to their corresponding DAOs.
 * @param parentDao the container DAO to contain the extraDescription DAOs
 * @param list the list of extra descriptions to be converted
 */
void extraDescData_listToDao(daoData_t *parentDao, extraDescData_t *list) {
  if (parentDao == NULL) {
    log("extraDescData_listToDao(): invalid 'parentDao' daoData_t.");
  } else if (list == NULL) {
    log("extraDescData_listToDao(): invalid 'list' extraDescData_t.");
  } else {
    /* Declare a counter variable */
    register size_t count = 0UL;
    /* Create the container for the extra description DAOs. */
    daoData_t *subContainerDao = dao_newChild(parentDao, "extraDescriptions");
    /* Iterate over the list of extra descriptions. */
    while (list) {
      /* Convert the extra description. */
      extraDescData_toDao(subContainerDao, count++, list);
      /* Advance to the next extra description in the list. */
      list = list->next;
    }
  }
}

/**
 * Save a specific extraDescData_t to DAO
 * @param parentDao the container DAO to contain the extraDescription DAO
 * @param num Number of the extraDescData_t in the list
 * @param extra extraDescData_t to save
 */
void extraDescData_toDao(daoData_t *parentDao, int num, extraDescData_t *extra) {
  if (parentDao == NULL) {
    log("extraDescData_toDao(): invalid 'parentDao' daoData_t.");
  } else if (extra == NULL) {
    log("extraDescData_toDao(): invalid 'entry' extraDescData_t.");
  } else {
    /* Create a container DAO to contain the extra description. */
    daoData_t *subContainerDao = dao_newChild(parentDao, "%d", num);
    /* Write the extra description's keywords to the DAO. */
    dao_newScalar(subContainerDao, "keywords", "%s", extra->keyword);
    /* Write the extra description's description to the DAO. */
    dao_newScalar(subContainerDao, "description", "%s", extra->description);
  }
}

/* ************************************************************************ */
/*  Load Extra Desc Data from DAO                                           */
/* ************************************************************************ */

/**
 * Load extra descriptions from extraDescList dao
 *
 * @param eDescListDao list of extra descriptions in dao format
 * @return pointer to loaded extra description list
 */
extraDescData_t *extraDescData_listFromDao(daoData_t *eDescListDao) {
  extraDescData_t *extraDescs = NULL, *tmp = NULL, *i = NULL;
  daoData_t *eDao = NULL;

  if (eDescListDao == NULL) {
    log("extraDescData_listFromDao(): invalid 'eDescDaoList' daoData_t.");
  } else {
    /* Iterate over the extra description container DAO. */
    for (eDao = eDescListDao->children; eDao; eDao = eDao->next) {
      /* Read an extra description struct from each child DAO. */
      tmp = extraDescData_fromDao(eDao);
      if (tmp) {
        tmp->next = NULL;
        if (extraDescs) {
          i = extraDescs;
          while (i && i->next) {
            i = i->next;
          }
          i->next = tmp;
        } else {
          extraDescs = tmp;
        }
      }
    }
  }
  /* Return the list of extra description structs. */
  return (extraDescs);
}

/**
 * Load an extra description from it's dao entry
 * @param eDescDao the extra description in dao format
 * @return pointer to loaded extra description
 */
extraDescData_t *extraDescData_fromDao(daoData_t *eDescDao) {
  extraDescData_t *extraDesc = NULL;

  if (eDescDao == NULL) {
    log("extraDescData_fromDao(): invalid 'eDescDao' daoData_t.");
  } else {
    /* Allocate an extra description struct. */
    CREATE(extraDesc, extraDescData_t, 1);
    /* Read the keywords from the extra description DAO. */
    extraDesc->keyword = strdup(dao_queryString(eDescDao, "keywords", "keyword"));
    /* Read the description from the extra description DAO. */
    extraDesc->description = strdup(dao_queryString(eDescDao, "description", "This extra description needs a description!\r\n"));
    /* There's no 'next' extra description yet. */
    extraDesc->next = NULL;
  }
  /* Return the extra description struct. */
  return (extraDesc);
}