foundation2_fluffos_v1/
foundation2_fluffos_v1/bin/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/ChangeLog.old/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/Win32/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/compat/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/compat/simuls/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/include/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/clone/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/command/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/data/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/etc/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/include/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/inherit/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/inherit/master/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/log/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/single/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/single/tests/compiler/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/single/tests/efuns/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/single/tests/operators/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/testsuite/u/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/tmp/
foundation2_fluffos_v1/fluffos-2.9-ds2.13/windows/
foundation2_fluffos_v1/lib/cfg/
foundation2_fluffos_v1/lib/cmds/adm/
foundation2_fluffos_v1/lib/daemon/save/
foundation2_fluffos_v1/lib/daemon/services/
foundation2_fluffos_v1/lib/daemon/soul/
foundation2_fluffos_v1/lib/doc/build/
foundation2_fluffos_v1/lib/doc/classes/
foundation2_fluffos_v1/lib/doc/driver/
foundation2_fluffos_v1/lib/doc/driver/applies/
foundation2_fluffos_v1/lib/doc/driver/applies/interactive/
foundation2_fluffos_v1/lib/doc/driver/concepts/
foundation2_fluffos_v1/lib/doc/driver/driver/
foundation2_fluffos_v1/lib/doc/driver/efuns/arrays/
foundation2_fluffos_v1/lib/doc/driver/efuns/buffers/
foundation2_fluffos_v1/lib/doc/driver/efuns/calls/
foundation2_fluffos_v1/lib/doc/driver/efuns/compile/
foundation2_fluffos_v1/lib/doc/driver/efuns/filesystem/
foundation2_fluffos_v1/lib/doc/driver/efuns/floats/
foundation2_fluffos_v1/lib/doc/driver/efuns/functions/
foundation2_fluffos_v1/lib/doc/driver/efuns/general/
foundation2_fluffos_v1/lib/doc/driver/efuns/mappings/
foundation2_fluffos_v1/lib/doc/driver/efuns/numbers/
foundation2_fluffos_v1/lib/doc/driver/efuns/parsing/
foundation2_fluffos_v1/lib/doc/driver/lpc/constructs/
foundation2_fluffos_v1/lib/doc/driver/lpc/types/
foundation2_fluffos_v1/lib/doc/driver/platforms/
foundation2_fluffos_v1/lib/doc/efun/
foundation2_fluffos_v1/lib/doc/etc/
foundation2_fluffos_v1/lib/doc/faq/
foundation2_fluffos_v1/lib/doc/help/creator/
foundation2_fluffos_v1/lib/doc/help/player/
foundation2_fluffos_v1/lib/doc/lpc/basic/
foundation2_fluffos_v1/lib/doc/lpc/data_types/
foundation2_fluffos_v1/lib/doc/lpc/etc/
foundation2_fluffos_v1/lib/doc/lpc/intermediate/
foundation2_fluffos_v1/lib/doc/lpc/types/
foundation2_fluffos_v1/lib/doc/mudlib/
foundation2_fluffos_v1/lib/doc/mudlib/Features/
foundation2_fluffos_v1/lib/domains/Examples/armour/
foundation2_fluffos_v1/lib/domains/Examples/etc/
foundation2_fluffos_v1/lib/domains/Examples/npc/
foundation2_fluffos_v1/lib/domains/Examples/room/
foundation2_fluffos_v1/lib/domains/Examples/virtual/
foundation2_fluffos_v1/lib/domains/Examples/virtual/exaA/
foundation2_fluffos_v1/lib/domains/Examples/virtual/exaB/
foundation2_fluffos_v1/lib/domains/Examples/weapon/
foundation2_fluffos_v1/lib/domains/School/doc/
foundation2_fluffos_v1/lib/domains/School/room/
foundation2_fluffos_v1/lib/domains/School/room/Classes/
foundation2_fluffos_v1/lib/domains/School/room/Offices/
foundation2_fluffos_v1/lib/domains/Standard/
foundation2_fluffos_v1/lib/domains/Standard/pools/
foundation2_fluffos_v1/lib/domains/Standard/std/
foundation2_fluffos_v1/lib/domains/Standard/xtra/
foundation2_fluffos_v1/lib/include/
foundation2_fluffos_v1/lib/lib/obj/
foundation2_fluffos_v1/lib/news/
foundation2_fluffos_v1/lib/save/
foundation2_fluffos_v1/lib/secure/cfg/
foundation2_fluffos_v1/lib/secure/cmds/player/
foundation2_fluffos_v1/lib/secure/lib/
foundation2_fluffos_v1/old/
foundation2_fluffos_v1/win32/
/*    /adm/sefun/strings.c
 *    from Foundation II
 *    sefuns for string manipulation
 *    created by Descartes of Borg 940506
 */

varargs string center(string str, int x) {
    int y;

    if(!x) x= 80;
    if((y = strlen(strip_colours(str))) >= x) return str;
    x = x + strlen(str) - y;
    return sprintf(sprintf("%%|%ds", x), str);
}

varargs string arrange_string(string str, int x) {
    int y;

    if(!x) x = 80;
    x += strlen(str) - strlen(strip_colours(str));
    return sprintf(sprintf("%%:-%ds", x), str);
}

string trim(string str) {
    string *whitespace;
    int j, i = 0;
 
    j = strlen(str) - 1;
    whitespace = ({ ' ', '\t' });
    while(member_array(str[i], whitespace) != -1) i++;
    while(i < j  && member_array(str[j], whitespace) != -1) j--;
    return str[i..j];
}
/* #define NEW_WRAP */
#ifndef NEW_WRAP
varargs string wrap(string str, int x) {
    if( !x ) {
        if( !this_player() ) x = 79;
        else {
            int *tmp;

            tmp = (int *)this_player()->GetScreen();
            if( tmp ) x = (tmp[0] || 79);
            else x = 79;
        }
    }
    return sprintf("%-=" + x + "s\n", str);
}
#else
varargs string wrap(string str, int x) {
    string ret = "";
    int len;

    if(find_player("descartes"))
      message("system", str, find_player("descartes"));
    if( !x ) {
	if( !this_player() ) x = 79;
	else x = ((int *)this_player()->GetScreen())[0] || 79;
    }
    else if( x < 5 ) return str;
    while( (len = strlen(str)) >= x ) {
	int i, count, ignore, actual;

	for(i=0, count = 0, actual = 0; i<len; i++) {
	    int pt;

	    ret = ret + str[i..i];
	    if( str[i] == '\n' ) {
		str = str[i+1..];
		break;
	    }
	    actual++;
	    if( ignore ) {
		if( ignore == 1 && str[i] != '%' ) continue;
		if( i == len-1 ) continue;
		else if( ignore == 1 ) {
		    if( str[i+1] != '^' ) continue;
		    if( i == len-2 || str[i+2] != '^' ) {
			ignore = 2;
			continue;
		    }
		    continue;
		}
		else {
		    ignore = 0;
		    continue;
		}
	    }
	    else {
		if( i != len-1 ) count++;
		else if( str[i] != '%' ) count++;
		else if( str[i+1] != '^' ) count++;
		else {
		    if( i == len-2 || str[i+2] != '^' ) {
			ignore = 1;
			continue;
		    }
		    count++;
		}
	    }
	    if( count < x ) continue;
	    if( count == x ) {
		int no_whitespace;

		pt = actual;
		write(ret[<1..<1] + " : " + str[(pt-1)..(pt-1)]);
		if( str[pt-1] == ' ' || str[pt-1] == '-' ) {
		    if( str[pt-1] == '-' ) ret = ret[0..<2] + "\n";
		    if( pt < len-2 && str[pt] == ' ' ) {
			if( pt < len-3 ) str = str[pt+1..];
			else str = "";
		    }
		    else if( pt < len-2 ) str = str[pt..];
		    else str = "";
		    break;
		}
		else if( pt < len-1 && (str[pt] == ' ' || str[pt] == '\n') ) {
		    if( pt < len-2 ) str = str[pt+1..];
		    else str = "";
		    break;
		}
		else {
		    no_whitespace = 1;
		    while( --pt ) {
			int ch;
			
			ch = str[pt-1];
			if( ch == ' ' || ch == '-' ) {
			    ret = ret[0..<(actual-pt+1)] + "\n";
			    str = str[pt..];
			    no_whitespace = 0;
			    break;
			}
		    }
		    if( !no_whitespace ) break;
		}
	    }
	    else if( str[actual-1] == ' ' || str[actual-1] == '-' ) {
		ret = ret[0..<2] + "\n";
		str = str[actual..];
		break;
	    }
	}
    }
    return ret + str + "\n";
}
#endif    
varargs mixed convert_string(string str, int flag) {
    mixed *ret = ({ 0, "" });

    if( (str = trim(str)) == "" ) return 0;
    if( str[0] == '(' ) {
	switch(str[1]) {

	    case '{':

	    ret[0] = ({});
	    str = str[2..];
	    while(str[0] != '}') {
		mixed *tmp;

		tmp = convert_string(str, 1);
		ret[0] += ({ tmp[0] });
		str = tmp[1];
		while(str[0] == ' ' || str[0] == '\t') str = str[1..];
		if( str[0] != ',' && str[0] != '}' )
		  error("Improperly formatted array: " + str + "\n");
		else if( str[0] == ',') {
		    str = str[1..];
		    while(str[0] == ' ' || str[0] == '\t') str = str[1..];
		}
	    }
	    if( str[1] != ')' ) {
		str = str[2..];
		while(str[0] == ' ' || str[0] == '\t') str = str[1..];
		if( str[0] != ')' ) error("Illegal array terminator.\n");
		else ret[1] = str[1..];
	    }
	    else ret[1] = str[2..];
	    if( !flag ) return ret[0];
	    while(ret[1][0] == ' ' || ret[1][0] == '\t') ret[1] = ret[1][1..];
	    return ret[0];

	    case '[':

	    ret[0] = ([]);
	    str = str[2..];
	    while(str[0] != ']') {
		mixed *tmp;
		mixed cle, val;

		tmp = convert_string(str, 1);
		str = tmp[1];
		while(str[0] == ' ' || str[0] == '\t') str = str[1..];
		if( str[0] != ':' ) 
		  error("Illegally formatting mapping: " + str + "\n");
		cle = tmp[0];
		tmp = convert_string(str[1..], 1);
		ret[0][cle] = tmp[0];
		str = tmp[1];
		while(str[0] == ' ' || str[0] == '\t') str = str[1..];
		if( str[0] != ',' && str[0] != ']' ) 
		  error("Illegally formatted mapping: " + str + "n");
		else if( str[0] != ']' ) {
		    str = str[1..];
		    while(str[0] == ' ' || str[0] == '\t') str = str[1..];
		}
	    }
	    if( str[1] != ')' ) {
		str = str[2..];
		while(str[0] == ' ' || str[0] == '\t') str = str[1..];
		if( str[0] != ')' ) error("Illegal array terminator.\n");
		else ret[1] = str[1..];
	    }
	    else ret[1] = str[2..];
	    if( !flag ) return ret[0];
	    while(ret[1][0] == ' ' || ret[1][0] == '\t') ret[1] = ret[1][1..];
	    return ret;
        }
    }
    else if( str[0] == '"' ) {
	string tmp;

	tmp = "";
	while( str[1] != '"' || (str[1] == '"' && str[0] == '\\') ) {
	    if( str[1] == '"' ) tmp = tmp[0..<2] + "\"";
	    else tmp += str[1..1];
	    str = str[1..];
	}
	if( !flag ) return tmp;
	if( strlen(str) > 2 ) str = trim(str[2..]);
	return ({ tmp, str });
    }
    else if( str[0] >= '0' && str[0] <= '9') {
	string tmp;
	int y;

	if( strlen(str) > 1 && str[0..1] == "0x" ) {
	    tmp = "0x";
	    str = str[2..];
	    while(str != "" && (str[0] >= '0' && str[0] <= '9')) {
		tmp += str[0..0];
		if( strlen(str) > 1 ) str = str[1..];
		else str = "";
	    }
	    sscanf(tmp, "%x", y);
	}
	else {
	    tmp = "";
	    while(str != "" && (str[0] >= '0' && str[0] <= '9')) {
		tmp += str[0..0];
		if( strlen(str) > 1 ) str = str[1..];
		else str = "";
	    }
	    sscanf(tmp, "%d", y);
	}
	if( !flag ) return y;
	if( str != "" ) str = trim(str);
	return ({ y, str });
    }
    else {
	string tmp;

	tmp = "";
	while(strlen(str) && ((str[0] >= 'a' && str[0] <= 'z') ||
			      (str[0] >= 'A' && str[0] <= 'Z') ||
			      (str[0] >= '0' && str[0] <= '9') ||
			      (str[0] == '_'))) {
	    tmp += str[0..0];
	    if( strlen(str) > 1 ) str = str[1..];
	    else str = "";
	}
	if( !flag ) return to_object(tmp);
	else return ({ to_object(tmp), str });
    }
    error("Gobbledygook in string.\n");
}