muddy/area/
muddy/bin/
muddy/bin/CVS/
muddy/clans/CVS/
muddy/classes/CVS/
muddy/corefiles/
muddy/corefiles/CVS/
muddy/doc/CVS/
muddy/doc/cvsup/
muddy/doc/cvsup/CVS/
muddy/doc/muddy/
muddy/doc/muddy/CVS/
muddy/doc/olc/CVS/
muddy/etc/
muddy/etc/CVS/
muddy/gods/
muddy/gods/CVS/
muddy/lang/CVS/
muddy/msgdb/
muddy/msgdb/CVS/
muddy/notes/
muddy/notes/CVS/
muddy/player/
muddy/races/CVS/
muddy/src/CVS/
muddy/src/comm/CVS/
muddy/src/compat/
muddy/src/compat/CVS/
muddy/src/compat/mkdep/
muddy/src/compat/mkdep/CVS/
muddy/src/compat/regex-win32/CVS/
muddy/src/db/CVS/
muddy/src/mudprogs/CVS/
muddy/src/olc/CVS/
muddy/tmp/CVS/
/*-
 * Copyright (c) 1998 fjoe <fjoe@iclub.nsu.ru>
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 * $Id: olc_word.c,v 1.5 1998/12/23 16:11:21 fjoe Exp $
 */

#include <stdio.h>
#include <stdlib.h>

#include "merc.h"
#include "olc.h"
#include "db/lang.h"
#include "db/word.h"

#define EDIT_WORD(ch, w)	(w = (WORD_DATA*) ch->desc->pEdit)
#define EDIT_HASH(ch, l, hashp)						\
	hashp = ch->desc->editor == ED_GENDER ? l->hash_genders :	\
						l->hash_cases;

DECLARE_OLC_FUN(worded_create	);
DECLARE_OLC_FUN(worded_edit	);
DECLARE_OLC_FUN(worded_touch	);
DECLARE_OLC_FUN(worded_show	);
DECLARE_OLC_FUN(worded_list	);

DECLARE_OLC_FUN(worded_name	);
DECLARE_OLC_FUN(worded_base	);
DECLARE_OLC_FUN(worded_form	);
DECLARE_OLC_FUN(worded_del	);

OLC_CMD_DATA olc_cmds_word[] =
{
	{ "create",	worded_create	},
	{ "edit",	worded_edit	},
	{ "touch",	worded_touch	},
	{ "show",	worded_show	},
	{ "list",	worded_list	},

	{ "name",	worded_name,	},
	{ "base",	worded_base	},
	{ "form",	worded_form	},
	{ "del",	worded_del	},

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

OLC_FUN(worded_create)
{
	WORD_DATA *w;
	LANG_DATA *l = NULL;
	char arg[MAX_STRING_LENGTH];
	const char *type;
	varr **hashp;

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

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

	if (ch->desc->editor == ED_LANG)
		l = ch->desc->pEdit;
	else if (ch->desc->editor == ED_GENDER || ch->desc->editor == ED_CASE) {
		w = ch->desc->pEdit;
		l = varr_get(&langs, w->lang);
	}

	if (l == NULL) {
		char_puts("WordEd: You must be editing a language or another word.\n", ch);
		return FALSE;
	}

	if (!str_prefix(arg, "case")) {
		type = ED_CASE;
		hashp = l->hash_cases;
	}
	else if (!str_prefix(arg, "gender")) {
		type = ED_GENDER;
		hashp = l->hash_genders;
	}
	else {
		do_help(ch, "'OLC CREATE'");
		return FALSE;
	}

	if (word_lookup(hashp, argument)) {
		char_printf(ch, "WordEd: %s: duplicate name.\n", argument);
		return FALSE;
	}

	w = word_new(l->vnum);
	w->name = str_dup(argument);
	word_add(hashp, w);
	ch->desc->editor = type;
	ch->desc->pEdit = w;
	char_puts("WordEd: word created.\n", ch);
	return FALSE;
}

OLC_FUN(worded_edit)
{
	WORD_DATA *w;
	LANG_DATA *l = NULL;
	char arg[MAX_STRING_LENGTH];
	const char *type;
	varr **hashp;

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

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

	if (ch->desc->editor == ED_LANG)
		l = ch->desc->pEdit;
	else if (ch->desc->editor == ED_GENDER || ch->desc->editor == ED_CASE) {
		w = ch->desc->pEdit;
		l = varr_get(&langs, w->lang);
	}

	if (l == NULL) {
		char_puts("WordEd: You must be editing a language or another word.\n", ch);
		return FALSE;
	}

	if (!str_prefix(arg, "cases")) {
		type = ED_CASE;
		hashp = l->hash_cases;
	}
	else if (!str_prefix(arg, "genders")) {
		type = ED_GENDER;
		hashp = l->hash_genders;
	}
	else {
		do_help(ch, "'OLC EDIT'");
		return FALSE;
	}

	if ((w = word_lookup(hashp, argument)) == NULL) {
		char_printf(ch, "WordEd: %s: not found.\n", argument);
		return FALSE;
	}

	ch->desc->editor = type;
	ch->desc->pEdit = w;
	return FALSE;
}

OLC_FUN(worded_touch)
{
	WORD_DATA *w;
	LANG_DATA *l;

	EDIT_WORD(ch, w);
	if ((l = varr_get(&langs, w->lang)) == NULL)
		return FALSE;

	if (ch->desc->editor == ED_GENDER)
		SET_BIT(l->flags, LANG_GENDERS_CHANGED);
	else if (ch->desc->editor == ED_CASE)
		SET_BIT(l->flags, LANG_CASES_CHANGED);

	return FALSE;
}

OLC_FUN(worded_show)
{
	int i;
	WORD_DATA *w;
	LANG_DATA *l;

	EDIT_WORD(ch, w);
	l = varr_get(&langs, w->lang);

	char_printf(ch, "Name: [%s]\n"
			"Lang: [%s]\n"
			"Type: [%s]\n",
		    w->name,
		    l->name,
		    ch->desc->editor == ED_GENDER ?	"gender" :
		    ch->desc->editor == ED_CASE ?	"case" :
							"unknown");

	if (!IS_NULLSTR(w->base))
		char_printf(ch, "Base: [%s]\n", w->base);

	for (i = 0; i < w->f.nused; i++) {
		char **p = VARR_GET(&w->f, i);

		if (!IS_NULLSTR(*p))
			char_printf(ch, "Form: [%d] [%s]\n", i, *p);
	}

	return FALSE;
}

OLC_FUN(worded_list)
{
	int i;
	BUFFER *output = NULL;
	varr **hashp;
	LANG_DATA *l;
	char arg[MAX_STRING_LENGTH];

	argument = one_argument(argument, arg);
	if (arg[0] == '\0' || argument[0] == '\0') {
		do_help(ch, "'OLC WORD LIST'");
		return FALSE;
	}
	
	if ((i = lang_lookup(arg)) < 0) {
		char_printf(ch, "WordEd: %s: unknown language.\n", arg);
		return FALSE;
	}

	l = VARR_GET(&langs, i);
	EDIT_HASH(ch, l, hashp);

	for (i = 0; i < MAX_WORD_HASH; i++) {
		int j;
		varr *v = hashp[i];

		if (v == NULL)
			continue;

		for (j = 0; j < v->nused; j++) {
			WORD_DATA *w = VARR_GET(v, j);

			if (!str_prefix(argument, w->name)) {
				if (output == NULL)
					output = buf_new(-1);
				buf_printf(output, "%s\n", w->name);
			}
		}
	}

	if (output) {
		page_to_char(buf_string(output), ch);
		buf_free(output);
	}
	else
		char_puts("WordEd: no messages found.\n", ch);

	return FALSE;
}

OLC_FUN(worded_name)
{
	WORD_DATA *w;
	LANG_DATA *l;
	varr **hashp;

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

	EDIT_WORD(ch, w);
	l = varr_get(&langs, w->lang);
	if (l == NULL)
		return FALSE;
	EDIT_HASH(ch, l, hashp);

	if (word_lookup(hashp, argument)) {
		char_printf(ch, "WordEd: %s: duplicate name.\n", argument);
		return FALSE;
	}

	word_del(hashp, w->name);
	free_string(w->name);
	w->name = str_dup(argument);
	ch->desc->pEdit = word_add(hashp, w);
	return TRUE;
}

OLC_FUN(worded_base)
{
	WORD_DATA *w;
	EDIT_WORD(ch, w);
	return olced_str(ch, argument, worded_base, &w->base);
}

OLC_FUN(worded_form)
{
	WORD_DATA *w;
	bool add;
	int num;
	char arg[MAX_STRING_LENGTH];
	char arg2[MAX_STRING_LENGTH];

	argument = one_argument(argument, arg);
	argument = one_argument(argument, arg2);

	if (!str_prefix(arg, "add"))
		add = TRUE;
	else if (!str_prefix(arg, "delete"))
		add = FALSE;
	else {
		do_help(ch, "'OLC WORD FORM'");
		return FALSE;
	}

	if ((add && argument[0] == '\0') || !is_number(arg2)) {
		do_help(ch, "'OLC WORD FORM'");
		return FALSE;
	}

	num = atoi(arg2);
	EDIT_WORD(ch, w);
	if (add)
		word_form_add(w, num, argument);
	else
		word_form_del(w, num);
	return FALSE;
}

OLC_FUN(worded_del)
{
	varr **hashp;
	WORD_DATA *w;
	LANG_DATA *l;

	EDIT_WORD(ch, w);
	l = varr_get(&langs, w->lang);
	if (l == NULL)
		return FALSE;
	EDIT_HASH(ch, l, hashp);

	word_del(hashp, w->name);
	edit_done(ch->desc);

	return FALSE;
}