/*
 * Copyright (C) 2005-2006 Kouji Sugisawa. Ltd. All rights reserved.
 */

package jp.sourceforge.livez.lang;

/**
 * ASCII制御文字の定数を提供します。
 * 
 * @author 杉澤 浩二
 */
public final class Ascii {

	/**
	 * ASCII制御文字の NULL を表します。<p>
	 */
	public static final char NUL = '\u0000';

	/**
	 * ASCII制御文字の START OF HEADING を表します。<p>
	 */
	public static final char SOH = '\u0001';

	/**
	 * ASCII制御文字の START OF TEXT を表します。<p>
	 */
	public static final char STX = '\u0002';

	/**
	 * ASCII制御文字の END OF TEXT を表します。<p>
	 */
	public static final char ETX = '\u0003';

	/**
	 * ASCII制御文字の END OF TRANSMISSION を表します。<p>
	 */
	public static final char EOT = '\u0004';

	/**
	 * ASCII制御文字の ENQURY を表します。<p>
	 */
	public static final char ENQ = '\u0005';

	/**
	 * ASCII制御文字の Acknowledge を表します。<p>
	 */
	public static final char ACK = '\u0006';

	/**
	 * ASCII制御文字の BELL を表します。<p>
	 */
	public static final char BEL = '\u0007';

	/**
	 * ASCII制御文字の BACKSPACE を表します。<p>
	 */
	public static final char BS = '\u0008';

	/**
	 * ASCII制御文字の CHARACTER TABULATION (HORIZONTAL TABULATION) を表します。<p>
	 */
	public static final char HT = '\u0009';	// '\t';

	/**
	 * ASCII制御文字の CHARACTER TABULATION (HORIZONTAL TABULATION) を表します。<p>
	 * 値は HT と同じです。利便性の為に提供しています。
	 */
	public static final char TAB = HT;

	/**
	 * ASCII制御文字の LINE FEED (NEW LINE/END OF LINE) を表します。<p>
	 */
	public static final char LF = '\n';

	/**
	 * ASCII制御文字の LINE FEED (NEW LINE/END OF LINE) を表します。<p>
	 * 値は LF と同じです。利便性の為に提供しています。
	 */
	public static final char NL = LF;

	/**
	 * ASCII制御文字の LINE FEED (NEW LINE/END OF LINE) を表します。<p>
	 * 値は LF と同じです。利便性の為に提供しています。
	 */
	public static final char EOL = LF;

	/**
	 * ASCII制御文字の LINE TABULATION (VARTICAL TABULATION) を表します。<p>
	 */
	public static final char VT = '\u000B';

	/**
	 * ASCII制御文字の FORM FEED を表します。<p>
	 */
	public static final char FF = '\u000C';

	/**
	 * ASCII制御文字の CARRIAGE RETURN を表します。<p>
	 */
	public static final char CR = '\r';

	/**
	 * ASCII制御文字の SHIFT OUT を表します。<p>
	 */
	public static final char SO = '\u000E';

	/**
	 * ASCII制御文字の SHIFT IN を表します。<p>
	 */
	public static final char SI = '\u000F';

	/**
	 * ASCII制御文字の DATA LINK ESCAPE を表します。<p>
	 */
	public static final char DLE = '\u0010';

	/**
	 * ASCII制御文字の DEVICE CONTROL ONE を表します。<p>
	 */
	public static final char DC1 = '\u0011';

	/**
	 * ASCII制御文字の DEVICE CONTROL TWO を表します。<p>
	 */
	public static final char DC2 = '\u0012';

	/**
	 * ASCII制御文字の DEVICE CONTROL THREE を表します。<p>
	 */
	public static final char DC3 = '\u0013';

	/**
	 * ASCII制御文字の DEVICE CONTROL FOUR を表します。<p>
	 */
	public static final char DC4 = '\u0014';

	/**
	 * ASCII制御文字の NEGATIVE Acknowledge を表します。<p>
	 */
	public static final char NAK = '\u0015';

	/**
	 * ASCII制御文字の SYNCHRONOUS IDLE を表します。<p>
	 */
	public static final char SYN = '\u0016';

	/**
	 * ASCII制御文字の END OF TRANSMISSION BLOCK を表します。<p>
	 */
	public static final char ETB = '\u0017';

	/**
	 * ASCII制御文字の CANCEL を表します。<p>
	 */
	public static final char CAN = '\u0018';

	/**
	 * ASCII制御文字の END OF MEDIUM を表します。<p>
	 */
	public static final char EM = '\u0019';

	/**
	 * ASCII制御文字の SUBSTITUTE を表します。<p>
	 */
	public static final char SUB = '\u001A';

	/**
	 * ASCII制御文字の ESCAPE を表します。<p>
	 */
	public static final char ESC = '\u001B';

	/**
	 * ASCII制御文字の INFORMATION SEPARATOR FOUR (FILE SEPARATOR) を表します。<p>
	 */
	public static final char FS = '\u001C';

	/**
	 * ASCII制御文字の INFORMATION SEPARATOR THREE (GROUP SEPARATOR) を表します。<p>
	 */
	public static final char GS = '\u001D';

	/**
	 * ASCII制御文字の INFORMATION SEPARATOR TWO (RECORD SEPARATOR) を表します。<p>
	 */
	public static final char RS = '\u001E';

	/**
	 * ASCII制御文字の INFORMATION SEPARATOR ONE (UNIT SEPARATOR) を表します。<p>
	 */
	public static final char US = '\u001F';

	/**
	 * 半角スペースを表す。
	 */
	public static final char SP = '\u0020';

	/**
	 * ASCII制御文字の DELETE を表します。<p>
	 */
	public static final char DEL = '\u007F';

	/**
	 * 制御符号のキャリッジリターン及びラインフィードを表す。
	 */
	public static final String CRLF = "\r\n";

	/**
	 * インスタンス化できない事を強制します。<p>
	 */
	private Ascii() {}

	/**
	 * 指定された文字がASCII制御文字であるかどうかを返します。<p>
	 * 
	 * @param c 文字
	 * @return ASCII制御文字であるかどうか
	 */
	public static boolean isControlCharacter(final char c) {
		return c < SP || c == DEL;
	}

	/**
	 * 指定された文字列から制御文字を除去した文字列を返します。<p>
	 * 
	 * @param s 文字列
	 * @return 制御文字を除去した文字列
	 */
	public static String removeControlCharacters(final String s) {
		if (s == null)
			return null;

		StringBuilder results = new StringBuilder(s.length());

		for (int i = 0; i < s.length(); i++) {
			final char c = s.charAt(i);
			if (!isControlCharacter(c))
				results.append(c);
		}

		return results.toString();
	}

}
