/*	
 *	clipstdw.h
 *
 *	Win32プロジェクト用の追加標準関数宣言
 *
 *	CLiP - Common Library for P/ECE
 *	Copyright (C) 2015 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を変更した時は、当ファイルだけを修正すれば良くなりました。
 */
#ifndef __CLIP_STDW_H__
#define __CLIP_STDW_H__
#ifndef _MSC_VER
#error  このファイルは、Win32プロジェクト専用です。
#endif//_MSC_VER
/****************************************************************************
 *	include/ctype.h
 ****************************************************************************/
//⇒cliplibc.c
int ismbblead(int c);	//Visual C++の _ismbblead()マクロではなく、自分で実装した ismbblead()関数を使用する事にしました。
int ismbbtrail(int c);	//Visual C++の_ismbbtrail()マクロではなく、自分で実装したismbbtrail()関数を使用する事にしました。
int isblank(int c);
/****************************************************************************
 *	include/math.h
 ****************************************************************************/
//⇒cliplibc.c
double log2(double x);
/****************************************************************************
 *	include/stdio.h
 ****************************************************************************/
//⇒clipprnt.c
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*/int getline(char** lineptr, size_t* n, FILE* stream);
/*ssize_t*/int getdelim(char** lineptr, size_t* n, int delim, FILE* stream);
/*--------------------------------------------------------------------------*/
#define STDIN_FILENO  0 /* 標準入力のファイル記述子 */
#define STDOUT_FILENO 1 /* 標準出力のファイル記述子 */
#define STDERR_FILENO 2 /* 標準エラー出力のファイル記述子 */
/*--------------------------------------------------------------------------*/
//#define truncate(path,length)	???	//Visual C++には、truncate()に相当する関数が無いようです。
#define ftruncate(fd,length)	(_chsize((fd),(length)))
/****************************************************************************
 *	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
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
/****************************************************************************
 *	include/string.h
 ****************************************************************************/
//⇒cliplibc.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);
/*--------------------------------------------------------------------------*/
//⇒clipdire.c
int strverscmp(const char* s1, const char* s2);
#endif//__CLIP_STDW_H__
