melville/
melville/cmds/
melville/cmds/admin/
melville/data/
melville/data/mail/
melville/data/player/
melville/data/system/
melville/data/user/
melville/doc/functions/
melville/doc/help/
melville/inherit/
melville/log/
melville/obj/
melville/system/auto/
melville/system/player/
melville/system/user/
melville/users/
melville/users/mobydick/
melville/world/
/* The all-important ls command.
   Mobydick, 5-29-94.
*/

int do_command (string str) {

    string directory, workdir ;
    mixed *files ;
    int i, size ;

    if (!str) {
        directory = previous_object()->query_cwd() ;
    } else {
	if (absolute_path(str)) {
	    directory = str ;
        } else {
	    directory = previous_object()->query_cwd() + "/" + str ;
	}
	directory = resolve_path(directory) ;
    }
    if (directory=="") directory = "/" ;
    i = file_exists(directory) ;
    if (!i || i==1) {
        write ("No such directory: "+directory+"\n") ;
	return 1 ;
    }
    if (!previous_object()->valid_read(directory)) {
	write ("Permission denied to ls "+directory+"\n") ;
	return 1 ;
    }
    i = strlen(directory)-1 ;
    workdir = directory ;
    if (directory[i]=='/') workdir += "*" ; else workdir += "/*" ;
    files = get_dir(workdir) ;
    write (sizeof(files[0])+" files:\n") ;
    for (i=0;i<sizeof(files[0]);i++) {
        if (files[1][i]==0)
 	    size = 0 ;
        else if (files[1][i]==-2) 
	    size = 1 ;
        else size = (files[1][i]+999)/1000 ;
        str = size + " "+files[0][i] ;
        if (files[1][i]==-2) str += "/" ;
	while (strlen(str)<16) str += " " ;
        write (str) ;
	if (i % 4 == 3) write ("\n") ;
    }
    if (sizeof(files[ 0]) % 4 >0) write ("\n") ;
    return 1 ;
}