muddy/
muddy/CVS/
muddy/area/
muddy/area/CVS/
muddy/clans/CVS/
muddy/classes/CVS/
muddy/doc/
muddy/doc/CVS/
muddy/etc/CVS/
muddy/etc/i3/
muddy/etc/i3/CVS/
muddy/imc/CVS/
muddy/lang/CVS/
muddy/licenses/CVS/
muddy/msgdb/CVS/
muddy/new/CVS/
muddy/notes/
muddy/player/
muddy/races/CVS/
muddy/religions/CVS/
muddy/src/CVS/
muddy/src/comm/CVS/
muddy/src/db/CVS/
muddy/src/intermud/
muddy/src/intermud/CVS/
muddy/src/irc/CVS/
muddy/src/olc/CVS/
/*  $Id: olc_cmd.c,v 1.666 2004/09/20 10:50:30 shrike Exp $ */

/************************************************************************************
 *    Copyright 2004 Astrum Metaphora consortium                                    *
 *                                                                                  *
 *    Licensed under the Apache License, Version 2.0 (the "License");               *
 *    you may not use this file except in compliance with the License.              *
 *    You may obtain a copy of the License at                                       *
 *                                                                                  *
 *    http://www.apache.org/licenses/LICENSE-2.0                                    *
 *                                                                                  *
 *    Unless required by applicable law or agreed to in writing, software           *
 *    distributed under the License is distributed on an "AS IS" BASIS,             *
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.      *
 *    See the License for the specific language governing permissions and           *
 *    limitations under the License.                                                *
 *                                                                                  *
 ************************************************************************************/

#include <stdio.h>
#include <string.h>

#include "merc.h"
#include "olc.h"
#include "db/cmd.h"

#define EDIT_COMMAND(ch, command)   (command = (command_t*) ch->desc->pEdit)

DECLARE_OLC_FUN(commanded_create        );
DECLARE_OLC_FUN(commanded_edit      );
DECLARE_OLC_FUN(commanded_show      );
DECLARE_OLC_FUN(commanded_list      );

DECLARE_OLC_FUN(commanded_name      );
DECLARE_OLC_FUN(commanded_min_pos   );
DECLARE_OLC_FUN(commanded_level           );
DECLARE_OLC_FUN(commanded_log       );
DECLARE_OLC_FUN(commanded_dofun     );
DECLARE_OLC_FUN(commanded_flags     );

static DECLARE_VALIDATE_FUN(validate_name);

olc_cmd_t olc_cmds_command[] =
{
    { "create",         commanded_create,       5                     },
    { "edit",           commanded_edit,         2                     },
    { "touch",          olced_dummy,            0                     },
    { "show",           commanded_show,         0                     },
    { "list",           commanded_list,         0                     },

    { "name",           commanded_name,         0,      validate_name },
    { "min_pos",        commanded_min_pos,      0,      position_table},
    { "level",          commanded_level,        0,                    },
    { "log",            commanded_log,          0,      log_flags     },
    { "flags",          commanded_flags,        0,      command_flags },
    { "function",       commanded_dofun,        0,      dofun_table   },

    { "commands",       show_commands,          0                     },
    { NULL}
};

OLC_FUN(commanded_create)
{
    command_t *command;
    char arg[MAX_STRING_LENGTH];

    if (ch->pcdata->security < SECURITY_COMMANDS)
    {
        char_puts("CommandEd: Insufficient security for creating commands\n",  ch);
        return FALSE;
    }

    one_argument(argument, arg, sizeof(arg));
    if (arg[0] == '\0')
    {
        do_help(ch, "'OLC CREATE'");
        return FALSE;
    }

    if ((command = command_lookup(arg, str_cmp)) != NULL)
    {
        char_printf(ch, "CommandEd: %s: already exists.\n", command->name);
        return FALSE;
    }

    command         = command_new();
    command->name   = str_dup(arg);

    ch->desc->pEdit = (void *) command;

    OLCED(ch)   = olced_lookup(ED_COMMAND);
    char_puts("Command created.\n",ch);
    return FALSE;
}

OLC_FUN(commanded_edit)
{
    command_t *command;
    char       arg[MAX_STRING_LENGTH];

    if (ch->pcdata->security < SECURITY_COMMANDS)
    {
        char_puts("CommandEd: Insufficient security.\n", ch);
        return FALSE;
    }

    one_argument(argument, arg, sizeof(arg));
    if (arg[0] == '\0')
    {
        do_help(ch, "'OLC EDIT'");
        return FALSE;
    }

    if ((command = command_lookup(arg, str_cmp)) == NULL)
    {
        char_printf(ch, "CommandEd: %s: No such command.\n", arg);
        return FALSE;
    }

    ch->desc->pEdit = command;
    OLCED(ch)   = olced_lookup(ED_COMMAND);
    return FALSE;
}

OLC_FUN(commanded_show)
{
    char arg[MAX_STRING_LENGTH];
    BUFFER *output;
    command_t *command;

    one_argument(argument, arg, sizeof(arg));
    if (arg[0] == '\0')
    {
        if (IS_EDIT(ch, ED_COMMAND))
            EDIT_COMMAND(ch, command);
        else
        {
            do_help(ch, "'OLC ASHOW'");
            return FALSE;
        }
    }
    else
    {
        if ((command = command_lookup(arg, str_cmp)) == NULL)
        {
            char_printf(ch, "CommandEd: %s: No such command.\n", arg);
            return FALSE;
        }
    }

    output = buf_new(-1);

                                buf_printf(output, "Name:          [%s]\n",      command->name);
    if (command->position)      buf_printf(output, "MinPos:        [%s]\n",      flag_string(position_table, command->position));
    if (command->do_fun)        buf_printf(output, "DoFun:         [%s]\n",      namedp_name(dofun_table, command->do_fun));
    if (command->level)         buf_printf(output, "Level:         [%d]\n",      command->level);
    if (command->log)           buf_printf(output, "Log:           [%s]\n",      flag_string(log_flags, command->log));
    if (command->flags)         buf_printf(output, "Flags:         [%s]\n",      flag_string(command_flags, command->flags));

    page_to_char(buf_string(output), ch);
    buf_free(output);

    return FALSE;
}

OLC_FUN(commanded_list)
{
    int i;
    int col = 0;
    char arg[MAX_STRING_LENGTH];

    one_argument(argument, arg, sizeof(arg));

    for (i = 0; i < commands.nused; i++)
    {
        command_t *command = (command_t*) VARR_GET(&commands, i);

        if (arg[0] && str_prefix(arg, command->name))
            continue;

        char_printf(ch, "%-12s", command->name);
        if (++col % 6 == 0)
            char_puts("\n", ch);
    }

    if (col % 6)
        char_puts("\n", ch);

    return FALSE;
}

OLC_FUN(commanded_name)
{
    command_t *command;
    EDIT_COMMAND(ch, command);
    return olced_str(ch, argument, cmd, &command->name);
}

OLC_FUN(commanded_min_pos)
{
    command_t *command;
    EDIT_COMMAND(ch, command);
    return olced_flag32(ch, argument, cmd, &command->position);
}

OLC_FUN(commanded_log)
{
    command_t *command;
    EDIT_COMMAND(ch, command);
    return olced_flag32(ch, argument, cmd, &command->log);
}

OLC_FUN(commanded_flags)
{
    command_t *command;
    EDIT_COMMAND(ch, command);
    return olced_flag32(ch, argument, cmd, &command->flags);
}

OLC_FUN(commanded_level)
{
    command_t *command;
    EDIT_COMMAND(ch, command);
    return olced_number(ch, argument, cmd, &command->level);
}

OLC_FUN(commanded_dofun)
{
      bool res;
      command_t *command;
      void *p;

     EDIT_COMMAND(ch, command);

     p = (void *) command->do_fun;
     res = olced_named_pointer(ch, argument, cmd, &p);
     command->do_fun =  (DO_FUN *) p;
     return res;
}

static VALIDATE_FUN(validate_name)
{
    const char *name = (const char*) arg;
    command_t *command, *command2;
    EDIT_COMMAND(ch, command);

    if (strpbrk(name, " \t"))
    {
        char_printf(ch, "CommandEd: %s: illegal character in command name.\n",  arg);
        return FALSE;
    }

    if ((command2 = command_lookup(name, str_cmp)) != NULL   &&  command2 != command)
    {
        char_printf(ch, "CommandEd: %s: duplicate command name.\n", arg);
        return FALSE;
    }

    return TRUE;
}