1stMud/CVS/
1stMud/area/CVS/
1stMud/backup/CVS/
1stMud/bin/
1stMud/bin/CVS/
1stMud/bin/extras/
1stMud/bin/extras/CVS/
1stMud/data/CVS/
1stMud/data/i3/CVS/
1stMud/doc/1stMud/
1stMud/doc/1stMud/CVS/
1stMud/doc/CVS/
1stMud/doc/Diku/
1stMud/doc/Diku/CVS/
1stMud/doc/MPDocs/CVS/
1stMud/doc/Merc/CVS/
1stMud/doc/Rom/
1stMud/doc/Rom/CVS/
1stMud/log/CVS/
1stMud/notes/
1stMud/notes/CVS/
1stMud/player/CVS/
1stMud/player/backup/CVS/
1stMud/player/deleted/CVS/
1stMud/src/CVS/
1stMud/src/config/CVS/
1stMud/src/h/CVS/
1stMud/src/o/CVS/
1stMud/win/CVS/
/**************************************************************************
*  Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer,        *
*  Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe.   *
*                                                                         *
*  Merc Diku Mud improvements copyright (C) 1992, 1993 by Michael         *
*  Chastain, Michael Quan, and Mitchell Tse.                              *
*                                                                         *
*  In order to use any part of this Merc Diku Mud, you must comply with   *
*  both the original Diku license in 'license.doc' as well the Merc       *
*  license in 'license.txt'.  In particular, you may not remove either of *
*  these copyright notices.                                               *
*                                                                         *
*  Much time and thought has gone into this software and you are          *
*  benefiting.  We hope that you share your changes too.  What goes       *
*  around, comes around.                                                  *
***************************************************************************
*       ROM 2.4 is copyright 1993-1998 Russ Taylor                        *
*       ROM has been brought to you by the ROM consortium                 *
*           Russ Taylor (rtaylor@hypercube.org)                           *
*           Gabrielle Taylor (gtaylor@hypercube.org)                      *
*           Brian Moore (zump@rom.org)                                    *
*       By using this code, you have agreed to follow the terms of the    *
*       ROM license, in the file Rom24/doc/rom.license                    *
***************************************************************************
*          1stMud ROM Derivative (c) 2001-2004 by Markanth                *
*            http://www.firstmud.com/  <markanth@firstmud.com>            *
*         By using this code you have agreed to follow the term of        *
*             the 1stMud license in ../doc/1stMud/LICENSE                 *
***************************************************************************/


#include "merc.h"
#include "recycle.h"
#include "olc.h"
#include "tables.h"
#include "interp.h"

Proto (void free_channel_history, (PcData *));
Proto (void init_channel_history, (PcData *));


BanData *
new_ban (void)
{
  BanData *Data;

  if (ban_free != NULL)
    {
      Data = ban_free;
      ban_free = ban_free->next;
      top_ban_free--;
    }
  else
    {
      Data = (BanData *) alloc_perm (sizeof (BanData));
    }
  *Data = ban_zero;
  top_ban++;
  Data->next = Data->prev = NULL;
  Data->name = &str_empty[0];
  Validate (Data);
  return Data;
}

void
free_ban (BanData * Data)
{
  if (!IsValid (Data))
    return;

  free_string (Data->name);
  top_ban--;
  Invalidate (Data);
  LinkSingle (Data, ban_free, next);
  top_ban_free++;
}



Descriptor *
new_descriptor (void)
{
  Descriptor *Data;

  if (descriptor_free != NULL)
    {
      Data = descriptor_free;
      descriptor_free = descriptor_free->next;
      top_descriptor_free--;
    }
  else
    {
      Data = (Descriptor *) alloc_perm (sizeof (Descriptor));
    }
  *Data = descriptor_zero;
  top_descriptor++;
  Data->next = Data->prev = NULL;
  Data->connected = CON_GET_TERM;
  Data->showstr_head = NULL;
  Data->showstr_point = NULL;
  Data->run_buf = NULL;
  Data->run_head = NULL;
  Data->outsize = 2000;
  Data->scr_width = DEFAULT_SCR_WIDTH;
  Data->scr_height = DEFAULT_SCR_HEIGHT;
  Data->bytes_normal = 0;
#ifndef DISABLE_MCCP

  Data->bytes_compressed = 0;
  Data->mccp_version = 0;
#endif

  Data->editor = ED_NONE;
  Data->pEdit = NULL;
  alloc_mem (Data->outbuf, char, Data->outsize);

  Data->mxp.supports = &str_empty[0];
  Data->mxp.mxp_ver = 0.0;
  Data->mxp.client_ver = 0.0;
  Data->mxp.style_ver = 0.0;
  Data->mxp.client = &str_empty[0];
  Validate (Data);
  return Data;
}

void
free_descriptor (Descriptor * Data)
{
  if (!IsValid (Data))
    return;

  free_string (Data->host);
  free_string (Data->showstr_head);
  free_mem (Data->outbuf);
  free_string (Data->mxp.supports);
  free_string (Data->mxp.client);
  top_descriptor--;
  Invalidate (Data);
  LinkSingle (Data, descriptor_free, next);
  top_descriptor_free++;
}

GenData *
new_gen_data (void)
{
  GenData *Data;

  if (gen_data_free != NULL)
    {
      Data = gen_data_free;
      gen_data_free = gen_data_free->next;
      top_gen_data_free--;
    }
  else
    {
      Data = (GenData *) alloc_perm (sizeof (GenData));
    }
  *Data = gen_data_zero;
  top_gen_data++;
  Data->next = Data->prev = NULL;

  alloc_mem (Data->skill_chosen, bool, top_skill);
  alloc_mem (Data->group_chosen, bool, top_group);
  Data->rerolls = 1;
  Validate (Data);
  return Data;
}

void
free_gen_data (GenData * Data)
{
  if (!IsValid (Data))
    return;

  free_mem (Data->skill_chosen);
  free_mem (Data->group_chosen);
  top_gen_data--;
  Invalidate (Data);
  LinkSingle (Data, gen_data_free, next);
  top_gen_data_free++;
}


ExDescrData *
new_ed (void)
{
  ExDescrData *Data;

  if (ed_free != NULL)
    {
      Data = ed_free;
      ed_free = ed_free->next;
      top_ed_free--;
    }
  else
    {
      Data = (ExDescrData *) alloc_perm (sizeof (ExDescrData));
    }
  *Data = ed_zero;
  top_ed++;
  Data->next = Data->prev = NULL;
  Data->keyword = &str_empty[0];
  Data->description = &str_empty[0];
  Validate (Data);
  return Data;
}

void
free_ed (ExDescrData * Data)
{
  if (!IsValid (Data))
    return;

  free_string (Data->keyword);
  free_string (Data->description);
  top_ed--;
  Invalidate (Data);
  LinkSingle (Data, ed_free, next);
  top_ed_free++;
}



AffectData *
new_affect (void)
{
  AffectData *Data;

  if (affect_free != NULL)
    {
      Data = affect_free;
      affect_free = affect_free->next;
      top_affect_free--;
    }
  else
    {
      Data = (AffectData *) alloc_perm (sizeof (AffectData));
    }
  *Data = affect_zero;
  top_affect++;
  Data->next = Data->prev = NULL;
  Validate (Data);
  return Data;
}

void
free_affect (AffectData * Data)
{
  if (!IsValid (Data))
    return;

  top_affect--;
  Invalidate (Data);
  LinkSingle (Data, affect_free, next);
  top_affect_free++;
}



ObjData *
new_obj (void)
{
  ObjData *Data;

  if (obj_free != NULL)
    {
      Data = obj_free;
      obj_free = obj_free->next;
      top_obj_free--;
    }
  else
    {
      Data = (ObjData *) alloc_perm (sizeof (ObjData));
    }
  *Data = obj_zero;
  top_obj++;
  Data->next = Data->prev = NULL;
  Data->name = &str_empty[0];
  Data->short_descr = &str_empty[0];
  Data->description = &str_empty[0];
  Data->owner = &str_empty[0];
  Validate (Data);
  return Data;
}

void
free_obj (ObjData * Data)
{
  AffectData *paf, *paf_next;
  ExDescrData *ed, *ed_next;

  if (!IsValid (Data))
    return;

  for (paf = Data->affect_first; paf != NULL; paf = paf_next)
    {
      paf_next = paf->next;
      free_affect (paf);
    }
  Data->affect_first = NULL;

  for (ed = Data->ed_first; ed != NULL; ed = ed_next)
    {
      ed_next = ed->next;
      free_ed (ed);
    }
  Data->ed_first = Data->ed_last = NULL;
  free_string (Data->name);
  free_string (Data->description);
  free_string (Data->short_descr);
  free_string (Data->owner);
  top_obj--;
  Invalidate (Data);
  LinkSingle (Data, obj_free, next);
  top_obj_free++;
}



CharData *
new_char (void)
{
  CharData *Data;
  int i;

  if (char_free != NULL)
    {
      Data = char_free;
      char_free = char_free->next;
      top_char_free--;
    }
  else
    {
      Data = (CharData *) alloc_perm (sizeof (CharData));
    }
  *Data = char_zero;
  top_char++;
  Data->next = Data->prev = NULL;
  Data->name = &str_empty[0];
  Data->short_descr = &str_empty[0];
  Data->long_descr = &str_empty[0];
  Data->description = &str_empty[0];
  Data->prompt = &str_empty[0];
  Data->gprompt = &str_empty[0];
  Data->prefix = &str_empty[0];
  Data->logon = current_time;
  Data->lines = 0;
  Data->columns = 0;
  Data->rank = 0;
  Data->deity = NULL;
  memset (Data->armor, 100, MAX_AC);
  Data->position = POS_STANDING;
  Data->hit = 20;
  Data->max_hit = 20;
  Data->mana = 100;
  Data->max_mana = 100;
  Data->move = 100;
  Data->max_move = 100;
  memset (Data->perm_stat, 13, STAT_MAX);
  memset (Data->mod_stat, 0, STAT_MAX);
  memset (Data->stance, 0, MAX_STANCE);

  for (i = 0; i < MAX_MCLASS; i++)
    Data->Class[i] = -1;
  Data->Class[CLASS_COUNT] = 0;
  Validate (Data);
  return Data;
}

void
free_char (CharData * Data)
{
  ObjData *obj;
  ObjData *obj_next;
  AffectData *paf;
  AffectData *paf_next;

  if (!IsValid (Data))
    return;

  if (IsNPC (Data))
    mobile_count--;

  for (obj = Data->carrying_first; obj != NULL; obj = obj_next)
    {
      obj_next = obj->next_content;
      extract_obj (obj);
    }

  for (paf = Data->affect_first; paf != NULL; paf = paf_next)
    {
      paf_next = paf->next;
      affect_remove (Data, paf);
    }

  free_string (Data->name);
  free_string (Data->short_descr);
  free_string (Data->long_descr);
  free_string (Data->description);
  free_string (Data->prompt);
  free_string (Data->gprompt);
  free_string (Data->prefix);
  free_pcdata (Data->pcdata);
  top_char--;
  Invalidate (Data);
  LinkSingle (Data, char_free, next);
  top_char_free++;
}

PcData *
new_pcdata (void)
{
  PcData *Data;
  int i;

  if (pcdata_free != NULL)
    {
      Data = pcdata_free;
      pcdata_free = pcdata_free->next;
      top_pcdata_free--;
    }
  else
    {
      Data = (PcData *) alloc_perm (sizeof (PcData));
    }
  *Data = pcdata_zero;
  top_pcdata++;
  Data->next = Data->prev = NULL;
  for (i = 0; i < MAX_ALIAS; i++)
    {
      Data->alias[i] = &str_empty[0];
      Data->alias_sub[i] = &str_empty[0];
    }
  for (i = 0; i < MAX_BUDDY; i++)
    Data->buddies[i] = &str_empty[0];
  for (i = 0; i < MAX_IGNORE; i++)
    {
      Data->ignore[i] = &str_empty[0];
      Data->ignore_flags[i] = 0;
    }
  for (i = 0; i < MAX_BOARD; i++)
    Data->unsubscribed[i] = false;
  init_channel_history (Data);
  Data->buffer = new_buf ();
  alloc_mem (Data->learned, int, top_skill);

  alloc_mem (Data->group_known, bool, top_group);
  Data->str_ed_key = '/';
  Data->clan = NULL;
  Data->invited = NULL;
  Data->confirm_delete = false;
  Data->board = &boards[DEFAULT_BOARD];
  Data->pwd = &str_empty[0];
  Data->webpass = &str_empty[0];
  Data->bamfin = &str_empty[0];
  Data->bamfout = &str_empty[0];
  Data->title = &str_empty[0];
  Data->who_descr = &str_empty[0];
  Data->afk_msg = &str_empty[0];
  memset (Data->condition, 48, COND_MAX);
  Data->condition[COND_DRUNK] = 0;
  memset (Data->gamestat, 0, MAX_GAMESTAT);
  Data->timezone = -1;
  Data->prime_class = 0;
  Validate (Data);
  return Data;
}

void
free_pcdata (PcData * Data)
{
  int alias, pos, ignore;

  if (!IsValid (Data))
    return;

  free_string (Data->pwd);
  free_string (Data->bamfin);
  free_string (Data->bamfout);
  free_string (Data->title);
  free_string (Data->who_descr);
  free_string (Data->webpass);
  free_string (Data->afk_msg);
  free_buf (Data->buffer);
  free_mem (Data->learned);
  free_mem (Data->group_known);
  for (alias = 0; alias < MAX_ALIAS; alias++)
    {
      free_string (Data->alias[alias]);
      free_string (Data->alias_sub[alias]);
    }
  for (pos = 0; pos < MAX_BUDDY; pos++)
    free_string (Data->buddies[pos]);
  for (ignore = 0; ignore < MAX_IGNORE; ignore++)
    free_string (Data->ignore[ignore]);
#ifndef DISABLE_I3

  free_i3chardata (Data);
#endif

  free_channel_history (Data);
  top_pcdata--;
  Invalidate (Data);
  LinkSingle (Data, pcdata_free, next);
  top_pcdata_free++;
}


long last_pc_id;
long last_mob_id;

long
get_pc_id (void)
{
  int val;

  val = (current_time <= last_pc_id) ? last_pc_id + 1 : current_time;
  last_pc_id = val;
  return val;
}

long
get_mob_id (void)
{
  last_mob_id++;
  return last_mob_id;
}

Buffer *
new_buf (void)
{
  Buffer *Data;

  if (buf_free != NULL)
    {
      Data = buf_free;
      buf_free = buf_free->next;
      top_buf_free--;
    }
  else
    {
      Data = (Buffer *) alloc_perm (sizeof (Buffer));
    }
  *Data = buf_zero;
  top_buf++;
  Data->next = Data->prev = NULL;
  Data->state = BUFFER_SAFE;
  Data->size = KILOBYTE;

  alloc_mem (Data->string, char, Data->size);

  Data->string[0] = '\0';
  Validate (Data);
  return Data;
}

void
free_buf (Buffer * Data)
{
  if (!IsValid (Data))
    return;

  free_mem (Data->string);
  Data->string = NULL;
  Data->size = 0;
  Data->state = BUFFER_FREED;
  top_buf--;
  Invalidate (Data);
  LinkSingle (Data, buf_free, next);
  top_buf_free++;
}

int
bprint (Buffer * buffer, const char *string)
{
  int ret_len, len;
  char *oldstr;

  if (!buffer || NullStr (string) || buffer->state == BUFFER_OVERFLOW)
    return 0;

  oldstr = buffer->string;
  len = strlen (buffer->string) + (ret_len = strlen (string)) + 1;

  if (len >= buffer->size)
    {
      alloc_mem (buffer->string, char, len);

      if (buffer->string == NULL)
	{
	  buffer->state = BUFFER_OVERFLOW;
	  bugf ("buffer overflow %d", buffer->size);
	  return -1;
	}

      buffer->size = len;
      strcpy (buffer->string, oldstr);
      free_mem (oldstr);
    }

  strcat (buffer->string, string);
  return ret_len;
}

int
bprintf (Buffer * buffer, const char *messg, ...)
{
  char buf[MPL];
  va_list args;

  if (!buffer || NullStr (messg))
    return 0;

  va_start (args, messg);
  vsnprintf (buf, sizeof (buf), messg, args);
  va_end (args);

  return bprint (buffer, buf);
}

int
bprintlnf (Buffer * buffer, const char *messg, ...)
{
  va_list args;
  char send_buf[MPL];

  if (!buffer)
    return 0;

  send_buf[0] = NUL;
  if (!NullStr (messg))
    {
      va_start (args, messg);
      vsnprintf (send_buf, sizeof (send_buf), messg, args);
      va_end (args);
    }
  strcat (send_buf, NEWLINE);
  return bprint (buffer, send_buf);
}

int
bprintln (Buffer * buffer, const char *messg)
{
  int len = 0;

  if (!buffer)
    return 0;

  if (!NullStr (messg))
    len += bprint (buffer, messg);
  len += bprint (buffer, NEWLINE);
  return len;
}

void
clear_buf (Buffer * buffer)
{
  buffer->string[0] = NUL;
  buffer->state = BUFFER_SAFE;
}

char *
buf_string (Buffer * buffer)
{
  return buffer->string;
}


ProgList *
new_prog_list (void)
{
  ProgList *Data;

  if (prog_list_free != NULL)
    {
      Data = prog_list_free;
      prog_list_free = prog_list_free->next;
      top_prog_list_free--;
    }
  else
    {
      Data = (ProgList *) alloc_perm (sizeof (ProgList));
    }
  *Data = prog_list_zero;
  top_prog_list++;
  Data->next = Data->prev = NULL;
  Validate (Data);
  return Data;
}

void
free_prog_list (ProgList * Data)
{
  if (!IsValid (Data))
    return;

  top_prog_list--;
  Invalidate (Data);
  LinkSingle (Data, prog_list_free, next);
  top_prog_list_free++;
}

HelpData *
new_help (void)
{
  HelpData *Data;

  if (help_free != NULL)
    {
      Data = help_free;
      help_free = help_free->next;
      top_help_free--;
    }
  else
    {
      Data = (HelpData *) alloc_perm (sizeof (HelpData));
    }
  *Data = help_zero;
  top_help++;
  Data->next = Data->prev = NULL;
  Data->keyword = &str_empty[0];
  Data->text = &str_empty[0];
  Validate (Data);
  return Data;
}

void
free_help (HelpData * Data)
{
  if (!IsValid (Data))
    return;

  free_string (Data->keyword);
  free_string (Data->text);
  top_help--;
  Invalidate (Data);
  LinkSingle (Data, help_free, next);
  top_help_free++;
}


StatData *
new_stat (void)
{
  StatData *Data;

  if (stat_free != NULL)
    {
      Data = stat_free;
      stat_free = stat_free->next;
      top_stat_free--;
    }
  else
    {
      Data = (StatData *) alloc_perm (sizeof (StatData));
    }
  *Data = stat_zero;
  top_stat++;
  Data->next = Data->prev = NULL;
  Data->name = &str_empty[0];
  Validate (Data);
  return Data;
}

void
free_stat (StatData * Data)
{
  if (!IsValid (Data))
    return;

  free_string (Data->name);
  top_stat--;
  Invalidate (Data);
  LinkSingle (Data, stat_free, next);
  top_stat_free++;
}

CorpseData *
new_corpse (void)
{
  CorpseData *Data;

  if (corpse_free != NULL)
    {
      Data = corpse_free;
      corpse_free = corpse_free->next;
      top_corpse_free--;
    }
  else
    {
      Data = (CorpseData *) alloc_perm (sizeof (CorpseData));
    }
  *Data = corpse_zero;
  top_corpse++;
  Data->next = Data->prev = NULL;
  Validate (Data);
  return Data;
}

void
free_corpse (CorpseData * Data)
{
  if (!IsValid (Data))
    return;

  if (Data->corpse != NULL)
    {
      free_obj (Data->corpse);
      Data->corpse = NULL;
    }
  top_corpse--;
  Invalidate (Data);
  LinkSingle (Data, corpse_free, next);
  top_corpse_free++;
}

AuctionData *
new_auction (void)
{
  AuctionData *Data;

  if (auction_free != NULL)
    {
      Data = auction_free;
      auction_free = auction_free->next;
      top_auction_free--;
    }
  else
    {
      Data = (AuctionData *) alloc_perm (sizeof (AuctionData));
    }
  *Data = auction_zero;
  top_auction++;
  Data->next = Data->prev = NULL;
  Validate (Data);
  return Data;
}

void
free_auction (AuctionData * Data)
{
  if (!IsValid (Data))
    return;

  Data->high_bidder = NULL;
  Data->item = NULL;
  Data->owner = NULL;
  top_auction--;
  Invalidate (Data);
  LinkSingle (Data, auction_free, next);
  top_auction_free++;
}

WebpassData *
new_wpwd (void)
{
  WebpassData *Data;

  if (wpwd_free != NULL)
    {
      Data = wpwd_free;
      wpwd_free = wpwd_free->next;
      top_wpwd_free--;
    }
  else
    {
      Data = (WebpassData *) alloc_perm (sizeof (WebpassData));
    }
  *Data = wpwd_zero;
  top_wpwd++;
  Data->next = Data->prev = NULL;
  Data->name = &str_empty[0];
  Data->passw = &str_empty[0];
  Validate (Data);
  return Data;
}

void
free_wpwd (WebpassData * Data)
{
  if (!IsValid (Data))
    return;

  free_string (Data->name);
  free_string (Data->passw);
  top_wpwd--;
  Invalidate (Data);
  LinkSingle (Data, wpwd_free, next);
  top_wpwd_free++;
}

RaceData *
new_race (void)
{
  RaceData *Data;

  if (race_free != NULL)
    {
      Data = race_free;
      race_free = race_free->next;
      top_race_free--;
    }
  else
    {
      Data = (RaceData *) alloc_perm (sizeof (RaceData));
    }
  *Data = race_zero;
  top_race++;
  Data->next = Data->prev = NULL;

  Data->name = &str_empty[0];
  Data->description = &str_empty[0];
  Data->pc_race = false;
  Data->act = 0;
  Data->aff = 0;
  Data->off = 0;
  Data->imm = 0;
  Data->res = 0;
  Data->vuln = 0;
  Data->form = 0;
  Data->parts = 0;
  set_array (Data->skills, &str_empty[0], MAX_RACE_SKILL);
  memset (Data->stats, 0, STAT_MAX);
  memset (Data->max_stats, 0, STAT_MAX);
  alloc_mem (Data->class_mult, int, top_class);

  Data->points = 0;
  Data->size = SIZE_MEDIUM;
  Validate (Data);
  return Data;
}

void
free_race (RaceData * Data)
{
  int x;

  if (!IsValid (Data))
    return;

  free_string (Data->name);
  free_string (Data->description);
  for (x = 0; x < MAX_RACE_SKILL; x++)
    free_string (Data->skills[x]);
  free_mem (Data->class_mult);
  top_race--;
  Invalidate (Data);
  LinkSingle (Data, race_free, next);
  top_race_free++;
}

ClanMember *
new_mbr (void)
{
  ClanMember *Data;

  if (mbr_free != NULL)
    {
      Data = mbr_free;
      mbr_free = mbr_free->next;
      top_mbr_free--;
    }
  else
    {
      Data = (ClanMember *) alloc_perm (sizeof (ClanMember));
    }
  *Data = mbr_zero;
  top_mbr++;
  Data->next = Data->prev = NULL;
  Data->name = &str_empty[0];
  Data->clan = NULL;
  Data->rank = 0;
  Validate (Data);
  return Data;
}

void
free_mbr (ClanMember * Data)
{
  if (!IsValid (Data))
    return;

  free_string (Data->name);
  top_mbr--;
  Invalidate (Data);
  LinkSingle (Data, mbr_free, next);
  top_mbr_free++;
}

SocialData *
new_social (void)
{
  SocialData *Data;

  if (social_free != NULL)
    {
      Data = social_free;
      social_free = social_free->next;
      top_social_free--;
    }
  else
    {
      Data = (SocialData *) alloc_perm (sizeof (SocialData));
    }
  *Data = social_zero;
  top_social++;
  Data->next = Data->prev = NULL;
  Data->name = &str_empty[0];
  Data->char_no_arg = &str_empty[0];
  Data->others_no_arg = &str_empty[0];
  Data->char_found = &str_empty[0];
  Data->others_found = &str_empty[0];
  Data->vict_found = &str_empty[0];
  Data->char_not_found = &str_empty[0];
  Data->char_auto = &str_empty[0];
  Data->others_auto = &str_empty[0];
  Validate (Data);
  return Data;
}

void
free_social (SocialData * Data)
{
  if (!IsValid (Data))
    return;

  free_string (Data->name);
  free_string (Data->char_no_arg);
  free_string (Data->others_no_arg);
  free_string (Data->char_found);
  free_string (Data->others_found);
  free_string (Data->vict_found);
  free_string (Data->char_not_found);
  free_string (Data->char_auto);
  free_string (Data->others_auto);
  top_social--;
  Invalidate (Data);
  LinkSingle (Data, social_free, next);
  top_social_free++;
}

DeityData *
new_deity (void)
{
  DeityData *Data;

  if (deity_free != NULL)
    {
      Data = deity_free;
      deity_free = deity_free->next;
      top_deity_free--;
    }
  else
    {
      Data = (DeityData *) alloc_perm (sizeof (DeityData));
    }
  *Data = deity_zero;
  top_deity++;
  Data->next = Data->prev = NULL;
  Data->name = &str_empty[0];
  Data->desc = &str_empty[0];
  Data->skillname = &str_empty[0];
  Data->ethos = ETHOS_TRUE_NEUTRAL;
  Validate (Data);
  return Data;
}

void
free_deity (DeityData * Data)
{
  if (!IsValid (Data))
    return;

  free_string (Data->name);
  free_string (Data->desc);
  free_string (Data->skillname);
  top_deity--;
  Invalidate (Data);
  LinkSingle (Data, deity_free, next);
  top_deity_free++;
}

ClanData *
new_clan (void)
{
  ClanData *Data;
  int x;

  if (clan_free != NULL)
    {
      Data = clan_free;
      clan_free = clan_free->next;
      top_clan_free--;
    }
  else
    {
      Data = (ClanData *) alloc_perm (sizeof (ClanData));
    }
  *Data = clan_zero;
  top_clan++;
  Data->next = Data->prev = NULL;

  Data->name = &str_empty[0];
  Data->who_name = &str_empty[0];
  Data->description = &str_empty[0];
  Data->ethos = ETHOS_TRUE_NEUTRAL;
  for (x = 0; x < MAX_RANK; x++)
    Data->rank[x].rankname = &str_empty[0];
  Validate (Data);
  return Data;
}

void
free_clan (ClanData * Data)
{
  int x;

  if (!IsValid (Data))
    return;

  free_string (Data->name);
  free_string (Data->who_name);
  free_string (Data->description);
  for (x = 0; x < MAX_RANK; x++)
    free_string (Data->rank[x].rankname);
  top_clan--;
  Invalidate (Data);
  LinkSingle (Data, clan_free, next);
  top_clan_free++;
}

CmdData *
new_cmd (void)
{
  CmdData *Data;

  if (cmd_free != NULL)
    {
      Data = cmd_free;
      cmd_free = cmd_free->next;
      top_cmd_free--;
    }
  else
    {
      Data = (CmdData *) alloc_perm (sizeof (CmdData));
    }
  *Data = cmd_zero;
  top_cmd++;
  Data->next = Data->prev = NULL;
  Data->name = &str_empty[0];
  Data->do_fun = do_null;
  Data->level = 0;
  Data->position = POS_DEAD;
  Data->category = CMDCAT_NOSHOW;
  Data->log = LOG_NORMAL;
  Validate (Data);
  return Data;
}

void
free_cmd (CmdData * Data)
{
  if (!IsValid (Data))
    return;

  free_string (Data->name);
  top_cmd--;
  Invalidate (Data);
  LinkSingle (Data, cmd_free, next);
  top_cmd_free++;
}

ResetData *
new_reset (void)
{
  ResetData *Data;

  if (reset_free != NULL)
    {
      Data = reset_free;
      reset_free = reset_free->next;
      top_reset_free--;
    }
  else
    {
      Data = (ResetData *) alloc_perm (sizeof (ResetData));
    }
  *Data = reset_zero;
  top_reset++;
  Data->next = Data->prev = NULL;
  Data->command = 'X';
  Data->arg1 = 0;
  Data->arg2 = 0;
  Data->arg3 = 0;
  Data->arg4 = 0;
  Validate (Data);
  return Data;
}

void
free_reset (ResetData * Data)
{
  if (!IsValid (Data))
    return;

  top_reset--;
  Invalidate (Data);
  LinkSingle (Data, reset_free, next);
  top_reset_free++;
}

AreaData *
new_area (void)
{
  AreaData *Data;

  if (area_free != NULL)
    {
      Data = area_free;
      area_free = area_free->next;
      top_area_free--;
    }
  else
    {
      Data = (AreaData *) alloc_perm (sizeof (AreaData));
    }
  *Data = area_zero;
  top_area++;
  Data->next = Data->prev = NULL;
  Data->name = str_dup ("New area");
  Data->area_flags = 0;
  Data->security = 9;
  Data->builders = str_dup ("None");
  Data->credits = &str_empty[0];
  Data->lvl_comment = &str_empty[0];
  Data->resetmsg = &str_empty[0];
  Data->min_level = 0;
  Data->max_level = MAX_LEVEL;
  Data->version = 0;
  Data->min_vnum = 0;
  Data->max_vnum = 0;
  Data->weather.temp = 0;
  Data->weather.precip = 0;
  Data->weather.wind = 0;
  Data->weather.temp_vector = 0;
  Data->weather.precip_vector = 0;
  Data->weather.wind_vector = 0;
  Data->weather.climate_temp = 2;
  Data->weather.climate_precip = 2;
  Data->weather.climate_wind = 2;
  Data->weather.echo = &str_empty[0];
  Data->weather.echo_color = &str_empty[0];
  Data->age = 32;
  Data->nplayer = 0;
  Data->vnum = top_area;
  Data->sound = NULL;
  Data->empty = true;
  Data->file_name = str_dupf ("area%d.are", Data->vnum);
  Data->clan = NULL;
  Validate (Data);
  return Data;
}

void
free_area (AreaData * Data)
{
  if (!IsValid (Data))
    return;

  free_string (Data->name);
  free_string (Data->file_name);
  free_string (Data->builders);
  free_string (Data->lvl_comment);
  free_string (Data->credits);
  free_string (Data->resetmsg);
  top_area--;
  Invalidate (Data);
  LinkSingle (Data, area_free, next);
  top_area_free++;
}

ExitData *
new_exit (void)
{
  ExitData *Data;

  if (exit_free != NULL)
    {
      Data = exit_free;
      exit_free = exit_free->next;
      top_exit_free--;
    }
  else
    {
      Data = (ExitData *) alloc_perm (sizeof (ExitData));
    }
  *Data = exit_zero;
  top_exit++;
  Data->next = Data->prev = NULL;
  Data->u1.to_room = NULL;
  Data->exit_info = 0;
  Data->key = 0;
  Data->keyword = &str_empty[0];
  Data->description = &str_empty[0];
  Data->rs_flags = 0;
  Validate (Data);
  return Data;
}

void
free_exit (ExitData * Data)
{
  if (!IsValid (Data))
    return;

  free_string (Data->keyword);
  free_string (Data->description);
  top_exit--;
  Invalidate (Data);
  LinkSingle (Data, exit_free, next);
  top_exit_free++;
}

RoomIndex *
new_room_index (void)
{
  RoomIndex *Data;
  int door;

  if (room_index_free != NULL)
    {
      Data = room_index_free;
      room_index_free = room_index_free->next;
      top_room_index_free--;
    }
  else
    {
      Data = (RoomIndex *) alloc_perm (sizeof (RoomIndex));
    }
  *Data = room_index_zero;
  top_room_index++;
  Data->next = Data->prev = NULL;

  Data->person_first = NULL;
  Data->content_first = NULL;
  Data->ed_first = NULL;
  Data->area = NULL;

  for (door = 0; door < MAX_DIR; door++)
    Data->exit[door] = NULL;

  Data->name = &str_empty[0];
  Data->description = &str_empty[0];
  Data->owner = &str_empty[0];
  Data->vnum = 0;
  Data->room_flags = 0;
  Data->light = 0;
  Data->sector_type = SECT_NONE;
  Data->heal_rate = 100;
  Data->mana_rate = 100;
  Data->guild = -1;
  Validate (Data);
  return Data;
}

void
free_room_index (RoomIndex * Data)
{
  int door;
  ExDescrData *pExtra;
  ResetData *pReset;
  ProgList *rp;

  if (!IsValid (Data))
    return;

  free_string (Data->name);
  free_string (Data->description);
  free_string (Data->owner);

  for (rp = Data->rprog_first; rp; rp = rp->next)
    free_prog_list (rp);

  for (door = 0; door < MAX_DIR; door++)
    if (Data->exit[door])
      free_exit (Data->exit[door]);

  for (pExtra = Data->ed_first; pExtra; pExtra = pExtra->next)
    free_ed (pExtra);

  for (pReset = Data->reset_first; pReset; pReset = pReset->next)
    free_reset (pReset);
  top_room_index--;
  Invalidate (Data);
  LinkSingle (Data, room_index_free, next);
  top_room_index_free++;
}

ShopData *
new_shop (void)
{
  ShopData *Data;

  if (shop_free != NULL)
    {
      Data = shop_free;
      shop_free = shop_free->next;
      top_shop_free--;
    }
  else
    {
      Data = (ShopData *) alloc_perm (sizeof (ShopData));
    }
  *Data = shop_zero;
  top_shop++;
  Data->next = Data->prev = NULL;
  Data->keeper = 0;
  memset (Data->buy_type, 0, MAX_TRADE);
  Data->profit_buy = 100;
  Data->profit_sell = 100;
  Data->open_hour = 0;
  Data->close_hour = 23;
  Validate (Data);
  return Data;
}

void
free_shop (ShopData * Data)
{
  if (!IsValid (Data))
    return;

  top_shop--;
  Invalidate (Data);
  LinkSingle (Data, shop_free, next);
  top_shop_free++;
}

ObjIndex *
new_obj_index (void)
{
  ObjIndex *Data;

  if (obj_index_free != NULL)
    {
      Data = obj_index_free;
      obj_index_free = obj_index_free->next;
      top_obj_index_free--;
    }
  else
    {
      Data = (ObjIndex *) alloc_perm (sizeof (ObjIndex));
    }
  *Data = obj_index_zero;
  top_obj_index++;
  Data->next = Data->prev = NULL;
  Data->ed_first = NULL;
  Data->affect_first = NULL;
  Data->area = NULL;
  Data->name = str_dup ("no name");
  Data->short_descr = str_dup ("(no short description)");
  Data->description = str_dup ("(no description)");
  Data->vnum = 0;
  Data->item_type = ITEM_TRASH;
  Data->extra_flags = 0;
  Data->wear_flags = 0;
  Data->count = 0;
  Data->weight = 0;
  Data->cost = 0;
  Data->material = str_dup ("unknown");
  Data->condition = 100;
  memset (Data->value, 0, 5);
  Data->new_format = true;
  Validate (Data);
  return Data;
}

void
free_obj_index (ObjIndex * Data)
{
  ExDescrData *pExtra;
  AffectData *pAf;
  ProgList *op;

  if (!IsValid (Data))
    return;

  free_string (Data->name);
  free_string (Data->short_descr);
  free_string (Data->description);

  for (op = Data->oprog_first; op; op = op->next)
    free_prog_list (op);

  for (pAf = Data->affect_first; pAf; pAf = pAf->next)
    free_affect (pAf);

  for (pExtra = Data->ed_first; pExtra; pExtra = pExtra->next)
    free_ed (pExtra);
  top_obj_index--;
  Invalidate (Data);
  LinkSingle (Data, obj_index_free, next);
  top_obj_index_free++;
}

CharIndex *
new_char_index (void)
{
  CharIndex *Data;
  int i;

  if (char_index_free != NULL)
    {
      Data = char_index_free;
      char_index_free = char_index_free->next;
      top_char_index_free--;
    }
  else
    {
      Data = (CharIndex *) alloc_perm (sizeof (CharIndex));
    }
  *Data = char_index_zero;
  top_char_index++;
  Data->next = Data->prev = NULL;

  Data->spec_fun = NULL;
  Data->pShop = NULL;
  Data->area = NULL;
  Data->player_name = str_dup ("no name");
  Data->short_descr = str_dup ("(no short description)");
  Data->long_descr = str_dup ("(no long description)" NEWLINE);
  Data->description = &str_empty[0];
  Data->vnum = 0;
  Data->count = 0;
  Data->kills = 0;
  Data->deaths = 0;
  Data->sex = SEX_NEUTRAL;
  Data->level = 0;
  Data->act = ACT_IS_NPC;
  Data->affected_by = 0;
  Data->alignment = 0;
  Data->hitroll = 0;
  Data->race = default_race;
  Data->form = 0;
  Data->parts = 0;
  Data->imm_flags = 0;
  Data->res_flags = 0;
  Data->vuln_flags = 0;
  Data->material = str_dup ("unknown");
  Data->off_flags = 0;
  Data->size = SIZE_MEDIUM;
  for (i = 0; i < MAX_AC; i++)
    Data->ac[i] = 0;
  for (i = 0; i < DICE_MAX; i++)
    {
      Data->hit[i] = 0;
      Data->mana[i] = 0;
      Data->damage[i] = 0;
    }
  Data->start_pos = POS_STANDING;
  Data->default_pos = POS_STANDING;
  Data->wealth = 0;
  Data->new_format = true;
  Validate (Data);
  return Data;
}

void
free_char_index (CharIndex * Data)
{
  ProgList *mp;

  if (!IsValid (Data))
    return;

  free_string (Data->player_name);
  free_string (Data->short_descr);
  free_string (Data->long_descr);
  free_string (Data->description);

  for (mp = Data->mprog_first; mp; mp = mp->next)
    free_prog_list (mp);

  if (Data->pShop)
    free_shop (Data->pShop);
  top_char_index--;
  Invalidate (Data);
  LinkSingle (Data, char_index_free, next);
  top_char_index_free++;
}

ProgCode *
new_mprog (void)
{
  ProgCode *Data;

  if (mprog_free != NULL)
    {
      Data = mprog_free;
      mprog_free = mprog_free->next;
      top_mprog_free--;
    }
  else
    {
      Data = (ProgCode *) alloc_perm (sizeof (ProgCode));
    }
  *Data = mprog_zero;
  top_mprog++;
  Data->next = Data->prev = NULL;
  Data->vnum = 0;
  Data->code = &str_empty[0];
  Data->area = NULL;
  Validate (Data);
  return Data;
}

void
free_mprog (ProgCode * Data)
{
  if (!IsValid (Data))
    return;

  free_string (Data->code);
  top_mprog--;
  Invalidate (Data);
  LinkSingle (Data, mprog_free, next);
  top_mprog_free++;
}

ProgCode *
new_oprog (void)
{
  ProgCode *Data;

  if (oprog_free != NULL)
    {
      Data = oprog_free;
      oprog_free = oprog_free->next;
      top_oprog_free--;
    }
  else
    {
      Data = (ProgCode *) alloc_perm (sizeof (ProgCode));
    }
  *Data = oprog_zero;
  top_oprog++;
  Data->next = Data->prev = NULL;
  Data->vnum = 0;
  Data->code = &str_empty[0];
  Data->area = NULL;
  Validate (Data);
  return Data;
}

void
free_oprog (ProgCode * Data)
{
  if (!IsValid (Data))
    return;

  free_string (Data->code);
  top_oprog--;
  Invalidate (Data);
  LinkSingle (Data, oprog_free, next);
  top_oprog_free++;
}

ProgCode *
new_rprog (void)
{
  ProgCode *Data;

  if (rprog_free != NULL)
    {
      Data = rprog_free;
      rprog_free = rprog_free->next;
      top_rprog_free--;
    }
  else
    {
      Data = (ProgCode *) alloc_perm (sizeof (ProgCode));
    }
  *Data = rprog_zero;
  top_rprog++;
  Data->next = Data->prev = NULL;
  Data->vnum = 0;
  Data->code = &str_empty[0];
  Data->area = NULL;
  Validate (Data);
  return Data;
}

void
free_rprog (ProgCode * Data)
{
  if (!IsValid (Data))
    return;

  free_string (Data->code);
  top_rprog--;
  Invalidate (Data);
  LinkSingle (Data, rprog_free, next);
  top_rprog_free++;
}

GqData *
new_gqlist (void)
{
  GqData *Data;

  if (gqlist_free != NULL)
    {
      Data = gqlist_free;
      gqlist_free = gqlist_free->next;
      top_gqlist_free--;
    }
  else
    {
      Data = (GqData *) alloc_perm (sizeof (GqData));
    }
  *Data = gqlist_zero;
  top_gqlist++;
  Data->next = Data->prev = NULL;
  Validate (Data);
  return Data;
}

void
free_gqlist (GqData * Data)
{
  if (!IsValid (Data))
    return;

  if (Data->gq_mobs)
    free_mem (Data->gq_mobs);
  if (Data->ch)
    Data->ch->gquest = NULL;
  top_gqlist--;
  Invalidate (Data);
  LinkSingle (Data, gqlist_free, next);
  top_gqlist_free++;
}

WarData *
new_warlist (void)
{
  WarData *Data;

  if (warlist_free != NULL)
    {
      Data = warlist_free;
      warlist_free = warlist_free->next;
      top_warlist_free--;
    }
  else
    {
      Data = (WarData *) alloc_perm (sizeof (WarData));
    }
  *Data = warlist_zero;
  top_warlist++;
  Data->next = Data->prev = NULL;
  Validate (Data);
  return Data;
}

void
free_warlist (WarData * Data)
{
  if (!IsValid (Data))
    return;

  if (Data->ch)
    {
      if (!IsNPC (Data->ch))
	Data->ch->war = NULL;
      else
	extract_char (Data->ch, true);
    }
  top_warlist--;
  Invalidate (Data);
  LinkSingle (Data, warlist_free, next);
  top_warlist_free++;
}

DisabledData *
new_disabled (void)
{
  DisabledData *Data;

  if (disabled_free != NULL)
    {
      Data = disabled_free;
      disabled_free = disabled_free->next;
      top_disabled_free--;
    }
  else
    {
      Data = (DisabledData *) alloc_perm (sizeof (DisabledData));
    }
  *Data = disabled_zero;
  top_disabled++;
  Data->next = Data->prev = NULL;
  Data->disabled_by = &str_empty[0];
  Data->disabled_for = &str_empty[0];
  Validate (Data);
  return Data;
}

void
free_disabled (DisabledData * Data)
{
  if (!IsValid (Data))
    return;

  free_string (Data->disabled_by);
  free_string (Data->disabled_for);
  top_disabled--;
  Invalidate (Data);
  LinkSingle (Data, disabled_free, next);
  top_disabled_free++;
}

#ifdef STFILEIO

stFile *
new_stfile (void)
{
  stFile *Data;

  if (stfile_free != NULL)
    {
      Data = stfile_free;
      stfile_free = stfile_free->next;
      top_stfile_free--;
    }
  else
    {
      Data = (stFile *) alloc_perm (sizeof (stFile));
    }
  *Data = stfile_zero;
  top_stfile++;
  Data->next = Data->prev = NULL;
  Data->str = NULL;
  Data->file = &str_empty[0];
#ifndef WIN32

  Data->temp = &str_empty[0];
#endif

  Data->stream = NULL;
  Data->mode = &str_empty[0];
  Validate (Data);
  return Data;
}

void
free_stfile (stFile * Data)
{
  if (!IsValid (Data))
    return;
#ifndef WIN32

  free_string (Data->temp);
#endif

  free_string (Data->mode);
  if (Data->str != NULL)
    free_mem (Data->str);
  if (Data->stream)
    file_close (Data->stream);
  free_string (Data->file);
  top_stfile--;
  Invalidate (Data);
  LinkSingle (Data, stfile_free, next);
  top_stfile_free++;
}

#endif


void
free_note (NoteData * Data)
{
  if (!IsValid (Data))
    return;

  free_string (Data->sender);
  free_string (Data->to_list);
  free_string (Data->subject);
  free_string (Data->date);
  free_string (Data->text);
  top_note--;
  Invalidate (Data);
  LinkSingle (Data, note_free, next);
  top_note_free++;
}


NoteData *
new_note (void)
{
  NoteData *Data;

  if (note_free != NULL)
    {
      Data = note_free;
      note_free = note_free->next;
      top_note_free--;
    }
  else
    {
      Data = (NoteData *) alloc_perm (sizeof (NoteData));
    }
  *Data = note_zero;
  top_note++;
  Data->next = Data->prev = NULL;
  Data->sender = NULL;
  Data->expire = 0;
  Data->to_list = NULL;
  Data->subject = NULL;
  Data->date = NULL;
  Data->date_stamp = 0;
  Data->text = NULL;
  Validate (Data);
  return Data;
}

#ifndef DISABLE_WEBSRV
WebDescriptor *
new_webdesc (void)
{
  WebDescriptor *Data;

  if (webdesc_free != NULL)
    {
      Data = webdesc_free;
      webdesc_free = webdesc_free->next;
      top_webdesc_free--;
    }
  else
    {
      Data = (WebDescriptor *) alloc_perm (sizeof (WebDescriptor));
    }
  *Data = webdesc_zero;
  top_webdesc++;
  Data->next = Data->prev = NULL;
  Data->request[0] = NUL;
  Validate (Data);
  return Data;
}

void
free_webdesc (WebDescriptor * Data)
{
  if (!IsValid (Data))
    return;

  Data->request[0] = NUL;
  top_webdesc--;
  Invalidate (Data);
  LinkSingle (Data, webdesc_free, next);
  top_webdesc_free++;
}
#endif

MspData *
new_msp (void)
{
  MspData *Data;

  if (msp_free != NULL)
    {
      Data = msp_free;
      msp_free = msp_free->next;
      top_msp_free--;
    }
  else
    {
      Data = (MspData *) alloc_perm (sizeof (MspData));
    }
  *Data = msp_zero;
  top_msp++;
  Data->next = Data->prev = NULL;
  Data->file = &str_empty[0];
  Data->url = &str_empty[0];
  Data->type = MSP_NONE;
  Data->volume = 100;
  Data->loop = 1;
  Data->priority = 50;
  Data->restart = false;
  Validate (Data);
  return Data;
}

void
free_msp (MspData * Data)
{
  if (!IsValid (Data))
    return;

  free_string (Data->file);
  free_string (Data->url);
  top_msp--;
  Invalidate (Data);
  LinkSingle (Data, msp_free, next);
  top_msp_free++;
}

Column *
new_column (void)
{
  Column *Data;

  if (column_free != NULL)
    {
      Data = column_free;
      column_free = column_free->next;
      top_column_free--;
    }
  else
    {
      Data = (Column *) alloc_perm (sizeof (Column));
    }
  *Data = column_zero;
  top_column++;
  Data->next = Data->prev = NULL;
  Validate (Data);
  return Data;
}

void
free_column (Column * Data)
{
  if (!IsValid (Data))
    return;

  top_column--;
  Invalidate (Data);
  LinkSingle (Data, column_free, next);
  top_column_free++;
}

NameProfile *
new_name_profile (void)
{
  NameProfile *Data;
  int i;

  if (name_profile_free != NULL)
    {
      Data = name_profile_free;
      name_profile_free = name_profile_free->next;
      top_name_profile_free--;
    }
  else
    {
      Data = (NameProfile *) alloc_perm (sizeof (NameProfile));
    }
  *Data = name_profile_zero;
  top_name_profile++;
  Data->next = Data->prev = NULL;
  Data->title = &str_empty[0];
  for (i = 0; i < MAX_PARTS; i++)
    {
      Data->part[i] = &str_empty[0];
      Data->part_count[i] = 0;
    }
  Validate (Data);
  return Data;
}

void
free_name_profile (NameProfile * Data)
{
  int i;

  if (!IsValid (Data))
    return;

  top_name_profile--;
  free_string (Data->title);
  for (i = 0; i < MAX_PARTS; i++)
    free_string (Data->part[i]);
  Invalidate (Data);
  LinkSingle (Data, name_profile_free, next);
  top_name_profile_free++;
}

NameList *
new_namelist (void)
{
  NameList *Data;

  if (namelist_free != NULL)
    {
      Data = namelist_free;
      namelist_free = namelist_free->next;
      top_namelist_free--;
    }
  else
    {
      Data = (NameList *) alloc_perm (sizeof (NameList));
    }
  *Data = namelist_zero;
  top_namelist++;
  Data->next = Data->prev = NULL;
  Data->name = &str_empty[0];
  Validate (Data);
  return Data;
}

void
free_namelist (NameList * Data)
{
  if (!IsValid (Data))
    return;

  top_namelist--;
  free_string (Data->name);
  Invalidate (Data);
  LinkSingle (Data, namelist_free, next);
  top_namelist_free++;
}



WizData *
new_wiz (void)
{
  WizData *Data;

  if (wiz_free != NULL)
    {
      Data = wiz_free;
      wiz_free = wiz_free->next;
      top_wiz_free--;
    }
  else
    {
      Data = (WizData *) alloc_perm (sizeof (WizData));
    }
  *Data = wiz_zero;
  top_wiz++;
  Data->next = Data->prev = NULL;
  Data->name = &str_empty[0];
  Data->email = &str_empty[0];
  Data->jobs = &str_empty[0];
  Validate (Data);
  return Data;
}

void
free_wiz (WizData * Data)
{
  if (!IsValid (Data))
    return;

  top_wiz--;
  free_string (Data->name);
  free_string (Data->email);
  free_string (Data->jobs);
  Invalidate (Data);
  LinkSingle (Data, wiz_free, next);
  top_wiz_free++;
}