lima-1.0b5/
lima-1.0b5/driver/
lima-1.0b5/driver/ChangeLog.old/
lima-1.0b5/driver/Win32/
lima-1.0b5/driver/compat/
lima-1.0b5/driver/include/
lima-1.0b5/driver/testsuite/
lima-1.0b5/driver/testsuite/clone/
lima-1.0b5/driver/testsuite/command/
lima-1.0b5/driver/testsuite/data/
lima-1.0b5/driver/testsuite/etc/
lima-1.0b5/driver/testsuite/include/
lima-1.0b5/driver/testsuite/inherit/
lima-1.0b5/driver/testsuite/inherit/master/
lima-1.0b5/driver/testsuite/log/
lima-1.0b5/driver/testsuite/single/
lima-1.0b5/driver/testsuite/single/tests/compiler/
lima-1.0b5/driver/testsuite/single/tests/efuns/
lima-1.0b5/driver/testsuite/single/tests/operators/
lima-1.0b5/driver/testsuite/u/
lima-1.0b5/driver/tmp/
lima-1.0b5/etc/
lima-1.0b5/lib/WWW/help/
lima-1.0b5/lib/cmds/
lima-1.0b5/lib/cmds/create/
lima-1.0b5/lib/cmds/player/attic/
lima-1.0b5/lib/contrib/bboard/
lima-1.0b5/lib/contrib/boards/
lima-1.0b5/lib/contrib/marriage/
lima-1.0b5/lib/contrib/roommaker/
lima-1.0b5/lib/contrib/transient_effect/
lima-1.0b5/lib/daemons/channel/
lima-1.0b5/lib/daemons/imud/
lima-1.0b5/lib/data/
lima-1.0b5/lib/data/config/
lima-1.0b5/lib/data/links/
lima-1.0b5/lib/data/news/
lima-1.0b5/lib/data/players/
lima-1.0b5/lib/data/secure/
lima-1.0b5/lib/domains/
lima-1.0b5/lib/domains/std/2.4.5/maze1/
lima-1.0b5/lib/domains/std/2.4.5/npc/
lima-1.0b5/lib/domains/std/2.4.5/post_dir/
lima-1.0b5/lib/domains/std/2.4.5/sub/
lima-1.0b5/lib/domains/std/camera/
lima-1.0b5/lib/domains/std/config/
lima-1.0b5/lib/domains/std/cult/
lima-1.0b5/lib/domains/std/effects/
lima-1.0b5/lib/domains/std/misc/
lima-1.0b5/lib/domains/std/monsters/
lima-1.0b5/lib/domains/std/recorder/
lima-1.0b5/lib/domains/std/rooms/
lima-1.0b5/lib/domains/std/rooms/beach/
lima-1.0b5/lib/domains/std/rooms/labyrinth/
lima-1.0b5/lib/domains/std/school/
lima-1.0b5/lib/domains/std/school/O/
lima-1.0b5/lib/domains/std/spells/
lima-1.0b5/lib/domains/std/spells/stock-mage/
lima-1.0b5/lib/domains/std/spells/stock-priest/
lima-1.0b5/lib/help/
lima-1.0b5/lib/help/admin/
lima-1.0b5/lib/help/hints/General_Questions/
lima-1.0b5/lib/help/hints/Pirate_Quest/
lima-1.0b5/lib/help/player/
lima-1.0b5/lib/help/player/bin/
lima-1.0b5/lib/help/player/quests/
lima-1.0b5/lib/help/wizard/
lima-1.0b5/lib/help/wizard/coding/guilds/
lima-1.0b5/lib/help/wizard/coding/rooms/
lima-1.0b5/lib/help/wizard/lib/daemons/
lima-1.0b5/lib/help/wizard/lib/lfun/
lima-1.0b5/lib/help/wizard/lib/std/
lima-1.0b5/lib/help/wizard/mudos_doc/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/interactive/
lima-1.0b5/lib/help/wizard/mudos_doc/applies/parsing/
lima-1.0b5/lib/help/wizard/mudos_doc/concepts/
lima-1.0b5/lib/help/wizard/mudos_doc/driver/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/arrays/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/buffers/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/compile/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/filesystem/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/floats/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/functions/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/general/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/mappings/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/mixed/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/numbers/
lima-1.0b5/lib/help/wizard/mudos_doc/efuns/parsing/
lima-1.0b5/lib/help/wizard/mudos_doc/lpc/constructs/
lima-1.0b5/lib/help/wizard/mudos_doc/lpc/types/
lima-1.0b5/lib/include/driver/
lima-1.0b5/lib/log/
lima-1.0b5/lib/obj/admtool/
lima-1.0b5/lib/obj/admtool/internal/
lima-1.0b5/lib/obj/admtool/mudinfo/
lima-1.0b5/lib/obj/admtool/secure/
lima-1.0b5/lib/obj/secure/
lima-1.0b5/lib/obj/secure/cmd/
lima-1.0b5/lib/obj/secure/mailers/
lima-1.0b5/lib/obj/secure/shell/
lima-1.0b5/lib/obj/secure/shell/classes/
lima-1.0b5/lib/obj/tasktool/
lima-1.0b5/lib/obj/tasktool/internal/
lima-1.0b5/lib/open/
lima-1.0b5/lib/secure/
lima-1.0b5/lib/secure/cgi/
lima-1.0b5/lib/secure/modules/
lima-1.0b5/lib/secure/simul_efun/
lima-1.0b5/lib/std/adversary/
lima-1.0b5/lib/std/adversary/advancement/
lima-1.0b5/lib/std/adversary/armor/
lima-1.0b5/lib/std/adversary/blows/
lima-1.0b5/lib/std/adversary/death/
lima-1.0b5/lib/std/adversary/formula/
lima-1.0b5/lib/std/adversary/health/
lima-1.0b5/lib/std/adversary/pulse/
lima-1.0b5/lib/std/adversary/wield/
lima-1.0b5/lib/std/classes/event_info/
lima-1.0b5/lib/std/container/
lima-1.0b5/lib/std/living/
lima-1.0b5/lib/std/modules/contrib/
lima-1.0b5/lib/std/patterns/
lima-1.0b5/lib/std/race/
lima-1.0b5/lib/std/race/restricted/
lima-1.0b5/lib/std/room/
lima-1.0b5/lib/tmp/
lima-1.0b5/lib/trans/
lima-1.0b5/lib/trans/admincmds/
lima-1.0b5/lib/trans/obj/
lima-1.0b5/lib/wiz/
/* Do not remove the headers from this file! see /USAGE for more info. */

#define CARET_AS_NOT

nosave private mapping cache = ([]);


int has_magic( string s ){
    return sizeof( regexp( ({ s }), "[\\[\\*\\]\\?]"));
}

// The flag toggles whether or not ^ and $ are valid.
// 1 means valid.
varargs string translate( string pat, int flag )
{
    int 	i, j, n;
    string	res, stuff;

    n = strlen(pat);
    res = "";

    for( i = 0; i < n; i++ )
    {
	if( pat[i] == '\\' && i+1 != n ){
	    res += pat[i..++i];
	    continue;
	}
	switch( pat[i] ){
	case '^':
	case '$':
	    if(flag)
	    {
		res += pat[i..i];
		continue;
	    }
	case '.':	
	    res += "\\" + pat[i..i];
	    continue;
	case	'*':
	    res += ".*";
	    continue;
	case '?':	
	    res += ".";
	    continue;
	case '[':
	    j=i;
	    if( j<n && pat[j] == '!' ) j++;
#ifdef  CARET_AS_NOT
	    if( j<n && pat[j] == '^' ) j++;
#endif
	    if( j<n && pat[j] == ']' ) j++;
	    while( j < n && pat[j] != ']' ) j++;
	    if( j >= n )
		res += "\\[";
	    else{
		stuff = pat[i+1..j];
#ifndef CARET_AS_NOT
		if( member_array('^', stuff) != -1 )
		    stuff = replace_string(stuff,"^","\\^");
#endif
		i = j;
		if( strlen(stuff) > 2 && stuff[0] == '!' ) stuff = "[^"+stuff[1..];
		else stuff = "[" + stuff;
		res += stuff;
	    }
	    continue;
	default:
	    res+= pat[i..i];
	    continue;
	}
    }
    return res;
}

int fnmatch( string name, string pattern )
{
    string 	result;

    if( undefinedp(cache[pattern]) ){
	result = "^"+translate(pattern)+"$";
	cache[pattern] = result;
    }
    return sizeof( regexp( ({ name }), cache[pattern] ) );
}

private string* glob1( string dirname, string pattern){
    mixed*	names, result;
    string	name;
    int		i,j;

    names = get_dir(dirname+"/*");
    result = ({});
    j = sizeof(names);
    for(i=0;i<j;i++){
	name = names[i];
	if(name != "." && name != ".."){
	    if (fnmatch(name, pattern)){
		result += ({ name });
	    }
	}
    }
    return result;
}


string* glob( mixed pathname ){
    string	dirname, basename, name;
    mixed*	list, result, sublist;
    int		i;

    if( !stringp(pathname) )  return ({});
    if( !has_magic(pathname) ){
	if( path_exists( pathname ) ){
	    return ({ pathname });	
	}
	else{
	    return ({});
	}
    }
    pathname = split_path( pathname );
    dirname = pathname[0];
    basename = pathname[1];
    if( has_magic(dirname) ){
	list = glob(dirname);
    }
    else{
	list = ({ dirname });
    }
    if( !has_magic(basename) ){
	result = ({});
	i = sizeof(list);
	while(i--){
	    dirname = list[i];
	    if( basename || is_directory(dirname) ){
		name = dirname+"/"+basename;
		if( path_exists(name) )
		{
		    result += ({ name });
		}
	    }
	}
    }
    else{
	result = ({});
	i = sizeof(list);
	while(i--){
	    dirname = list[i];
	    if(!strlen(dirname)) continue;
	    if( dirname[<1] == '/' )
	    {
		if( strlen(dirname) == 1 )
		    dirname = "";
		else 
		    dirname = dirname[0..<2];
	    }
	    sublist = glob1( dirname, basename );
	    sublist = map_array( sublist, (: $(dirname) + "/" + $1 :) );

	    result += sublist;
	}
    }
    return result;
}