/**************************************************************************
*  File: oasis_delete.c                                    Part of tbaMUD *
*  Usage: Oasis OLC deletion.                                             *
*                                                                         *
* By Levork. Copyright 1996 Harvey Gilpin. 1997-2001 George Greer.        *
* 2002 Kip Potter [Mythran].                                              *
**************************************************************************/

#include "conf.h"
#include "sysdep.h"
#include "structs.h"
#include "utils.h"
#include "comm.h"
#include "interpreter.h"
#include "handler.h"
#include "db.h"
#include "genolc.h"
#include "oasis.h"
#include "improved-edit.h"

/* Free's strings from any object, room, mobiles, or player. TRUE if successful,
 * otherwise, it returns FALSE. Type - The OLC type constant relating to the 
 * data type of data. */
int free_strings(void *data, int type)
{
  struct room_data *room;
  struct config_data *config;
  int i;

  switch (type) {
    case OASIS_WLD:
      room = (struct room_data *) data;

      /* Free Descriptions */
      if (room->name)
        free(room->name);

      if (room->description)
        free(room->description);

      if (room->ex_description)
        free_ex_descriptions(room->ex_description);

      /* Return the return value of free_strings(). */
      return (free_strings(room, OASIS_EXI));

    case OASIS_EXI:
      room = (struct room_data *) data;

      for (i = 0; i < NUM_OF_DIRS; i++) {
        if (room->dir_option[i]) {
          if (room->dir_option[i]->general_description) {
            free(room->dir_option[i]->general_description);
            room->dir_option[i]->general_description = NULL;
          }
          if (room->dir_option[i]->keyword) {
            free(room->dir_option[i]->keyword);
            room->dir_option[i]->keyword = NULL;
          }
          free(room->dir_option[i]);
          room->dir_option[i] = NULL;
        }
      }

      return (TRUE);

    case OASIS_MOB:
    case OASIS_OBJ:
      return (FALSE);		/* For now... */

    case OASIS_CFG:
      config = (struct config_data *) data;

      if (config->play.OK)
        free(config->play.OK);

      if (config->play.NOPERSON)
        free(config->play.NOPERSON);

      if (config->play.NOEFFECT)
        free(config->play.NOEFFECT);

      if (config->operation.DFLT_IP)
        free(config->operation.DFLT_IP);

      if (config->operation.DFLT_DIR)
        free(config->operation.DFLT_DIR);

      if (config->operation.LOGNAME)
        free(config->operation.LOGNAME);

      if (config->operation.MENU)
        free(config->operation.MENU);

      if (config->operation.WELC_MESSG)
        free(config->operation.WELC_MESSG);

      if (config->operation.START_MESSG)
        free(config->operation.START_MESSG);

      return (TRUE);

    default:
      mudlog(BRF, LVL_GOD, TRUE, "SYSERR: oasis_delete.c: free_strings: Invalid type handled (Type %d).", type);
      return (FALSE);
  }
}
