/*	
 *	clipstdw.h
 *
 *	Win32プロジェクト用の追加標準関数宣言
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2015-2016 Naoyuki Sawa
 *
 *	* Sun Jul 26 14:14:57 JST 2015 Naoyuki Sawa
 *	- 1st リリース。
 *	  これまで、各Win32プロジェクトのextclip.hで個別に記述していた宣言を、当ファイルの中にまとめる事にしました。
 *	  当ファイルは、Win32プロジェクトで、clipstd.hからインクルードします。
 *	- /clip/include/*.hの中で、Visual C++付属のファイルと衝突していないファイルは、clipstd.hからインクルードしています。(include/stdint.h等)
 *	  しかし、Visual C++付属のファイルと衝突するファイルは、clipstd.hからインクルードする事が出来ません。(include/stdio.h等)
 *	  そのため、それらのファイルの中で追加宣言した関数(getline()等)を、Win32プロジェクトから参照できない問題が生じます。
 *	- これまでは、各Win32プロジェクトのextclip.hで、関数宣言を個別に記述していました。
 *	  しかし、Win32プロジェクトが増えるにつれて、/clip/include/*.hを変更した時に多数のextclip.hを修正する必要が有り、管理しづらくなりました。
 *	  そこで、Win32ではclipstd.hからインクルードしない/clip/include/*.hの中で追加宣言した関数を、当ファイルで宣言する事にしました。
 *	  今後は、/clip/include/*.hを変更した時は、当ファイルだけを修正すれば良くなりました。
 *	* Wed Sep 16 21:59:48 JST 2015 Naoyuki Sawa
 *	- va_copy()の宣言を追加しました。
 *	  本日clipprnt.cのvasprintf()がva_copy()を使うように修正した事に伴い、clipprnt.cを使用するWin32プロジェクトでva_copy()が必要になったからです。
 *	* Fri Sep 25 21:34:34 JST 2015 Naoyuki Sawa
 *	- snprintf(),vsnprintf()の宣言を追加しました。
 *	* Tue Oct 20 21:18:14 JST 2015 Naoyuki Sawa
 *	- a64l(),l64a(),l64a_r()の宣言を追加しました。
 *	* Sat Oct 24 14:03:11 JST 2015 Naoyuki Sawa
 *	- program_invocation_name,program_invocation_short_nameの変数宣言を追加しました。
 *	* Sun Oct 25 21:43:29 JST 2015 Naoyuki Sawa
 *	- splitpath(),makepath()の宣言を追加しました。
 *	  Visual C++の_splitpath()ではなく、clipprnt.cのsplitpath()を使用する事にしました。
 *	  Visual C++の_makepath() ではなく、clipprnt.cのmakepath() を使用する事にしました。
 *	* Wed Nov 18 21:37:53 JST 2015 Naoyuki Sawa
 *	- 'extern "C" {'〜'}'で囲みました。.cppを含むWin32プロジェクトからもインクルード出来るようにするためです。
 *	* Sat Nov 21 21:27:06 JST 2015 Naoyuki Sawa
 *	- strchrnul()の宣言を追加しました。
 *	- getsubopt()の宣言を追加しました。
 *	* Mon Nov 23 21:30:44 JST 2015 Naoyuki Sawa
 *	- strtok_r()の宣言を追加しました。
 *	* Tue Nov 24 21:15:16 JST 2015 Naoyuki Sawa
 *	- M_E,M_PI等の定義をclipfix.h⇒math.hへ移動した事に伴い、clipstdw.hにM_E,M_PI等の定義を追加しました。
 *	  VC++6.0の<math.h>には、M_E,M_PI等の定義が無いからです。
 *	* Sat Jan 30 21:30:05 JST 2016 Naoyuki Sawa
 *	- qsort_r()の宣言を追加しました。
 *	* Sat Feb 13 21:29:21 JST 2016 Naoyuki Sawa
 *	- rawmemchr()の宣言を追加しました。
 *	* Sat Feb 13 21:29:21 JST 2016 Naoyuki Sawa
 *	- ssize_tの定義を追加しました。
 *	  詳細は、/clip/include/sys/types.hの同日のコメントを参照して下さい。
 *	* Thu Mar 24 21:04:15 JST 2016 Naoyuki Sawa
 *	- signbit(),copysign(),copysignf()を追加しました。
 *	  これらはC99で追加された符号操作用のマクロ,及び,関数で、あまり使う事は無いと思いますが、覚えておくために実装しておく事にしました。
 *	- round(),roundf(),nearbyint(),nearbyintf(),rint(),rintf(),lround(),lroundf(),lrint(),lrintf()を追加しました。
 *	  これらはC99で追加された丸め関数で、特に、lround()が便利だと思います。
 *	  いままでは'(int)((x>=0.0)?(x+0.5):(x-0.5))'のように書いていた処理が、'lround(x)'だけで済むようになりました。
 *	- 宣言は全て、include/math.hに有ります。
 *	  倍精度バージョンの関数、copysign(),lround(),lrint(),round(),nearbyint(),rint(),trunc()の実装は、cliplibc.cに有ります。
 *	  単精度バージョンの関数、copysignf(),lroundf(),lrintf(),roundf(),nearbyintf(),rintf(),truncf()の実装は、framflt2.cに有ります。
 *	  実装を分けた理由は、単精度演算ライブラリが(アプリケーションが使用していないのに)無駄にリンクされて、サイズが増える事を防ぐためです。
 *	* Mon Mar 28 21:40:28 JST 2016 Naoyuki Sawa
 *	- fdim(),fdimf(),fmin(),fminf(),fmax(),fmaxf(),fma(),fmaf()を追加しました。
 *	  これらはC99で追加された関数です。
 *	  fdim()は、何に使うのか良く判らないのですが、覚えておくために実装しておく事にしました。
 *	  fmin(),fmax()は、min(),max()マクロよりも型を明示出来るし副作用が無いので、便利に使用出来ると思います。
 *	  fma()は、積和演算を短く・判り易く書けるので、(使う場面は少ないと思いますが)使い道は有ると思います。
 *	- 宣言は全て、include/math.hに有ります。
 *	  倍精度バージョンの関数、fdim(),fmin(),fmax(),fma()の実装は、cliplibc.cに有ります。
 *	  単精度バージョンの関数、fdimf(),fminf(),fmaxf(),fmaf()の実装は、framflt2.cに有ります。
 *	  実装を分けた理由は、単精度演算ライブラリが(アプリケーションが使用していないのに)無駄にリンクされて、サイズが増える事を防ぐためです。
 *	* Fri Apr 29 21:34:57 JST 2016 Naoyuki Sawa
 *	- strdupa(),strndupa()のマクロ定義,及び,ヘルパ関数__strndupa_helper()の宣言を追加しました。
 *	  詳細は、include/string.h の同日のコメントを参照して下さい。
 *	* Sun May 01 23:11:51 JST 2016 Naoyuki Sawa
 *	- mbsspn(),mbscspn()の宣言を追加しました。
 *	* Tue May 03 21:44:23 JST 2016 Naoyuki Sawa
 *	- 文字分類ルーチンをctype.cで実装したことに伴い、'C:/Program Files (x86)/Microsoft Visual Studio/VC98/Include/CTYPE.H'のマクロ定義を取り消し、
 *	  ctype.cで実装されている関数を全て当ファイルで宣言しました。
 *	* Wed May 04 21:28:21 JST 2016 Naoyuki Sawa
 *	- bsearch_r()の宣言を追加しました。
 *	* Wed May 11 21:35:57 JST 2016 Naoyuki Sawa
 *	- mbsnextc(),mbsinc(),mbsninc()の宣言を追加しました。
 *	* Tue May 17 23:11:10 JST 2016 Naoyuki Sawa
 *	- S_ISREG(),S_ISDIR(),S_ISCHR(),S_ISFIFO()のマクロ定義を追加しました。
 *	  これらはPOSIX準拠のマクロですが、VC++6.0の<sys/stat.h>では定義されておらず、これまでは明示的にS_IFREG等と比較する必要が有りました。
 *	  今回これらのマクロ定義を追加したので、今後はWin32プログラムでもS_ISREG()等を使って判定する事が出来るようになりました。
 *	* Thu May 19 22:52:12 JST 2016 Naoyuki Sawa
 *	- mbsdec()の宣言を追加しました。
 *	* Fri May 20 23:37:14 JST 2016 Naoyuki Sawa
 *	- mbschr(),mbsstr(),mbspbrk()の宣言を追加しました。
 *	* Sat May 28 21:20:19 JST 2016 Naoyuki Sawa
 *	- signbit(),va_copy()が既に定義されていたら、定義しないようにしました。
 *	  今後、Visual C++ .NETへ移行するための準備です。
 *	- snprintf(),vsnprintf()の引数cntの型をint⇒size_tに修正しました。
 *	  詳細は、clipprnt.cの同日のコメントを参照して下さい。
 *	- heapsort(),heapsort_r(),mergesort(),mergesort_r()の宣言を追加しました。
 *	* Tue Jun 14 20:57:03 JST 2016 Naoyuki Sawa
 *	- strnextc(),strinc(),strninc(),strdec()の宣言を追加しました。
 *	* Tue Jun 14 21:51:27 JST 2016 Naoyuki Sawa
 *	- mbsupr(),mbslwr()の宣言を追加しました。
 *	* Sun Jun 26 15:24:18 JST 2016 Naoyuki Sawa
 *	- mbstok(),mbstok_r()の宣言を追加しました。
 *	* Thu Sep 08 22:20:43 JST 2016 Naoyuki Sawa
 *	- Windows環境ならばprogram_invocation_name,program_invocation_short_nameをcliplibc.hで宣言するようにしたので、clipstdw.hでの宣言は不要になりました。
 *	* Thu Sep 29 21:37:05 JST 2016 Naoyuki Sawa
 *	- STDIN_FILENO,STDOUT_FILENO,STDERR_FILENOの定義を削除しました。
 *	  include/unistd.hで定義しているので、当ファイル(clipstdw.h)での定義は不要でした。
 *	- truncate()のマクロ定義(未実装),及び,ftruncate()のマクロ定義を削除しました。
 *	  これまではWin32版は仮にclipstdw.h内でマクロ定義していましたが、今後はWin32版もcliplibc.c内で関数として実装する事にしました。
 *	* Sun Oct 23 10:04:30 JST 2016 Naoyuki Sawa
 *	- static_assertのマクロ定義を追加しました。
 */
#ifndef __CLIP_STDW_H__
#define __CLIP_STDW_H__
#ifdef  __cplusplus
extern "C" {
#endif//__cplusplus
#ifndef _MSC_VER
#error  このファイルは、Win32プロジェクト専用です。
#endif//_MSC_VER
/****************************************************************************
 *	include/sys/stat.h
 ****************************************************************************/
#define S_ISREG(m)  (((m)&S_IFMT)==S_IFREG)	/* is it a regular file? */
#define S_ISDIR(m)  (((m)&S_IFMT)==S_IFDIR)	/* is it a directory? */
#define S_ISCHR(m)  (((m)&S_IFMT)==S_IFCHR)	/* is it a character device? */
#define S_ISFIFO(m) (((m)&S_IFMT)==S_IFIFO)	/* is it a FIFO? */
/****************************************************************************
 *	include/sys/types.h
 ****************************************************************************/
#ifndef _SSIZE_T
#define _SSIZE_T
typedef int ssize_t;	/* size of something in bytes or -1 */
#endif//_SSIZE_T
/****************************************************************************
 *	include/assert.h
 ****************************************************************************/
#if     (_MSC_VER < 1900)	//{{VC++2015ではCソースでもC++ソースでも組み込みstatic_assertが使えるので、ここで定義する必要は有りません。VC++2015の組み込みstatic_assertはマクロではないので、'#ifndef static_assert'では判定出来ない事に注意して下さい。
#ifndef static_assert
#define _Static_assert(expression,message) typedef char __Static_assert__[(expression)?1:-1]	//厳密には'_Static_assert'はC11のキーワードであってマクロではないのですが、当ライブラリではマクロとして実装する事にしました。マクロでの実装方法については、「Windows Dev Center - C_ASSERT macro」(https://msdn.microsoft.com/en-us/library/windows/desktop/ms679289(v=vs.85).aspx)を参考にしました。同じtypedef名(この場合は__Static_assert__)を複数回使用しても、同じ定義内容ならばエラーにならない事を利用しています。
#define static_assert _Static_assert
#endif//static_assert
#endif//(_MSC_VER < 1900)	//}}VC++2015ではCソースでもC++ソースでも組み込みstatic_assertが使えるので、ここで定義する必要は有りません。VC++2015の組み込みstatic_assertはマクロではないので、'#ifndef static_assert'では判定出来ない事に注意して下さい。
/****************************************************************************
 *	include/ctype.h
 ****************************************************************************/
//'C:/Program Files (x86)/Microsoft Visual Studio/VC98/Include/CTYPE.H'のマクロ定義を取り消す。
#undef isdigit
#undef isxdigit
#undef isupper
#undef islower
#undef isalpha
#undef isalnum
#undef iscsymf
#undef iscsym
#undef iscntrl
#undef isblank
#undef isspace
#undef isgraph
#undef isprint
#undef ispunct
#undef ismbblead
#undef ismbbtrail
#undef toupper
#undef tolower
//⇒ctype.c
int isdigit(int c);
int isxdigit(int c);
int isupper(int c);
int islower(int c);
int isalpha(int c);
int isalnum(int c);
int iscsymf(int c);
int iscsym(int c);
int iscntrl(int c);
int isblank(int c);
int isspace(int c);
int isgraph(int c);
int isprint(int c);
int ispunct(int c);
int ismbblead(int c);
int ismbbtrail(int c);
int toupper(int c);
int tolower(int c);
/****************************************************************************
 *	include/errno.h
 ****************************************************************************/
//{{2016/09/08削除:Windows環境ならばprogram_invocation_name,program_invocation_short_nameをcliplibc.hで宣言するようにしたので、clipstdw.hでの宣言は不要になりました。
////⇒cliplibc.c
//extern char* program_invocation_name;
//extern char* program_invocation_short_name;
//}}2016/09/08削除:Windows環境ならばprogram_invocation_name,program_invocation_short_nameをcliplibc.hで宣言するようにしたので、clipstdw.hでの宣言は不要になりました。
/****************************************************************************
 *	include/math.h
 ****************************************************************************/
#define M_E		2.71828182845904523536		//ｅ				POSIX
#define M_LOG2E		1.44269504088896340736		//log２(ｅ)			POSIX
#define M_LOG10E	0.434294481903251827651		//log10(ｅ)			POSIX
#define M_LN2		0.693147180559945309417		//logｅ(２)			POSIX
#define M_LN10		2.30258509299404568402		//logｅ(10)			POSIX
#define M_PI		3.14159265358979323846		//π				POSIX
#define M_PI_2		1.57079632679489661923		//π／２ 			POSIX
#define M_PI_4		0.785398163397448309616		//π／４			POSIX
#define M_1_PI		0.318309886183790671538		//１／π			POSIX
#define M_2_PI		0.636619772367581343076		//２／π			POSIX
#define M_1_SQRTPI	0.564189583547756286948		//１／√(π)			Borland C++ Compiler 5.5 <math.h> 特有? POSIXやXcodeでは定義されていないようです。
#define M_2_SQRTPI	1.12837916709551257390		//２／√(π)			POSIX
#define M_SQRT2		1.41421356237309504880		//    √(２)			POSIX
#define M_SQRT1_2	0.707106781186547524401		//１／√(２) = √(１／２)	POSIX
#define M_SQRT_2	M_SQRT1_2			//(同上)			Borland C++ Compiler 5.5 <math.h> ではこの名前になっています。
#define M_SQRT_1_2	M_SQRT1_2			//(同上)			Xcode Tools version 5.0 <math.h> ではこの名前になっているようです。	□参照資料:「OS X Man Pages - M_PI」https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man3/M_SQRT_1_2.3.html
/*--------------------------------------------------------------------------*/
//⇒cliplibc.c
double log2(double x);
/*--------------------------------------------------------------------------*/
#ifndef signbit	//Visual C++ .NETならば、定義済みです。
#define signbit(x) ((x)<0)
#endif//signbit	//Visual C++ .NETならば、定義済みです。
double copysign(double x, double y);				//⇒cliplibc.c
float copysignf(float x, float y);				//⇒framflt2.c
//long double copysignl(long double x, long double y);		//未対応
double round(double x);						//⇒cliplibc.c
float roundf(float x);						//⇒framflt2.c
//long double roundl(long double x);				//未対応
double nearbyint(double x);					//⇒cliplibc.c
float nearbyintf(float x);					//⇒framflt2.c
//long double nearbyintl(long double x);			//未対応
double rint(double x);						//⇒cliplibc.c
float rintf(float x);						//⇒framflt2.c
//long double rintl(long double x);				//未対応
long lround(double x);						//⇒cliplibc.c
long lroundf(float x);						//⇒framflt2.c
//long lroundl(long double x);					//未対応
//long long llround(double x);					//未対応
//long long llroundf(float x);					//未対応
//long long llroundl(long double x);				//未対応
long lrint(double x);						//⇒cliplibc.c
long lrintf(float x);						//⇒framflt2.c
//long lrintl(long double x);					//未対応
//long long llrint(double x);					//未対応
//long long llrintf(float x);					//未対応
//long long llrintl(long double x);				//未対応
double trunc(double x);						//⇒cliplibc.c
float truncf(float x);						//⇒framflt2.c
//long double truncl(long double x);				//未対応
/*--------------------------------------------------------------------------*/
double fdim(double x, double y);					//⇒cliplibc.c
float fdimf(float x, float y);						//⇒framflt2.c
//long double fdiml(long double x, long double y);			//未対応
double fmin(double x, double y);					//⇒cliplibc.c
float fminf(float x, float y);						//⇒framflt2.c
//long double fminl(long double x, long double y);			//未対応
double fmax(double x, double y);					//⇒cliplibc.c
float fmaxf(float x, float y);						//⇒framflt2.c
//long double fmaxl(long double x, long double y);			//未対応
double fma(double x, double y, double z);				//⇒cliplibc.c
float fmaf(float x, float y, float z);					//⇒framflt2.c
//long double fmal(long double x, long double y, long double z);	//未対応
/****************************************************************************
 *	include/stdarg.h
 ****************************************************************************/
#ifndef va_copy	//Visual C++ .NETならば、定義済みです。
#define va_copy(tdArgP1,tdArgP2) do{(tdArgP1)=(tdArgP2);}while(0)
#endif//va_copy	//Visual C++ .NETならば、定義済みです。
/****************************************************************************
 *	include/stdio.h
 ****************************************************************************/
//⇒clipprnt.c
int snprintf(char* out, size_t cnt, const char* fmt, ...);		//Visual C++の_snprintf() ではなく、clipprnt.cのsnprintf() を使用する事にしました。
int vsnprintf(char* out, size_t cnt, const char* fmt, va_list ap);	//Visual C++の_vsnprintf()ではなく、clipprnt.cのvsnprintf()を使用する事にしました。
int scprintf(const char* fmt, ...);
int vscprintf(const char* fmt, va_list ap);
int asprintf(char** strp, const char* fmt, ...);
int vasprintf(char** strp, const char* fmt, va_list ap);
/*--------------------------------------------------------------------------*/
//⇒clipscan.c
int vscanf(const char* fmt, va_list ap);
int vsscanf(const char* str, const char* fmt, va_list ap);
int vfscanf(FILE* stream, const char* fmt, va_list ap);
/*--------------------------------------------------------------------------*/
//⇒getline.c
ssize_t getline(char** lineptr, size_t* n, FILE* stream);
ssize_t getdelim(char** lineptr, size_t* n, int delim, FILE* stream);
/*--------------------------------------------------------------------------*/
//{{2016/09/29削除:STDIN_FILENO,STDOUT_FILENO,STDERR_FILENOの定義を削除しました。
//#define STDIN_FILENO  0 /* 標準入力のファイル記述子 */
//#define STDOUT_FILENO 1 /* 標準出力のファイル記述子 */
//#define STDERR_FILENO 2 /* 標準エラー出力のファイル記述子 */
//}}2016/09/29削除:STDIN_FILENO,STDOUT_FILENO,STDERR_FILENOの定義を削除しました。
/*--------------------------------------------------------------------------*/
//{{2016/09/29削除:truncate()のマクロ定義(未実装),及び,ftruncate()のマクロ定義を削除しました。
////#define truncate(path,length)	???	//Visual C++には、truncate()に相当する関数が無いようです。
//#define ftruncate(fd,length)	(_chsize((fd),(length)))
//}}2016/09/29削除:truncate()のマクロ定義(未実装),及び,ftruncate()のマクロ定義を削除しました。
/****************************************************************************
 *	include/stdlib.h
 ****************************************************************************/
//#define MAX_PATH  _MAX_PATH	//_MAX_PATH ⇒STDLIB.H,MAX_PATH⇒WINDEF.H
#define MAX_DRIVE _MAX_DRIVE	//_MAX_DRIVE⇒STDLIB.H
#define MAX_DIR   _MAX_DIR	//_MAX_DIR  ⇒STDLIB.H
#define MAX_FNAME _MAX_FNAME	//_MAX_FNAME⇒STDLIB.H
#define MAX_EXT   _MAX_EXT	//_MAX_EXT  ⇒STDLIB.H
//⇒cliplibc.c
void splitpath(const char* path, char drive[/*MAX_DRIVE*/], char dir[/*MAX_DIR*/], char fname[/*MAX_FNAME*/], char ext[/*MAX_EXT*/]);	//Visual C++の_splitpath()ではなく、clipprnt.cのsplitpath()を使用する事にしました。
void makepath(char path[/*MAX_PATH*/], const char* drive, const char* dir, const char* fname, const char* ext);				//Visual C++の_makepath() ではなく、clipprnt.cのmakepath() を使用する事にしました。
/*--------------------------------------------------------------------------*/
//⇒cliplibc.c
size_t malloc_usable_size(void* ptr);
/*--------------------------------------------------------------------------*/
//⇒rand48.c
struct drand48_data {
	unsigned short	x[3];		//+ 0,6 Current state.					//┐
	unsigned short	a[3];		//+ 6,6 Factor in congruential formula.			//├lcong48()の引数param[7]の並びに一致
	unsigned short	c[1];		//+12,2 Additive constant in congruential formula.	//┘
	unsigned short	old_x[3];	//+14,6 Old state.
};					//=20
//Return non-negative, double-precision floating-point value in [0.0,1.0).
double drand48();
int    drand48_r(                         struct drand48_data* buffer, double* result);		//GNU extension
double erand48(  unsigned short xsubi[3]);
int    erand48_r(unsigned short xsubi[3], struct drand48_data* buffer, double* result);		//GNU extension
//Return non-negative, long integer in [0,2^31).
long lrand48();
int  lrand48_r(                         struct drand48_data* buffer, long* result);		//GNU extension
long nrand48(  unsigned short xsubi[3]);
int  nrand48_r(unsigned short xsubi[3], struct drand48_data* buffer, long* result);		//GNU extension
//Return signed, long integers in [-2^31,2^31).
long mrand48();
int  mrand48_r(                         struct drand48_data* buffer, long* result);		//GNU extension
long jrand48(  unsigned short xsubi[3]);
int  jrand48_r(unsigned short xsubi[3], struct drand48_data* buffer, long* result);		//GNU extension
//Seed random number generator.
void srand48(  long seedval);
int  srand48_r(long seedval,                        struct drand48_data* buffer);		//GNU extension
unsigned short* seed48(  unsigned short seed16v[3]);
int             seed48_r(unsigned short seed16v[3], struct drand48_data* buffer);		//GNU extension
void lcong48(  unsigned short param[7]);
int  lcong48_r(unsigned short param[7],             struct drand48_data* buffer);		//GNU extension
/*--------------------------------------------------------------------------*/
//⇒cliplibc.c
long a64l(const char* s);
char* l64a(long n);
int l64a_r(long n, char* buffer, int buflen);
void* bsearch_r(const void* key, const void* _base, size_t nmemb, size_t size, int (*compar)(const void*, const void*, void*), void* arg);	//独自拡張
/*--------------------------------------------------------------------------*/
//⇒getsubopt.c
int getsubopt(char** optionp, char* const* tokens, char** valuep);	//第2引数は'const char* const* tokens'とするのが自然だと思うのだが、仕様で'char* const* tokens'となっているので仕方が無い。
/*--------------------------------------------------------------------------*/
//⇒clipsort.c
void qsort_r(void* base, size_t num, size_t width, int (*compare)(const void*, const void*, void*), void* arg);
int heapsort(void* base, size_t num, size_t width, int (*compare)(const void*, const void*));	//FreeBSD 10.0 June 4, 1993 FreeBSD 10.0
int heapsort_r(void* base, size_t num, size_t width, int (*compare)(const void*, const void*, void*), void* arg);	//独自拡張
int mergesort(void* base, size_t num, size_t width, int (*compare)(const void*, const void*));	//FreeBSD 10.0 June 4, 1993 FreeBSD 10.0
int mergesort_r(void* base, size_t num, size_t width, int (*compare)(const void*, const void*, void*), void* arg);	//独自拡張
/****************************************************************************
 *	include/string.h
 ****************************************************************************/
//⇒cliplibc.c
char* strtok_r(char* s1, const char* s2, char** saveptr);
char* mbstok(char* s1, const char* s2);			//Visual C++の  _mbstok()関数ではなく、自分で実装した  mbstok()関数を使用する事にしました。
char* mbstok_r(char* s1, const char* s2, char** saveptr);
char* strchrnul(const char* s, int c);
void* rawmemchr(const void* s, int c);
char* strsep(char** stringp, const char* delim);
char* strcasestr(const char* s1, const char* s2);
size_t strlcpy(char* dst, const char* src, size_t size);
size_t strlcat(char* dst, const char* src, size_t size);
int strcasecmp(const char* s1, const char* s2);
int strncasecmp(const char* s1, const char* s2, size_t n);
size_t strnlen(const char* string, size_t n);
char* strndup(const char* string, size_t n);
void* memccpy(void* dest, const void* src, int c, size_t n);
void* mempcpy(void* dest, const void* src, size_t n);
char* stpncpy(char* dest, const char* src, size_t n);
char* stpcpy(char* dest, const char* src);
int ffs(int i);
#define strdupa(s)	strndupa(s, -1)
#ifdef  __GNUC__
#define strndupa(s, n)	({					\
	const char* __s__ = (s);				\
	size_t      __n__ = (n);				\
	__strndupa_helper(__s__, __n__,				\
	   alloca(strnlen(__s__, __n__) + 1/*'\0'*/)); })
#else //__GNUC__
#define strndupa(s, n)						\
	__strndupa_helper( (s) ,  (n) ,				\
	   alloca(strnlen( (s) ,  (n) ) + 1/*'\0'*/))
#endif//__GNUC__
char* __strndupa_helper(const char* s, size_t n, void* p);	//__strndupa_helper()はヘルパ関数です。アプリケーションが直接呼び出さないで下さい。
size_t  mbsspn(const char* s1, const char* s2);		//Visual C++の  _mbsspn()関数ではなく、自分で実装した  mbsspn()関数を使用する事にしました。
size_t mbscspn(const char* s1, const char* s2);		//Visual C++の _mbscspn()関数ではなく、自分で実装した mbscspn()関数を使用する事にしました。
int mbsnextc(const char* s);				//Visual C++の_mbsnextc()関数ではなく、自分で実装したmbsnextc()関数を使用する事にしました。
char* mbsinc(const char* s);				//Visual C++の  _mbsinc()関数ではなく、自分で実装した  mbsinc()関数を使用する事にしました。
char* mbsninc(const char* s, size_t count);		//Visual C++の _mbsninc()関数ではなく、自分で実装した mbsninc()関数を使用する事にしました。
char* mbsdec(const char* start, const char* current);	//Visual C++の  _mbsdec()関数ではなく、自分で実装した  mbsdec()関数を使用する事にしました。
char* mbschr(const char* s, int c);			//Visual C++の  _mbschr()関数ではなく、自分で実装した  mbschr()関数を使用する事にしました。
char* mbsstr(const char* s1, const char* s2);		//Visual C++の  _mbsstr()関数ではなく、自分で実装した  mbsstr()関数を使用する事にしました。
char* mbspbrk(const char* s, const char* accept);	//Visual C++の _mbspbrk()関数ではなく、自分で実装した mbspbrk()関数を使用する事にしました。
int strnextc(const char* s);				//Visual C++の_strnextc()関数ではなく、自分で実装したstrnextc()関数を使用する事にしました。
char* strinc(const char* s);				//Visual C++の  _strinc()関数ではなく、自分で実装した  strinc()関数を使用する事にしました。
char* strninc(const char* s, size_t count);		//Visual C++の _strninc()関数ではなく、自分で実装した strninc()関数を使用する事にしました。
char* strdec(const char* start, const char* current);	//Visual C++の  _strdec()関数ではなく、自分で実装した  strdec()関数を使用する事にしました。
char* mbsupr(char* string);				//Visual C++の  _mbsupr()関数ではなく、自分で実装した  mbsupr()関数を使用する事にしました。
char* mbslwr(char* string);				//Visual C++の  _mbslwr()関数ではなく、自分で実装した  mbslwr()関数を使用する事にしました。
/*--------------------------------------------------------------------------*/
//⇒clipdire.c
int strverscmp(const char* s1, const char* s2);
#ifdef  __cplusplus
}//extern "C"
#endif//__cplusplus
#endif//__CLIP_STDW_H__
