/
area/
classes/net/sourceforge/pain/logic/
classes/net/sourceforge/pain/logic/event/
classes/net/sourceforge/pain/logic/fn/util/
classes/net/sourceforge/pain/network/console/
classes/net/sourceforge/pain/plugin/
classes/net/sourceforge/pain/plugin/reset/
classes/net/sourceforge/pain/plugin/shutdown/
classes/net/sourceforge/pain/plugin/social/
classest/net/sourceforge/pain/db/data/
doc/
doc/paindb/resources/
src/net/sourceforge/pain/logic/
src/net/sourceforge/pain/logic/event/
src/net/sourceforge/pain/logic/fn/util/
src/net/sourceforge/pain/network/console/
src/net/sourceforge/pain/network/console/telnet/
src/net/sourceforge/pain/plugin/
src/net/sourceforge/pain/plugin/command/
src/net/sourceforge/pain/plugin/reset/
src/net/sourceforge/pain/plugin/shutdown/
src/net/sourceforge/pain/plugin/social/
src/net/sourceforge/pain/util/
tests/
tests/net/sourceforge/pain/db/data/
package net.sourceforge.pain.logic.fn.util;

import net.sourceforge.pain.data.type.*;

import java.util.regex.*;

/**
 * PAiN  Date: 05.06.2003  Time: 1:57:10
 */
public final class Utils {

	private final static String[] spaces = new String[20];
	public static Pattern WHITESPACE_SPLIT_PATTERN = Pattern.compile("[\\s]+");

	static {
		StringBuffer buf = new StringBuffer(spaces.length);
		for (int i = 0; i < spaces.length; i++) {
			buf.append(' ');
			spaces[i] = buf.toString();
		}
	}

	public static String getStackTrace(Exception e) {
		final StackTraceElement[] stack = e.getStackTrace();
		StringBuffer result = new StringBuffer(2048);
		for (int i = 0; i < stack.length; i++) {
			result.append("\t");
			result.append(stack[i].toString());
			result.append("\n");
		}
		return result.toString();
	}

	public static String whiteSpaceChars(int n) {
		if (n < 10) {
			return spaces[n];
		} else {
			StringBuffer s = new StringBuffer(n);
			while (--n >= 0) {
				s.append(' ');
			}
			return s.toString();
		}
	}

	public static int numStrLen(int num) {
		int strLen = num < 0 ? 2 : 1;
		while (Math.abs(num) > 9) {
			strLen++;
			num = num / 10;
		}
		return strLen;
	}

	public static String classNameWithoutPackage(Class clazz) {
		String name = clazz.getName();
		int i = name.lastIndexOf('.');
		return name.substring(i + 1);
	}

	public static String formatName(String name) {
		return Character.toUpperCase(name.charAt(0)) + name.substring(1);
	}

	public static int exitCharToDir(final char direction) throws IllegalArgumentException {
		int dir;
		switch (direction) {
			case 'n':
			case 'N':
				dir = LinkedSpace.DIR_NORTH;
				break;
			case 'e':
			case 'E':
				dir = LinkedSpace.DIR_EAST;
				break;
			case 's':
			case 'S':
				dir = LinkedSpace.DIR_SOUTH;
				break;
			case 'w':
			case 'W':
				dir = LinkedSpace.DIR_WEST;
				break;
			case 'u':
			case 'U':
				dir = LinkedSpace.DIR_UP;
				break;
			case 'd':
			case 'D':
				dir = LinkedSpace.DIR_DOWN;
				break;
			default:
				throw new IllegalArgumentException("Illegal Direction:" + direction);
		}
		return dir;
	}

	/**
	 * @param exitName - lowercase value
	 * @return direction or -1 if fails
	 */
	public static int exitNameToDir(final String exitName) {
		if (exitName != null) {
			String[] exitNames = LangUtil.exitName;
			int len = exitNames.length;
			for (int i = 0; i < len; i++) {
				if (exitNames[i].startsWith(exitName)) {
					return i;
				}
			}
		}
		return -1;
	}


	public static String formattedStacktrace(Exception e) {
		return "{RError!: " + e.getClass().getName() + ":" + e.getMessage() + "\n{w" + getStackTrace(e) + "{x";
	}

	/** starts check starting from target.length() character
	 *  @param prefix is prefix for both name and thenName.
	 *  @return IF name IS CLOSER TO target THAN thanName
	 * */
	public static boolean isCloserTo(String prefix, String name, String thenName) {
		int lenDif = name.length() - thenName.length();
		if (lenDif < 0) {
			return true; // name is shorter
		}
		if (lenDif > 0) {
			return false; // thenName is shorter
		}
		int len = name.length();
		for (int i = prefix.length(); i < len; i++) {
			char nc = name.charAt(i);
			char tnc = thenName.charAt(i);
			if (nc != tnc) {
				return nc < tnc;
			}
		}
		return true;
	}
}