/* java_utf8.h
   Copyright (C) 2005 Free Software Foundation, Inc.

This file is part of Mysaifu JVM

Mysaifu JVM is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.

Mysaifu JVM is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
General Public License for more details.

You should have received a copy of the GNU General Public License
along with GNU Classpath; see the file COPYING.  If not, write to the
Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
02111-1307 USA.
*/

#ifndef JAVA_UTF8_H_INCLUDED
#define	JAVA_UTF8_H_INCLUDED

/**
 * Java UTF-8文字列
 */
typedef const char	java_utf8;
// struct java_utf8 {};

#include "ClassFile.h"

/**
 * frame構造体
 */
struct frame;

/**
 * UTF-8関連処理を初期化する
 */
void init_utf8_settings();

/**
 * 指定されたUTF-8文字列を「インターン」する
 */
java_utf8* intern_utf8(const char* utf8);
java_utf8* intern_utf8(const char* utf8, int length);

/**
 * 指定されたUTF-8文字列に対応するStringの参照をスタックにpushする
 * pushされるStringの参照は String.intern() された結果となる。
 *
 * @param	utf8	対象となるUTF-8文字列
 * @param	frame	Stringの参照をpushするスタック
 * @return	スタックにpushされたStringの参照。
 */
jstring intern_string(const char* utf8, frame* frame);

#define	utf8cmp	strcmp

/**
 * TCHARとUTF-8との比較を行う。２つの表現が等しい場合はtrueを返す。
 */
bool equals(const TCHAR* str, const char* utf8);

/**
 * ２つのUTF-8文字列の内容を比較し、等しい場合はtrueを返す
 *
 */
inline bool equals(const char* str1, const char* str2) {
	return strcmp(str1, str2) == 0;
}

/**
 * UTF-8文字列を、TCHAR文字列に変換する
 *
 * @param	utf8	変換元文字列。'\0' で終端されていること。
 * @param	buff	TCHAR文字列のバッファ
 * @param	bufflen TCHAR文字列バッファのサイズ
 * @return	変換後のTCHAR文字列の長さ
 */
int convert_to_TCHAR(const char* utf8, TCHAR* buff, unsigned int bufflen);

/**
 * TCHAR文字列の内容を、UTF-8文字列に変換する
 * 変換後のUTF-8文字列は、必ず'\0'で終端される
 *
 * @param	src			TCHAR文字列のバッファ
 * @param	srclen		変換対象となる文字数。-1の場合には_T('\0')までを変換対象とする
 * @param	utf8buff	変換後ののデータが入るバッファ
 * @param	utf8bufflen	変換後のバッファサイズ
 * @return  変換後の文字列の長さ
 */
int convert_to_utf8(const TCHAR* src, int srclen, char* utf8, int utf8len);

/**
 * 指定されたTCHARをUTF-8に変換した場合のバイト数を返す
 *
 * @param	src		変換対象となる文字列
 * @param	srclen	変換する文字数
 */
int get_utf8_length_of(const TCHAR* src, int srclen);

/**
 * 指定されたバイトが存在する位置を返す。
 */
int last_index_of(const java_utf8* utf8, u1 data);

// グローバル変数

/**
 * java.lang.Classクラス名
 */
extern java_utf8* CLASS_CLASS_NAME;

/**
 * java.lang.Stringクラス名
 */
extern java_utf8* STRING_CLASS_NAME;

/**
 * "<clinit>"メソッド名
 */
extern java_utf8* CLINIT_METHOD_NAME;

/**
 * 	"<init>"メソッド名
 */
extern java_utf8* INIT_METHOD_NAME;

/**
 * "finalize()"メソッド名
 */
extern java_utf8* FINALIZE_METHOD_NAME;

/**
 * "finalize()"メソッドのディスクリプタ ("()V")
 */
extern java_utf8* VOID_NOARG_METHOD_DESCRIPTOR;

/**
 * clone() メソッド名
 */
extern java_utf8* CLONE_METHOD_NAME;

/**
 * java/lang/Object
 */
extern java_utf8* JAVA_LANG_OBJECT_CLASS_NAME;

/**
 * java/lang/Cloneable
 */
extern java_utf8* JAVA_LANG_CLONEABLE_CLASS_NAME;

/**
 * java/io/Serializable
 */
extern java_utf8* JAVA_IO_SERIALIZABLE_CLASS_NAME;

extern java_utf8* JAVA_LANG_VMCLASS_CLASS_NAME;
extern java_utf8* JAVA_LANG_CLASS_CONSTRUCTOR_DESCRIPTOR;
extern java_utf8* STRING_ARG_CONSTRUCTOR_DESCRIPTOR;
extern java_utf8* CHAR_ARRAY_ARG_CONSTRUCTOR_DESCRIPTOR;

/**
 * プリミティブ配列クラス名
 */
extern const  java_utf8* BOOLEAN_ARRAY_CLASS_NAME;
extern const  java_utf8* BYTE_ARRAY_CLASS_NAME;
extern const  java_utf8* SHORT_ARRAY_CLASS_NAME;
extern const  java_utf8* CHAR_ARRAY_CLASS_NAME;
extern const  java_utf8* INT_ARRAY_CLASS_NAME;
extern const  java_utf8* LONG_ARRAY_CLASS_NAME;
extern const  java_utf8* FLOAT_ARRAY_CLASS_NAME;
extern const  java_utf8* DOUBLE_ARRAY_CLASS_NAME;
extern const  java_utf8* PRIMITIVE_ARRAY_CLASS_NAMES[];

#endif
