/*	
 *	clipunic.h
 *
 *	Unicode
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2015-2016 Naoyuki Sawa
 *
 *	* Thu Mar 05 21:20:02 JST 2015 Naoyuki Sawa
 *	- 1st リリース。
 *	* Fri Mar 06 21:21:37 JST 2015 Naoyuki Sawa
 *	- strdup_ShiftJisToUtf8(),strdup_Utf8ToShiftJis()を追加しました。
 *	* Sat Mar 07 13:24:35 JST 2015 Naoyuki Sawa
 *	- 圧縮方法を「Canonical Huffman Code(CHC)」「Range Coder(RC)」「Byte Pair Encoding(BPE)」から選択できるようにしました。
 *	  前回までは「RC」固定でしたが、圧縮方法による違いを比較したいと思ったからです。
 *	- 圧縮方法の選択は、当モジュールのビルド時にCOMPRESSION_METHODの定義を書き換える事で行うので、アプリケーションが選択する事はできません。
 *	  圧縮方法を比較したところ「CHC」が速度と容量のバランスが良いと思ったので、現在は「CHC」(COMPRESSION_METHOD=1)を選択してあります。
 *	* Wed Nov 18 21:37:53 JST 2015 Naoyuki Sawa
 *	- 'extern "C" {'〜'}'で囲みました。.cppを含むWin32プロジェクトからもインクルード出来るようにするためです。
 *	* Thu Mar 10 21:38:25 JST 2016 Naoyuki Sawa
 *	- 「ユーティリティ関数(シフトJIS⇔Unicode(UCS-2))」を追加しました。
 *	- 「ユーティリティ関数(UTF-8⇔UCS-2)」を追加しました。
 *	* Fri Mar 11 21:58:48 JST 2016 Naoyuki Sawa
 *	- 「ユーティリティ関数(シフトJIS⇔Unicode(UCS-2))」「ユーティリティ関数(UTF-8⇔UCS-2)」を追加したことに伴い、
 *	  既存の「ユーティリティ関数(シフトJIS⇔UTF-8)」が、「ユーティリティ関数(シフトJIS⇔Unicode(UCS-2))」「ユーティリティ関数(UTF-8⇔UCS-2)」を利用するように変更しました。
 *	  結果はこれまでと同じです。
 *	* Mon May 02 21:51:14 JST 2016 Naoyuki Sawa
 *	- 「文字列変換(シフトJIS⇔UTF-8)」を追加しました。
 *	  これまでは「文字列変換(シフトJIS⇔Unicode(UCS-2))」と「文字列変換(UTF-8⇔UCS-2)」を組み合わせて変換する必要が有った処理が、直接変換出来るようになりました。
 *	- 「文字列変換(シフトJIS⇔UTF-8)」を追加した事に伴い、既存の「ユーティリティ関数(シフトJIS⇔UTF-8)」が、「文字列変換(シフトJIS⇔UTF-8)」を利用するように変更しました。
 *	  結果はこれまでと同じです。
 *	* Sun May 08 23:30:59 JST 2016 Naoyuki Sawa
 *	- これまでは個別に回避していたバックスラッシュの変換問題を、当モジュール内で吸収する事にしました。
 *	  当モジュール内で吸収した事により、/clip/tool/dpsprsht/app.cppと/clip/clipyaml.cの個別の処理が不要になりました。
 *	  詳細は、上記のファイルの同日のコメントを参照して下さい。
 *	* Fri May 13 21:43:38 JST 2016 Naoyuki Sawa
 *	- 既存のShiftJisToUnicodeStr(),UnicodeToShiftJisStr(),Utf8ToUcs2Str(),Ucs2ToUtf8Str(),ShiftJisToUtf8Str(),Utf8ToShiftJisStr()関数にsrcLen引数を追加しました。
 *	- 新規にstrndup_ShiftJisToUtf8(),strndup_Utf8ToShiftJis(),strndup_ShiftJisToUnicode(),strndup_UnicodeToShiftJis(),strndup_Utf8ToUcs2(),strndup_Ucs2ToUtf8()関数を追加しました。
 *	* Sat May 14 21:51:15 JST 2016 Naoyuki Sawa
 *	- Windows環境ではメモリに余裕が有るのでShiftJisToUnicodeChr(),UnicodeToShiftJisChr()の結果を保存して高速化する事にしました。
 *	  根本的にはTBL_ShiftJisToUnicode[]を圧縮しなければ良いのですが、それでは組み込み環境用のアルゴリズム検証にならないので、間を取ってこういう方法で高速化する事にしました。
 */
#ifndef __CLIP_UNIC_H__
#define __CLIP_UNIC_H__
#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus
/****************************************************************************
 *	文字コード変換(シフトJIS⇔Unicode(UCS-2))
 ****************************************************************************/
/* シフトJIS文字コードを、Unicode文字コードに変換します。
 * [in]
 *	c		シフトJIS文字コード
 * [out]
 *	戻り値		Unicode文字コード
 * [note]
 *	- 変換できなかった場合は、'?'(0x003F)を返します。
 */
int ShiftJisToUnicodeChr(int c);
/* Unicode文字コードを、シフトJIS文字コードに変換します。
 * [in]
 *	c		Unicode文字コード
 * [out]
 *	戻り値		シフトJIS文字コード
 * [note]
 *	- 変換できなかった場合は、'?'(0x3F)を返します。
 */
int UnicodeToShiftJisChr(int c);
/****************************************************************************
 *	文字列変換(シフトJIS⇔Unicode(UCS-2))
 ****************************************************************************/
/* シフトJIS文字列を、Unicode文字列に変換します。
 * [in]
 *	s		シフトJIS文字列
 *	srcLen		sのバイト数(終端のヌル文字含まず)	int型ですが符号無しで解釈します。sの実際のバイト数超過の値を指定すると、sの実際のバイト数まで処理します。要するに、普段は(-1)を指定すれば十分です。
 *	buf		Unicode文字列を格納するバッファ		(cap=0)を指定した場合は、bufは参照されないので、(buf=NULL)でも構いません。
 *	cap		bufの要素数				srcLenが符号無しで解釈されるのに対して、capは符号付きで解釈される事に注意して下さい。(cap<0)を指定すると、(cap=0)を指定したのと同じ結果になります。
 * [out]
 *	戻り値		変換後のUnicode文字列のワード数。終端文字は含みません。
 *			capと同じかそれ以上の値が返された場合、文字が破棄された事を示します。
 * [note]
 *	□使用例
 *	│len=ShiftJisToUnicodeStr(s,-1,NULL,0);	//変換後のワード数(終端文字含まず)を求める。
 *	│buf=malloc((len+1)*sizeof(wchar_t));		//バッファを確保する。終端文字の(+1)とsizeof(wchar_t)倍する事を忘れずに!!
 *	│ShiftJisToUnicodeStr(s,-1,buf,len+1);		//変換後の文字列(終端文字も含む)を格納する。
 */
int ShiftJisToUnicodeStr(const char* _s, int srcLen/*-1可*/, wchar_t buf[/*cap*/]/*NULL可*/, int cap/*0可*/);
/* Unicode文字列を、シフトJIS文字列に変換します。
 * [in]
 *	s		Unicode文字列
 *	srcLen		sのワード数(終端のヌル文字含まず)	int型ですが符号無しで解釈します。sの実際のワード数超過の値を指定すると、sの実際のワード数まで処理します。要するに、普段は(-1)を指定すれば十分です。
 *	buf		シフトJIS文字列を格納するバッファ	(cap=0)を指定した場合は、bufは参照されないので、(buf=NULL)でも構いません。
 *	cap		bufの要素数				srcLenが符号無しで解釈されるのに対して、capは符号付きで解釈される事に注意して下さい。(cap<0)を指定すると、(cap=0)を指定したのと同じ結果になります。
 * [out]
 *	戻り値		変換後のシフトJIS文字列のバイト数。終端文字は含みません。
 *			capと同じかそれ以上の値が返された場合、文字が破棄された事を示します。
 * [note]
 *	□使用例
 *	│len=UnicodeToShiftJisStr(s,-1,NULL,0);	//変換後のバイト数(終端文字含まず)を求める。
 *	│buf=malloc(len+1);				//バッファを確保する。終端文字の(+1)を忘れずに!!
 *	│UnicodeToShiftJisStr(s,-1,buf,len+1);		//変換後の文字列(終端文字も含む)を格納する。
 */
int UnicodeToShiftJisStr(const wchar_t* s, int srcLen/*-1可*/, char buf[/*cap*/]/*NULL可*/, int cap/*0可*/);
/****************************************************************************
 *	文字列変換(UTF-8⇔UCS-2)
 ****************************************************************************/
/* UTF-8文字列を、UCS-2文字列に変換します。
 * [in]
 *	s		UTF-8文字列
 *	srcLen		sのバイト数(終端のヌル文字含まず)	int型ですが符号無しで解釈します。sの実際のバイト数超過の値を指定すると、sの実際のバイト数まで処理します。要するに、普段は(-1)を指定すれば十分です。
 *	buf		UCS-2文字列を格納するバッファ		(cap=0)を指定した場合は、bufは参照されないので、(buf=NULL)でも構いません。
 *	cap		bufの要素数				srcLenが符号無しで解釈されるのに対して、capは符号付きで解釈される事に注意して下さい。(cap<0)を指定すると、(cap=0)を指定したのと同じ結果になります。
 * [out]
 *	戻り値		変換後のUCS-2文字列のワード数。終端文字は含みません。
 *			capと同じかそれ以上の値が返された場合、文字が破棄された事を示します。
 * [note]
 *	□使用例
 *	│len=Ucs2ToUtf8Str(s,-1,NULL,0);		//変換後のワード数(終端文字含まず)を求める。
 *	│buf=malloc((len+1)*sizeof(wchar_t));		//バッファを確保する。終端文字の(+1)とsizeof(wchar_t)倍する事を忘れずに!!
 *	│Ucs2ToUtf8Str(s,-1,buf,len+1);		//変換後の文字列(終端文字も含む)を格納する。
 */
int Utf8ToUcs2Str(const unsigned char* s, int srcLen/*-1可*/, wchar_t buf[/*cap*/]/*NULL可*/, int cap/*0可*/);
/* UCS-2文字列を、UTF-8文字列に変換します。
 * [in]
 *	s		UCS-2文字列
 *	srcLen		sのワード数(終端のヌル文字含まず)	int型ですが符号無しで解釈します。sの実際のワード数超過の値を指定すると、sの実際のワード数まで処理します。要するに、普段は(-1)を指定すれば十分です。
 *	buf		UTF-8文字列を格納するバッファ		(cap=0)を指定した場合は、bufは参照されないので、(buf=NULL)でも構いません。
 *	cap		bufの要素数				srcLenが符号無しで解釈されるのに対して、capは符号付きで解釈される事に注意して下さい。(cap<0)を指定すると、(cap=0)を指定したのと同じ結果になります。
 * [out]
 *	戻り値		変換後のUTF-8文字列のバイト数。終端文字は含みません。
 *			capと同じかそれ以上の値が返された場合、文字が破棄された事を示します。
 * [note]
 *	□使用例
 *	│len=Ucs2ToUtf8Str(s,-1,NULL,0);		//変換後のバイト数(終端文字含まず)を求める。
 *	│buf=malloc(len+1);				//バッファを確保する。終端文字の(+1)を忘れずに!!
 *	│Ucs2ToUtf8Str(s,-1,buf,len+1);		//変換後の文字列(終端文字も含む)を格納する。
 */
int Ucs2ToUtf8Str(const wchar_t* s, int srcLen/*-1可*/, unsigned char buf[/*cap*/]/*NULL可*/, int cap/*0可*/);
/****************************************************************************
 *	文字列変換(シフトJIS⇔UTF-8)
 ****************************************************************************/
/* シフトJIS文字列を、UTF-8文字列に変換します。
 * [in]
 *	s		シフトJIS文字列
 *	srcLen		sのバイト数(終端のヌル文字含まず)	int型ですが符号無しで解釈します。sの実際のバイト数超過の値を指定すると、sの実際のバイト数まで処理します。要するに、普段は(-1)を指定すれば十分です。
 *	buf		UTF-8文字列を格納するバッファ		(cap=0)を指定した場合は、bufは参照されないので、(buf=NULL)でも構いません。
 *	cap		bufの要素数				srcLenが符号無しで解釈されるのに対して、capは符号付きで解釈される事に注意して下さい。(cap<0)を指定すると、(cap=0)を指定したのと同じ結果になります。
 * [out]
 *	戻り値		変換後のUTF-8文字列のバイト数。終端文字は含みません。
 *			capと同じかそれ以上の値が返された場合、文字が破棄された事を示します。
 * [note]
 *	□使用例
 *	│len=ShiftJisToUtf8Str(s,-1,NULL,0);		//変換後のバイト数(終端文字含まず)を求める。
 *	│buf=malloc(len+1);				//バッファを確保する。終端文字の(+1)を忘れずに!!
 *	│ShiftJisToUtf8Str(s,-1,buf,len+1);		//変換後の文字列(終端文字も含む)を格納する。
 */
int ShiftJisToUtf8Str(const char* _s, int srcLen/*-1可*/, unsigned char buf[/*cap*/]/*NULL可*/, int cap/*0可*/);
/* UTF-8文字列を、シフトJIS文字列に変換します。
 * [in]
 *	s		UTF-8文字列
 *	srcLen		sのバイト数(終端のヌル文字含まず)	int型ですが符号無しで解釈します。sの実際のバイト数超過の値を指定すると、sの実際のバイト数まで処理します。要するに、普段は(-1)を指定すれば十分です。
 *	buf		シフトJIS文字列を格納するバッファ	(cap=0)を指定した場合は、bufは参照されないので、(buf=NULL)でも構いません。
 *	cap		bufの要素数				srcLenが符号無しで解釈されるのに対して、capは符号付きで解釈される事に注意して下さい。(cap<0)を指定すると、(cap=0)を指定したのと同じ結果になります。
 * [out]
 *	戻り値		変換後のシフトJIS文字列のバイト数。終端文字は含みません。
 *			capと同じかそれ以上の値が返された場合、文字が破棄された事を示します。
 * [note]
 *	□使用例
 *	│len=Utf8ToShiftJisStr(s,NULL,0);	//変換後のバイト数(終端文字含まず)を求める。
 *	│buf=malloc(len+1);			//バッファを確保する。終端文字の(+1)を忘れずに!!
 *	│Utf8ToShiftJisStr(s,buf,len+1);	//変換後の文字列(終端文字も含む)を格納する。
 */
int Utf8ToShiftJisStr(const unsigned char* s, int srcLen/*-1可*/, char buf[/*cap*/]/*NULL可*/, int cap/*0可*/);
/****************************************************************************
 *	ユーティリティ関数(シフトJIS⇔UTF-8)
 ****************************************************************************/
unsigned char* strdup_ShiftJisToUtf8(const char* s);
unsigned char* strndup_ShiftJisToUtf8(const char* s, int srcLen/*-1可*/);
char* strdup_Utf8ToShiftJis(const unsigned char* s);
char* strndup_Utf8ToShiftJis(const unsigned char* s, int srcLen/*-1可*/);
/****************************************************************************
 *	ユーティリティ関数(シフトJIS⇔Unicode(UCS-2))
 ****************************************************************************/
wchar_t* strdup_ShiftJisToUnicode(const char* s);
wchar_t* strndup_ShiftJisToUnicode(const char* s, int srcLen/*-1可*/);
char* strdup_UnicodeToShiftJis(const wchar_t* s);
char* strndup_UnicodeToShiftJis(const wchar_t* s, int srcLen/*-1可*/);
/****************************************************************************
 *	ユーティリティ関数(UTF-8⇔UCS-2)
 ****************************************************************************/
wchar_t* strdup_Utf8ToUcs2(const unsigned char* s);
wchar_t* strndup_Utf8ToUcs2(const unsigned char* s, int srcLen/*-1可*/);
unsigned char* strdup_Ucs2ToUtf8(const wchar_t* s);
unsigned char* strndup_Ucs2ToUtf8(const wchar_t* s, int srcLen/*-1可*/);
#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus
#endif//__CLIP_UNIC_H__
