/**
*******************************************************************************
* Copyright (C) 2006-2007, International Business Machines Corporation and    *
* others. All Rights Reserved.                                                *
*******************************************************************************
*
*******************************************************************************
*/ 
package com.ibm.icu.charset;

interface UConverterConstants {

    static final short UNSIGNED_BYTE_MASK = 0xff;
    static final int UNSIGNED_SHORT_MASK = 0xffff;
    static final long UNSIGNED_INT_MASK = 0xffffffffL;
    
    static final int U_IS_BIG_ENDIAN = 0;
	
	/**
	 * Useful constant for the maximum size of the whole locale ID
	 * (including the terminating NULL).
	 * @draft ICU 3.6
	 */
	static final int ULOC_FULLNAME_CAPACITY = 56;
	
	/**
	 * This value is intended for sentinel values for APIs that
	 * (take or) return single code points (UChar32).
	 * It is outside of the Unicode code point range 0..0x10ffff.
	 * 
	 * For example, a "done" or "error" value in a new API
	 * could be indicated with U_SENTINEL.
	 *
	 * ICU APIs designed before ICU 2.4 usually define service-specific "done"
	 * values, mostly 0xffff.
	 * Those may need to be distinguished from
	 * actual U+ffff text contents by calling functions like
	 * CharacterIterator::hasNext() or UnicodeString::length().
	 * @draft ICU 2.4
	 */
	static final int U_SENTINEL = -1;
	
	//end utf.h
	
	//begin ucnv.h	
	/**
	 * Character that separates converter names from options and options from each other.
	 * @see CharsetICU#forNameICU(String)
	 * @draft ICU 3.6
	 */
	static final byte OPTION_SEP_CHAR  = ',';
	
	/** Maximum length of a converter name including the terminating NULL @draft ICU 3.6 */
	static final int MAX_CONVERTER_NAME_LENGTH  = 60;
	/** Maximum length of a converter name including path and terminating NULL @draft ICU 3.6 */
	static final int MAX_FULL_FILE_NAME_LENGTH = (600+MAX_CONVERTER_NAME_LENGTH);
	
	/** Shift in for EBDCDIC_STATEFUL and iso2022 states @draft ICU 3.6 */
	static final int SI = 0x0F;
	/** Shift out for EBDCDIC_STATEFUL and iso2022 states @draft ICU 3.6 */
	static final int SO = 0x0E;
	
	//end ucnv.h
	
	// begin bld.h
	/* size of the overflow buffers in UConverter, enough for escaping callbacks */
	//#define ERROR_BUFFER_LENGTH 32
	static final int ERROR_BUFFER_LENGTH = 32;
	
	/* at most 4 bytes per substitution character (part of .cnv file format! see UConverterStaticData) */
	static final int MAX_SUBCHAR_LEN = 4;
	
	/* at most 8 bytes per character in toUBytes[] (UTF-8 uses up to 6) */
	static final int MAX_CHAR_LEN = 8;
	
	/* converter options bits */
	static final int OPTION_VERSION     = 0xf;
	static final int OPTION_SWAP_LFNL   = 0x10;
	static final int OPTION_MAC   = 0x20; //agljport:comment added for Mac ISCII encodings
	
	/** values for the unicodeMask */
	static final int HAS_SUPPLEMENTARY = 1;
	static final int HAS_SURROGATES =   2;
	// end bld.h
	
	// begin cnv.h
	/* this is used in fromUnicode DBCS tables as an "unassigned" marker */
	static final int missingCharMarker = 0xFFFF;
	 /**
      * 
      * @author ram
      * @draft ICU 3.6
      * @provisional This API might change or be removed in a future release.
	  */
	static interface UConverterResetChoice {
	    static final int RESET_BOTH = 0;
	    static final int RESET_TO_UNICODE = RESET_BOTH + 1;
	    static final int RESET_FROM_UNICODE = RESET_TO_UNICODE + 1;
	}
	
	// begin utf16.h
	/**
	 * The maximum number of 16-bit code units per Unicode code point (U+0000..U+10ffff).
	 * @draft ICU 2.4
	 */
	static final int U16_MAX_LENGTH = 2;
	// end utf16.h	
	
	// begin err.h	
	/**
	 * FROM_U, TO_U context options for sub callback
	 * @draft ICU 3.6
	 */
	static byte[] SUB_STOP_ON_ILLEGAL = {'i'};
	
	/**
	 * FROM_U, TO_U context options for skip callback
	 * @draft ICU 3.6
	 */
	static byte[] SKIP_STOP_ON_ILLEGAL = {'i'};	
	
	/** 
	 * The process condition code to be used with the callbacks.  
	 * Codes which are greater than IRREGULAR should be 
	 * passed on to any chained callbacks.
	 * @draft ICU 3.6
     * @provisional This API might change or be removed in a future release.
	 */
	static interface UConverterCallbackReason {
		 static final int UNASSIGNED = 0;  /**< The code point is unassigned.
	                             The error code U_INVALID_CHAR_FOUND will be set. */
		 static final int ILLEGAL = 1;     /**< The code point is illegal. For example, 
	                             \\x81\\x2E is illegal in SJIS because \\x2E
	                             is not a valid trail byte for the \\x81 
	                             lead byte.
	                             Also, starting with Unicode 3.0.1, non-shortest byte sequences
	                             in UTF-8 (like \\xC1\\xA1 instead of \\x61 for U+0061)
	                             are also illegal, not just irregular.
	                             The error code U_ILLEGAL_CHAR_FOUND will be set. */
		 static final int IRREGULAR = 2;   /**< The codepoint is not a regular sequence in 
	                             the encoding. For example, \\xED\\xA0\\x80..\\xED\\xBF\\xBF
	                             are irregular UTF-8 byte sequences for single surrogate
	                             code points.
	                             The error code U_INVALID_CHAR_FOUND will be set. */
		 static final int RESET = 3;       /**< The callback is called with this reason when a
	                             'reset' has occured. Callback should reset all
	                             state. */
		 static final int CLOSE = 4;        /**< Called when the converter is closed. The
	                             callback should release any allocated memory.*/
		 static final int CLONE = 5;         /**< Called when safeClone() is called on the
	                              converter. the pointer available as the
	                              'context' is an alias to the original converters'
	                              context pointer. If the context must be owned
	                              by the new converter, the callback must clone 
	                              the data and call setFromUCallback 
	                              (or setToUCallback) with the correct pointer.
	                              @draft ICU 2.2
	                           */
	}
	//end err.h
    
    
    static final String DATA_TYPE = "cnv";
    static final int CNV_DATA_BUFFER_SIZE = 25000;
    static final int SIZE_OF_UCONVERTER_SHARED_DATA = 100;

    static final int MAXIMUM_UCS2 =            0x0000FFFF;
    static final int MAXIMUM_UTF =             0x0010FFFF;
    //static final int MAXIMUM_UCS4 =            0x7FFFFFFF;
    static final int HALF_SHIFT =              10;
    static final int HALF_BASE =               0x0010000;
    static final int HALF_MASK =               0x3FF;
    static final int SURROGATE_HIGH_START =    0xD800;
    static final int SURROGATE_HIGH_END =      0xDBFF;
    static final int SURROGATE_LOW_START =     0xDC00;
    static final int SURROGATE_LOW_END =       0xDFFF;
    
    /* -SURROGATE_LOW_START + HALF_BASE */
    static final int SURROGATE_LOW_BASE =      9216;
}
