/**************************************************************************/
// textsrch.h - Text search system.
/***************************************************************************
* The Dawn of Time v1.69r (c)1997-2004 Michael Garratt *
* >> A number of people have contributed to the Dawn codebase, with the *
* majority of code written by Michael Garratt - www.dawnoftime.org *
* >> To use this source code, you must fully comply with the dawn license *
* in licenses.txt... In particular, you may not remove this copyright *
* notice. *
**************************************************************************/
#include "include.h"
#include "olc_ex.h"
#include "socials.h"
#include "help.h"
enum TEXTSEARCH_TYPE{
TEXTSEARCH_MOBPROG,
TEXTSEARCH_ROOMNAME,
TEXTSEARCH_ROOMDESCRIPTION,
TEXTSEARCH_ROOMEXTDESCRIPT,
TEXTSEARCH_OBJDESCRIPTION,
TEXTSEARCH_OBJEXTDESCRIPT,
TEXTSEARCH_MOBDESCRIPTION,
TEXTSEARCH_HELPS,
TEXTSEARCH_SOCIALS
};
const struct flag_type textsearch_types[] =
{
{ "mobprog", TEXTSEARCH_MOBPROG, true },
{ "roomname", TEXTSEARCH_ROOMNAME, true },
{ "roomdescription", TEXTSEARCH_ROOMDESCRIPTION, true },
{ "roomextdescript", TEXTSEARCH_ROOMEXTDESCRIPT, true },
{ "objdescription", TEXTSEARCH_OBJDESCRIPTION, true },
{ "objextdescript", TEXTSEARCH_OBJEXTDESCRIPT, true },
{ "mobdescription", TEXTSEARCH_MOBDESCRIPTION, true },
{ "helps", TEXTSEARCH_HELPS, true },
{ "socials", TEXTSEARCH_SOCIALS, true },
{ NULL, 0, 0 }
};
/**************************************************************************/
void do_textsearch(char_data *ch, char* argument)
{
int maxhits=200;
int i;
if(IS_NULLSTR(argument)){
ch->println("Syntax: textsearch <what> <text>");
ch->println("Where <what> is one of the following:");
show_olc_flags_types(ch, textsearch_types);
return;
};
char arg[MIL];
argument=one_argument(argument, arg);
TEXTSEARCH_TYPE stype= (TEXTSEARCH_TYPE)flag_value(textsearch_types, arg);
if(stype==NO_FLAG){
ch->printlnf("Unrecognised flag '%s'.", arg);
do_textsearch(ch, "");
return;
}
int hits=0;
int count;
EXTRA_DESCR_DATA *ed;
switch(stype){
case TEXTSEARCH_MOBPROG:
{
for(MPROG_CODE *pMP=mprog_list; pMP; pMP=pMP->next){
if(!str_infix(argument, pMP->code)){
hits++;
if(hits<=maxhits){
ch->printlnf("%3d) <%5d> '%s'", hits, pMP->vnum, pMP->title);
}
}
}
}
break;
case TEXTSEARCH_ROOMNAME:
{
for(i=0; i<MAX_KEY_HASH; i++){
for(ROOM_INDEX_DATA *r= room_index_hash[i]; r; r= r->next )
{
if(!str_infix(argument, r->name)){
hits++;
if(hits<=maxhits){
ch->printlnf("%3d) <%5d> '%s'", hits, r->vnum, r->name);
}
}
}
}
}
break;
case TEXTSEARCH_ROOMDESCRIPTION:
{
for(i=0; i<MAX_KEY_HASH; i++){
for(ROOM_INDEX_DATA *r= room_index_hash[i]; r; r= r->next )
{
if(!str_infix(argument, r->description)){
hits++;
if(hits<=maxhits){
ch->printlnf("%3d) <%5d> '%s'", hits, r->vnum, r->name);
}
}
}
}
}
break;
case TEXTSEARCH_ROOMEXTDESCRIPT:
{
for(i=0; i<MAX_KEY_HASH; i++){
for(ROOM_INDEX_DATA *r= room_index_hash[i]; r; r= r->next )
{
// do the extended descriptions
count=0;
for(ed=r->extra_descr; ed; ed=ed->next){
if(!str_infix(argument, ed->description)
|| !str_infix(argument, ed->keyword)){
count++;
hits++;
if(hits<=maxhits){
ch->printlnf("%3d) <%5d> '%s', extended %d - '%s'.", hits,
r->vnum, r->name, count, ed->keyword);
}
}
}
// do the exits
for (int door = 0; door < MAX_DIR; door++ )
{
EXIT_DATA *pexit;
if ( ( pexit = r->exit[door] ) ){
if( (!IS_NULLSTR(pexit->keyword)
&& !str_infix(argument, pexit->keyword))
|| (!IS_NULLSTR(pexit->description)
&& !str_infix(argument, pexit->description)))
{
hits++;
if(hits<=maxhits){
ch->printlnf("%3d) <%5d> '%s', %s exit '%s'.", hits,
r->vnum, r->name, flag_string(direction_types, door),
IS_NULLSTR(pexit->keyword)?"no keywords.":pexit->keyword);
}
}
}
}
}
}
}
break;
case TEXTSEARCH_OBJDESCRIPTION:
{
for(i=0; i<MAX_KEY_HASH; i++){
for(OBJ_INDEX_DATA *o= obj_index_hash[i]; o; o= o->next )
{
if(!str_infix(argument, o->description)){
hits++;
if(hits<=maxhits){
ch->printlnf("%3d) <%5d> '%s'", hits, o->vnum, o->name);
}
}
}
}
}
break;
case TEXTSEARCH_OBJEXTDESCRIPT:
{
for(i=0; i<MAX_KEY_HASH; i++){
for(OBJ_INDEX_DATA *o= obj_index_hash[i]; o; o= o->next )
{
// do the extended descriptions
count=0;
for(ed=o->extra_descr; ed; ed=ed->next){
if(!str_infix(argument, ed->description)
|| !str_infix(argument, ed->keyword)){
count++;
hits++;
if(hits<=maxhits){
ch->printlnf("%3d) <%5d> '%s', extended %d - '%s'.", hits,
o->vnum, o->name, count, ed->keyword);
}
}
}
}
}
}
break;
case TEXTSEARCH_MOBDESCRIPTION:
{
for(i=0; i<MAX_KEY_HASH; i++){
for(MOB_INDEX_DATA *m= mob_index_hash[i]; m; m= m->next )
{
if(!str_infix(argument, m->description)){
hits++;
if(hits<=maxhits){
ch->printlnf("%3d) <%5d> '%s'", hits, m->vnum, m->short_descr);
}
}
}
}
}
break;
case TEXTSEARCH_HELPS:
{
for ( help_data *pHelp = help_first; pHelp; pHelp = pHelp->next )
{
if ( pHelp->level > get_trust( ch ) )
continue;
if(!str_infix(argument, pHelp->text)
|| !str_infix(argument, pHelp->keyword)
|| !str_infix(argument, pHelp->title)
|| !str_infix(argument, pHelp->see_also)
|| !str_infix(argument, pHelp->immsee_also)
|| !str_infix(argument, pHelp->spell_name)
|| !str_infix(argument, pHelp->command_reference)
|| !str_infix(argument, pHelp->continues)
|| !str_infix(argument, pHelp->parent_help)
){
hits++;
if(hits<=maxhits){
ch->printlnf("%3d) `=_'%s' `x (length =%d bytes) <%s> [%d]%s",
hits, pHelp->keyword, (int) str_len(pHelp->text),
pHelp->helpfile->file_name, pHelp->level,
IS_SET(pHelp->flags,HELP_REMOVEHELP)?" `RFLAGGED FOR REMOVAL`x":"");
}
}
}
}
break;
case TEXTSEARCH_SOCIALS:
{
for(social_type *soc=social_list; soc; soc=soc->next){
if(IS_SET(soc->social_flags, SOC_IMM_ONLY) && !IS_IMMORTAL(ch)){
continue;
}
for(i=0; i<SOCIAL_ATMAX; i++){
if(!str_infix(argument, soc->acts[i])){
hits++;
if(hits<=maxhits){
ch->printlnf("%3d) %s [act%d]", hits, soc->name, i);
}
}
}
}
if(hits>0){
ch->println("Use socshow <social> to display a particular social.");
}
}
break;
default:
ch->printlnf("do_textsearch(): bug - unprogrammed search type %d - please note the admin!", stype);
break;
}
if(hits==0){
ch->printlnf("No matching '%s' found for search type '%s'.",
argument, flag_string(textsearch_types, stype));
}else{
ch->printlnf("%d match%s searching for '%s' (search type '%s').", hits, hits==1?"":"es",
argument, flag_string(textsearch_types, stype));
}
}
/**************************************************************************/