eotc-rot/data/helps/
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#include <sys/time.h>
#endif
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

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

#define HEDIT( fun )           bool fun(CHAR_DATA *ch, char*argument)
#define EDIT_HELP(ch, help)    ( help = (HELP_DATA *) ch->desc->pEdit )

extern HELP_AREA *had_list;

const struct olc_cmd_type hedit_table[] = {
/*    {    command        function    }, */

    {"keyword", hedit_keyword},
    {"text", hedit_text},
    {"new", hedit_new},
    {"level", hedit_level},
    {"commands", show_commands},
    {"delete", hedit_delete},
    {"list", hedit_list},
    {"show", hedit_show},
    {"?", show_help},

    {NULL, 0}
};

HELP_AREA *get_help_area (HELP_DATA * help)
{
    HELP_AREA *temp;
    HELP_DATA *thelp;

    for (temp = had_list; temp; temp = temp->next)
        for (thelp = temp->first; thelp; thelp = thelp->next_area)
            if (thelp == help)
                return temp;

    return NULL;
}

HEDIT (hedit_show)
{
    HELP_DATA *help;
    char buf[MSL * 2];

    EDIT_HELP (ch, help);

    sprintf (buf, "Keyword : [%s]\n\r"
             "Level   : [%d]\n\r"
             "Text    :\n\r"
             "%s-END-\n\r", help->keyword, help->level, help->text);
    send_to_char (buf, ch);

    return FALSE;
}

HEDIT (hedit_level)
{
    HELP_DATA *help;
    int lev;

    EDIT_HELP (ch, help);

    if (IS_NULLSTR (argument) || !is_number (argument))
    {
        send_to_char ("Syntax: level [-1..MAX_LEVEL]\n\r", ch);
        return FALSE;
    }

    lev = atoi (argument);

    if (lev < -1 || lev > MAX_LEVEL)
    {
        printf_to_char (ch, "HEdit : levels are between -1 and %d inclusive.\n\r",
                        MAX_LEVEL);
        return FALSE;
    }

    help->level = lev;
    send_to_char ("Ok.\n\r", ch);
    return TRUE;
}

HEDIT (hedit_keyword)
{
    HELP_DATA *help;

    EDIT_HELP (ch, help);

    if (IS_NULLSTR (argument))
    {
        send_to_char ("Syntax: keyword [keywords]\n\r", ch);
        return FALSE;
    }

    free_string (help->keyword);
    help->keyword = str_dup (argument);

    send_to_char ("Ok.\n\r", ch);
    return TRUE;
}

HEDIT (hedit_new)
{
    char arg[MIL], fullarg[MIL];
    HELP_AREA *had;
    HELP_DATA *help;
    extern HELP_DATA *help_last;

    if (IS_NULLSTR (argument))
    {
        send_to_char ("Syntax: new [name]\n\r", ch);
        send_to_char ("         new [area] [name]\n\r", ch);
        return FALSE;
    }

    strcpy (fullarg, argument);
    argument = one_argument (argument, arg);

    if (!(had = had_lookup (arg)))
    {
        had = ch->in_room->area->helps;
        argument = fullarg;
    }

    if (help_lookup (argument))
    {
        send_to_char ("HEdit : help exists.\n\r", ch);
        return FALSE;
    }

    if (!had)
    {                            /* the area has no helps */
        had = new_had ();
        had->filename = str_dup (ch->in_room->area->file_name);
        had->area = ch->in_room->area;
        had->first = NULL;
        had->last = NULL;
        had->changed = TRUE;
        had->next = had_list;
        had_list = had;
        ch->in_room->area->helps = had;
        SET_BIT (ch->in_room->area->area_flags, AREA_CHANGED);
    }

    help = new_help ();
    help->level = 0;
    help->keyword = str_dup (argument);
    help->text = str_dup ("");

    if (help_last)
        help_last->next = help;

    if (help_first == NULL)
        help_first = help;

    help_last = help;
    help->next = NULL;

    if (!had->first)
        had->first = help;
    if (!had->last)
        had->last = help;

    had->last->next_area = help;
    had->last = help;
    help->next_area = NULL;

    ch->desc->pEdit = (HELP_DATA *) help;
    ch->desc->editor = ED_HELP;

    send_to_char ("Ok.\n\r", ch);
    return FALSE;
}

HEDIT (hedit_text)
{
    HELP_DATA *help;

    EDIT_HELP (ch, help);

    if (!IS_NULLSTR (argument))
    {
        send_to_char ("Syntax: text\n\r", ch);
        return FALSE;
    }

    string_append (ch, &help->text);

    return TRUE;
}

void hedit (CHAR_DATA * ch, char *argument)
{
    HELP_DATA *pHelp;
    HELP_AREA *had;
    char arg[MAX_INPUT_LENGTH];
    char command[MAX_INPUT_LENGTH];
    int cmd;

    smash_tilde (argument);
    strcpy (arg, argument);
    argument = one_argument (argument, command);

    EDIT_HELP (ch, pHelp);

    had = get_help_area (pHelp);

    if (had == NULL)
    {
        bugf ("hedit : had for help %s NULL", pHelp->keyword);
        edit_done (ch);
        return;
    }

    if (ch->pcdata->security < 9)
    {
        send_to_char ("HEdit: Insufficient security to edit helps.\n\r",
                      ch);
        edit_done (ch);
        return;
    }

    if (command[0] == '\0')
    {
        hedit_show (ch, argument);
        return;
    }

    if (!str_cmp (command, "done"))
    {
        edit_done (ch);
        return;
    }

    for (cmd = 0; hedit_table[cmd].name != NULL; cmd++)
    {
        if (!str_prefix (command, hedit_table[cmd].name))
        {
            if ((*hedit_table[cmd].olc_fun) (ch, argument))
                had->changed = TRUE;
            return;
        }
    }

    interpret (ch, arg);
    return;
}

/*
void do_hedit (CHAR_DATA * ch, char *argument)
{
    HELP_DATA *pHelp;

    if (IS_NPC (ch))
        return;

	
    if ((pHelp = help_lookup (argument)) == NULL)
    {
        send_to_char ("HEdit : Help doesn't exist.\n\r", ch);
        return;
    }

    ch->desc->pEdit = (void *) pHelp;
    ch->desc->editor = ED_HELP;

    return;
}
*/

void do_hedit( CHAR_DATA *ch, char *argument )
{
	HELP_DATA *pHelp;
	char arg1[MIL];
	char argall[MAX_INPUT_LENGTH],argone[MAX_INPUT_LENGTH];
	bool found = FALSE;

	strcpy(arg1,argument);
						    
	if(argument[0] != '\0')
	{
		/* Taken from do_help */
		argall[0] = '\0';
		while (argument[0] != '\0' )
		{
			argument = one_argument(argument,argone);
			if (argall[0] != '\0')
				strcat(argall," ");
			strcat(argall,argone);
		}
		for ( pHelp = help_first; pHelp != NULL; pHelp = pHelp->next )
		{
			if ( is_name( argall, pHelp->keyword ) )
			{
				ch->desc->pEdit=(void *)pHelp;
				ch->desc->editor= ED_HELP;
				found = TRUE;
				return;
			}
		}
	}
	if(!found)
	{
		argument = one_argument(arg1, arg1);

		if(!str_cmp(arg1,"new"))
		{
			if (argument[0] == '\0')
			{
				send_to_char("Syntax: edit help new [topic]\n\r",ch);
				return;
			}
			if (hedit_new(ch, argument) )
				ch->desc->editor = ED_HELP;
			return;
		}
	}
	send_to_char( "HEdit:  There is no default help to edit.\n\r", ch );
	return;
}


HEDIT (hedit_delete)
{
    HELP_DATA *pHelp, *temp;
    HELP_AREA *had;
    DESCRIPTOR_DATA *d;
    bool found = FALSE;

    EDIT_HELP (ch, pHelp);

    for (d = descriptor_list; d; d = d->next)
        if (d->editor == ED_HELP && pHelp == (HELP_DATA *) d->pEdit)
            edit_done (d->character);

    if (help_first == pHelp)
        help_first = help_first->next;
    else
    {
        for (temp = help_first; temp; temp = temp->next)
            if (temp->next == pHelp)
                break;

        if (!temp)
        {
            bugf ("hedit_delete : help %s not found in help_first",
                  pHelp->keyword);
            return FALSE;
        }

        temp->next = pHelp->next;
    }

    for (had = had_list; had; had = had->next)
        if (pHelp == had->first)
        {
            found = TRUE;
            had->first = had->first->next_area;
        }
        else
        {
            for (temp = had->first; temp; temp = temp->next_area)
                if (temp->next_area == pHelp)
                    break;

            if (temp)
            {
                temp->next_area = pHelp->next_area;
                found = TRUE;
                break;
            }
        }

    if (!found)
    {
        bugf ("hedit_delete : help %s not found in had_list",
              pHelp->keyword);
        return FALSE;
    }

    free_help (pHelp);

    send_to_char ("Ok.\n\r", ch);
    return TRUE;
}

HEDIT (hedit_list)
{
    char buf[MIL];
    int cnt = 0;
    HELP_DATA *pHelp;
    BUFFER *buffer;

    EDIT_HELP (ch, pHelp);

    if (!str_cmp (argument, "all"))
    {
        buffer = new_buf ();

        for (pHelp = help_first; pHelp; pHelp = pHelp->next)
        {
            sprintf (buf, "%3d. %-14.14s%s", cnt, pHelp->keyword,
                     cnt % 4 == 3 ? "\n\r" : " ");
            add_buf (buffer, buf);
            cnt++;
        }

        if (cnt % 4)
            add_buf (buffer, "\n\r");

        page_to_char (buf_string (buffer), ch);
        return FALSE;
    }

    if (!str_cmp (argument, "area"))
    {
        if (ch->in_room->area->helps == NULL)
        {
            send_to_char ("No helps in this area.\n\r", ch);
            return FALSE;
        }

        buffer = new_buf ();

        for (pHelp = ch->in_room->area->helps->first; pHelp;
             pHelp = pHelp->next_area)
        {
            sprintf (buf, "%3d. %-14.14s%s", cnt, pHelp->keyword,
                     cnt % 4 == 3 ? "\n\r" : " ");
            add_buf (buffer, buf);
            cnt++;
        }

        if (cnt % 4)
            add_buf (buffer, "\n\r");

        page_to_char (buf_string (buffer), ch);
        return FALSE;
    }

    if (IS_NULLSTR (argument))
    {
        send_to_char ("Syntax: list all\n\r", ch);
        send_to_char ("        list area\n\r", ch);
        return FALSE;
    }

    return FALSE;
}