6D/
6D/area/
6D/boards/
6D/city/
6D/color/
6D/corpses/
6D/councils/
6D/htowns/
6D/news/
6D/specials/
6D/src/specials/
6D/src/trades/
/****************************************************************************
 * AFKMud Copyright 1997-2002 Alsherok. Contributors: Samson, Dwip, Whir,   *
 * Cyberfox, Karangi, Rathian, Cam, Raine, and Tarl.                        *
 * Original SMAUG 1.4a written by Thoric (Derek Snider) with Altrag,        *
 * Blodkai, Haus, Narn, Scryn, Swordbearer, Tricops, Gorog, Rennard,        *
 * Grishnakh, Fireblade, and Nivek.                                         *
 * Original MERC 2.1 code by Hatchet, Furey, and Kahn.                      *
 * Original DikuMUD code by: Hans Staerfeldt, Katja Nyboe, Tom Madsen,      *
 * Michael Seifert, and Sebastian Hammer.                                   *
 ****************************************************************************
 *                             Alias module                                 *
 ****************************************************************************/

/******************************************************
            Desolation of the Dragon MUD II
      (C) 1997, 1998  Jesse DeFer and Heath Leach
 http://dotd.mudservices.com  dotd@dotd.mudservices.com 
 ******************************************************/

#include <string.h>
#include "h/mud.h"

ALIAS_DATA             *find_alias(CHAR_DATA *ch, char *argument)
{
  ALIAS_DATA             *pal;
  char                    buf[MIL];

  if(!ch || !ch->pcdata)
    return (NULL);

  one_argument(argument, buf);

  for(pal = ch->pcdata->first_alias; pal; pal = pal->next)
    if(!str_prefix(buf, pal->name))
      return (pal);

  return (NULL);
}

void do_alias(CHAR_DATA *ch, char *argument)
{
  ALIAS_DATA             *pal = NULL;
  char                    arg[MIL];
  char                   *p;

  if(IS_NPC(ch))
    return;

  for(p = argument; *p != '\0'; p++)
  {
    if(*p == '~')
    {
      send_to_char("Command not acceptable, cannot use the ~ character.\r\n", ch);
      return;
    }
  }

  argument = one_argument(argument, arg);

  if(!*arg)
  {
    if(!ch->pcdata->first_alias)
    {
      send_to_char("You have no aliases defined!\r\n", ch);
      return;
    }
    pager_printf(ch, "%-20s What it does\r\n", "Alias");
    for(pal = ch->pcdata->first_alias; pal; pal = pal->next)
      pager_printf(ch, "%-20s %s\r\n", pal->name, pal->cmd);
    return;
  }

  if(!*argument)
  {
    if((pal = find_alias(ch, arg)) != NULL)
    {
      STRFREE(pal->name);
      STRFREE(pal->cmd);
      UNLINK(pal, ch->pcdata->first_alias, ch->pcdata->last_alias, next, prev);
      DISPOSE(pal);
      send_to_char("Deleted Alias.\r\n", ch);
    }
    else
      send_to_char("That alias does not exist.\r\n", ch);
    return;
  }

  if((pal = find_alias(ch, arg)) == NULL)
  {
    CREATE(pal, ALIAS_DATA, 1);
    pal->name = STRALLOC(arg);
    pal->cmd = STRALLOC(argument);
    LINK(pal, ch->pcdata->first_alias, ch->pcdata->last_alias, next, prev);
    send_to_char("Created Alias.\r\n", ch);
  }
  else
  {
    if(pal->cmd)
    STRFREE(pal->cmd);
    pal->cmd = STRALLOC(argument);
    send_to_char("Modified Alias.\r\n", ch);
  }
}

void free_aliases(CHAR_DATA *ch)
{
  ALIAS_DATA             *pal, *next_pal;

  if(!ch || !ch->pcdata)
    return;

  for(pal = ch->pcdata->first_alias; pal; pal = next_pal)
  {
    next_pal = pal->next;
    if(pal->name)
      STRFREE(pal->name);
    if(pal->cmd)
      STRFREE(pal->cmd);
    DISPOSE(pal);
  }
}

bool check_alias(CHAR_DATA *ch, char *command, char *argument)
{
  char                    arg[MIL];
  ALIAS_DATA             *alias;

  if((alias = find_alias(ch, command)) == NULL)
    return FALSE;

  if(!alias->cmd || !*alias->cmd)
    return FALSE;

  snprintf(arg, MIL, "%s", alias->cmd);

  if(ch->cmd_recurse == -1 || ++ch->cmd_recurse > 50)
  {
    if(ch->cmd_recurse != -1)
    {
      send_to_char("Unable to further process command, recurses too much.\r\n", ch);
      ch->cmd_recurse = -1;
    }
    return FALSE;
  }

  if(argument && *argument != '\0')
  {
    mudstrlcat(arg, " ", MSL);
    mudstrlcat(arg, argument, MSL);
  }

  interpret(ch, arg);
  return TRUE;
}