/
LIB3/
LIB3/D/ADMIN/
LIB3/D/ADMIN/OBJ/
LIB3/D/ADMIN/ROOM/W/
LIB3/D/HOME/
LIB3/D/HOME/CITY/ARENA/
LIB3/D/HOME/CITY/ITEMS/
LIB3/D/HOME/CITY/POSTOFFI/
LIB3/DOC/
LIB3/GLOBAL/SPECIAL/
LIB3/GLOBAL/VIRTUAL/
LIB3/NET/
LIB3/NET/CONFIG/
LIB3/NET/DAEMON/CHARS/
LIB3/NET/GOPHER/
LIB3/NET/INHERIT/
LIB3/NET/OBJ/
LIB3/NET/SAVE/
LIB3/NET/VIRTUAL/
LIB3/OBJ/B_DAY/
LIB3/OBJ/HANDLERS/TERM_TYP/
LIB3/PLAYERS/B/
LIB3/PLAYERS/N/
LIB3/ROOM/
LIB3/SAVE/
LIB3/SAVE/BOARDS/
LIB3/SAVE/ENVIRON/
LIB3/SAVE/POST/
LIB3/STD/COMMANDS/SHADOWS/
LIB3/STD/CREATOR/
LIB3/STD/DOM/
LIB3/STD/EFFECTS/
LIB3/STD/EFFECTS/HEALING/
LIB3/STD/EFFECTS/OTHER/
LIB3/STD/EFFECTS/POISONS/
LIB3/STD/ENVIRON/
LIB3/STD/GUILDS/
LIB3/STD/LIQUIDS/
LIB3/STD/ROOM/
LIB3/STD/TRIGGER/SHADOW/
LIB3/W/
LIB3/W/BANNOR/
LIB3/W/NEWSTYLE/

/*
 * The help module.
 * This will (should) give help on the required thingy.
 * modified for New Moon on 6/25/93 by prophet@itsa.ucsf.edu
 * 93-09-27 Bannor - Added -v option to show man file path names.
 *                   Added "No man/help found fail message.
 */

#include    "help.h"
#include    "nroff.h"

#define     CROSS_REF       "/doc/cross_ref"
#define     CRE_POWERS      "/doc/Help/creator/Powers/*"
#define     CRE_TOOLS       "/doc/Help/creator/Tools/*"
#define     creator_dirs    ({ \
   "/doc/Help/lfun/", "/doc/Help/efun/",\
   "/doc/Help/creator/", "/doc/Help/create/", "/doc/Help/driver/lpc/types/",\
   "/doc/Help/mudlib/", "/doc/Help/driver/applies/", \
   "/doc/Help/driver/concepts/", "/doc/Help/driver/lpc/constructs/", \
   "/doc/Help/driver/efuns/conglom/"  })



string  search_man( string str )
/* checks to see if the file has been nroff'd, returns the
 * path/filename of the man file */
{
    if( this_player()->query_creator() &&
	    file_size( CNROFF_DIR + str + ".o" ) > 0 )
    {
	return CNROFF_DIR + str;
    }
}				/* search_man() */


string  create_man( string str )
/* checks creator status and looks for .o copy of <arg> */
{
    int     i;
    mixed   cross_ref;

    if( this_player()->query_creator() )
	for( i = 0; i < sizeof( creator_dirs ); i++ )
	    if( file_size( creator_dirs[ i ] + str ) > 0 )
	    {
		NROFF_HAND->create_chelp( creator_dirs[ i ], str );
		return CNROFF_DIR + str;
/*
   return creator_dirs[ i ] + str;
 */
	    }

    cross_ref = read_file( CROSS_REF );
    cross_ref = explode( cross_ref, "%" );
    if( (i = member_array( str, cross_ref )) == -1 )
	return 0;
    return extract( cross_ref[ i + 1 ], 0, strlen( cross_ref[ i + 1 ] ) - 2 );
    /* use extract, not explode */
}				/* create_man() */


string  search_man_dirs( string str )
/* searchs creator man dirs for the file str.  Returns the
 * path to str.
 */
{
    int     i;
    mixed   cross_ref;

    if( this_player()->query_creator() )
	for( i = 0; i < sizeof( creator_dirs ); i++ )
	    if( file_size( creator_dirs[ i ] + str ) > 0 )
		return creator_dirs[ i ] + str;

}				/* search_man_dirs() */


int     do_man( string str )
{
    string  filen, s;
    string  topic;
    int     give_file_name;


    if( !str )
    {
	printf( "Powers:\n%-#*s\n", ( int ) this_player()->query_cols(),
		implode ( delete( get_dir( CRE_POWERS ), 0, 2 ), "\n" ) );
	printf( "\nTools:\n%-#*s\n", ( int ) this_player()->query_cols(),
		implode ( delete( get_dir( CRE_TOOLS ), 0, 2 ), "\n" ) );

	write( "\nUsage : man {-v} <topic>\n" );
	return 1;
    }
    give_file_name = 0;
    if( sscanf( str, "-v %s", topic ) == 1 )
    {
	give_file_name = 1;
	write( "%^BOLD%^Man file is: " + search_man_dirs( topic ) +
	       ".%^RESET%^\n" );
    }
    else
	topic = str;

    filen = search_man( topic );

    if( !filen )
	filen = create_man( topic );

    if( !filen )
    {
	filen = HELP_OBJECT->HELP_COMMAND( topic );
	if( !filen )
	    write( "No man or help page found on: " + topic + ".\n" );
	return 1;
    }

    if( give_file_name )
	write( "%^BOLD%^Nroff file is: " + filen + ".%^RESET%^\n" );

    filen = (string)NROFF_HAND->cat_file( filen, 1 );
    if( !filen )
    {
	filen = create_man( topic );
	filen = (string)NROFF_HAND->cat_file( filen );
    }
    if( !filen )
    {
	notify_fail( "Manual file broken.  Please tell a creator.\n" );
	log_file( "MANU_FILES", "Manu file " + topic + " broken.\n" );
	return 0;
    }
    this_player()->more_string( filen );
    return 1;
}				/* do_man() */