dotd-2.3.7/area/
dotd-2.3.7/clans/
dotd-2.3.7/classes/
dotd-2.3.7/councils/
dotd-2.3.7/deity/
dotd-2.3.7/dict/
dotd-2.3.7/doc/mudprogs/
dotd-2.3.7/player/a/
dotd-2.3.7/player/g/
/******************************************************
            Desolation of the Dragon MUD II
      (C) 1997-2002  Jesse DeFer
          http://www.dotd.com  dotd@dotd.com
 ******************************************************/
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

#include "mud.h"
#include "soundex.h"
#include "justify.h"

#define DICT_WORD_LENGTH 40

DICT_ENTRY *create_dict_entry(char *word, char *def)
{
    DICT_ENTRY *dict;

    CREATE(dict, DICT_ENTRY, 1);
    dict->word = str_dup(word);
    dict->definition = str_dup(def);
    dict->next = NULL;

    return dict;
}

DICT_ENTRY *get_words_in_dict(char *word)
{
    DICT_ENTRY *first_dict = NULL, *dict = NULL;
    FILE *fp;
    char soundexkey[16], filen[16], dictword[DICT_WORD_LENGTH], buf[MAX_STRING_LENGTH];
    int len = 0, x;

    if (!*word)
        return NULL;

    if ((len=strlen(word))<3)
        return NULL;

    strcpy(soundexkey, GetSoundexKey(word));
    sprintf(filen,"../dict/real/%c%c%c",
            soundexkey[0], soundexkey[1], soundexkey[2]);

    if (!(fp=fopen(filen,"r")))
        return NULL;

    while (!feof(fp))
    {
        fgets(buf,MAX_STRING_LENGTH-1,fp);
        if (len>3)
        {
            if (tolower(buf[3])<tolower(word[3]))
                continue;
            else if (tolower(buf[3])>tolower(word[3]))
                continue;
        }
        strncpy(dictword, buf, DICT_WORD_LENGTH);
        for (x=38;x>=0;x--)
            if (dictword[x]!=' ')
            {
                dictword[x+1]='\0';
                break;
            }
        buf[strlen(buf)-1]='\0';

        if (!strcasecmp(word,dictword))
        {
            if (first_dict)
            {
                dict->next = create_dict_entry(dictword, &buf[DICT_WORD_LENGTH]);
                dict = dict->next;
            }
            else
            {
                first_dict = create_dict_entry(dictword, &buf[DICT_WORD_LENGTH]);
                dict = first_dict;
            }
        }
    }

    fclose(fp);
    return first_dict;
}

int num_words_in_dict(char *word)
{
    FILE *fp;
    char soundexkey[16], filen[16], dictword[DICT_WORD_LENGTH], buf[MAX_STRING_LENGTH];
    int len = 0, x, num=0;

    if (!*word)
        return 0;

    if ((len=strlen(word))<3)
        return 0;

    strcpy(soundexkey, GetSoundexKey(word));
    sprintf(filen,"../dict/real/%c%c%c",
            soundexkey[0], soundexkey[1], soundexkey[2]);

    if (!(fp=fopen(filen,"r")))
        return 0;

    while (!feof(fp))
    {
        fgets(buf,MAX_STRING_LENGTH-1,fp);
        if (len>3)
        {
            if (tolower(buf[3])<tolower(word[3]))
                continue;
            else if (tolower(buf[3])>tolower(word[3]))
                continue;
        }
        strncpy(dictword, buf, DICT_WORD_LENGTH);
        for (x=38;x>=0;x--)
            if (dictword[x]!=' ')
            {
                dictword[x+1]='\0';
                break;
            }
        buf[strlen(buf)-1]='\0';

        if (!strcasecmp(word,dictword))
        {
            num++;
        }
    }

    fclose(fp);
    return num;
}

void free_dict_entry(DICT_ENTRY *dict)
{
    DISPOSE(dict->word);
    DISPOSE(dict->definition);
    DISPOSE(dict);
}


void do_dlookup(CHAR_DATA *ch, char *argument)
{
    DICT_ENTRY *d1, *d2;
    char buf[MAX_INPUT_LENGTH], *outbuf;
    int num=0;

    buf[0]='\0';
    d1 = get_words_in_dict(argument);

    if (d1)
        pager_printf(ch, "%s\n\r-----------------------\n\r", d1->word);

    while (d1)
    {
        d2 = d1;
        d1 = d1->next;

        outbuf = Justify(d2->definition, 76, justify_right);
        sprintf(buf, "%s\n\r", outbuf);
        sprintf(outbuf, "%d.", ++num);
	strncpy(buf, outbuf, strlen(outbuf));

        send_to_pager(buf, ch);

        free_dict_entry(d2);
    }

    if (!num)
        send_to_char("Nothing found.\n\r", ch);
    else
        pager_printf(ch, "\n\r-----------------------\n\r%d definitions found.\n\r", num);
}