/
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/
#pragma save_binary
/*
   **  NS-DOS list function
   **  Newstyle, 28/09/93
 */

#define COL "%^CYAN%^"

static int dd, df, dr, dl, db;

mixed   do_level( string str );

static int new_list_files( string str1 )
{
    string  str2, str3;
    int    *ret;

/* Security check */
    if( this_player( 1 ) != this_player() )
	return 0;
/* Initialise flags */
    df = dd = dr = dl = db = 0;

    if( !str1 )
	str1 = "";
    str1 += " ";

/* Pick out and remove any flags */
    while( sscanf( str1, "%s-%s %s", str1, str2, str3 ) == 3 )
    {
	str1 += str3;
	if( sscanf( str2, "%s*%s", str2, str3 ) == 2 )
	{
	    dl = 1;
	    str2 += str3;
	}
	if( sscanf( str2, "%so%s", str2, str3 ) == 2 )
	{
	    db = 1;
	    str2 += str3;
	}
	if( sscanf( str2, "%sf%s", str2, str3 ) == 2 )
	{
	    df = 1;
	    str2 += str3;
	}
	if( sscanf( str2, "%sr%s", str2, str3 ) == 2 )
	{
	    dr = 1;
	    str2 += str3;
	}
	if( sscanf( str2, "%sd%s", str2, str3 ) == 2 )
	{
	    dd = 1;
	    str2 += str3;
	}
	if( sscanf( str2, "%sv%s", str2, str3 ) == 2 )
	{
	    dd = 1;
	    df = 1;
	    dl = 1;
	    db = 1;
	    str2 += str3;
	}
	if( sscanf( str2, "%sl%s", str2, str3 ) == 2 )
	{
	    dd = 1;
	    df = 1;
	    dl = 1;
	    db = 1;
	    str2 += str3;
	}
    }
    str1 = replace( str1, " ", "" );

    str1 = (string)this_player()->get_path( str1 );
    if( file_size( str1 ) == -2 && str1[ strlen( str1 ) - 1 ] != 47 )
	str1 += "/";

    ret = do_level( str1 );

/* Remember the base directory */
    if( dr )
    {
	ret[ 1 ]++;
	write( COL + ret[ 1 ] + " directories listed.%^RESET%^\n" );
    }
    if( df )
    {
	write( COL + ret[ 2 ] + " bytes in " + ret[ 0 ] + " files.%^RESET%^\n" );
	if( !dr && ret[ 1 ] != 0 )
	    write( COL + ret[ 5 ] + " entries in " + ret[ 1 ] + " subdirectories.%^RESET%^\n" );
    }
    if( dl )
	write( COL + ret[ 4 ] + " bytes loaded in " + ret[ 3 ] + " files.%^RESET%^\n" );
    return 1;
}

int    *do_level( string str )
{

    mixed  *dir;
    int     loop1, loop2, size, *ret, *sub;
    string *subdir;
    string  output, tempstr;

/* Gets an array of arrays of file details from /global/path.c */
    dir = get_dir( str, -1 );
    ret = ({ 0, 0, 0, 0, 0, 0 });

/* Quick return from error/empty paths */
    if( !sizeof( dir ) )
    {
	if( file_size( str ) == -1 )
	    write( COL + "File/path does not exist.%^RESET%^\n" );
	else
	    write( COL + "Empty Directory : " + str + "%^RESET%^\n" );
	return ret;
    }

    write( COL + "Directory of : " + str + "%^RESET%^\n" );

/* Removes anything after last directory */
    if( str[ strlen( str ) - 1 ] != 47 )
    {
	subdir = explode( str, "/" );
	str = implode( subdir[ 0..sizeof( subdir ) - 2 ], "/" ) + "/";
    }

    output = "";
    subdir = ({ });
    for( loop1 = 0; loop1 < sizeof( dir ); loop1++ )
    {
	size = dir[ loop1 ][ 1 ];
	if( size != -2 )
	{
	    ret[ 0 ]++;
/* File owner options */
	    if( db )
	    {
		tempstr = "/secure/master"->creator_file( str + dir[ loop1 ][ 0 ] );
		if( !tempstr )
		    tempstr = "no owner";
		output += tempstr + "        "[ 0..8 - strlen( tempstr ) ];
	    }
/* File size options */
	    if( df )
	    {
		ret[ 2 ] += size;
		tempstr = size + "";
		output += "        "[ 0..7 - strlen( tempstr ) ] + tempstr + " ";
	    }
	    else
	    {
		tempstr = (size + 512) / 1024 + "";
		output += "   "[ 0..3 - strlen( tempstr ) ] + tempstr + " ";
	    }
/* Display time & date options */
	    if( dd )
		output += ctime( dir[ loop1 ][ 2 ] ) + " ";
/* Display loaded file info options */
	    if( dl )
	    {
		if( virtual_find_object( str + dir[ loop1 ][ 0 ] ) )
		{
		    output += "(L) ";
		    ret[ 3 ]++;
		    ret[ 4 ] += size;
		}
		else
		    output += "    ";
	    }
	    else
	    {
		if( virtual_find_object( str + dir[ loop1 ][ 0 ] ) )
		    output += "*";
		else
		    output += " ";
	    }
	    output += dir[ loop1 ][ 0 ] + "\n";
	}
	else
	    subdir += ({ dir[ loop1 ][ 0 ] + "/" });
    }
    ret[ 1 ] = sizeof( subdir );
    for( loop1 = 0; loop1 < ret[ 1 ]; loop1++ )
    {
	if( df )
	{
	    size = sizeof( get_dir( str + subdir[ loop1 ] ) );
	    ret[ 5 ] += size;
/* Display filesize options */
	    output += "    "[ 0..3 - strlen( size + "" ) ] + "(" + size + ") ";
	}
	output += subdir[ loop1 ] + "\n";
    }
    printf( "%#-*s\n", ( int ) this_player()->query_cols() - 2, output );

/* Recursive directories. ret is an array of totals */
    if( dr )
	for( loop1 = 0; loop1 < sizeof( subdir ); loop1++ )
	{
	    sub = do_level( str + subdir[ loop1 ] );
	    for( loop2 = 0; loop2 < 6; loop2++ )
		ret[ loop2 ] += sub[ loop2 ];
	}
    return ret;
}