/*
 *	unistd.h
 *
 *	UNIx STanDard Header file
 *
 *	* Tue Nov 24 21:41:25 JST 2015 Naoyuki Sawa
 *	- 1st リリース。
 *	- useconds_tの定義,及び,sleep(),usleep()の宣言を追加しました。実装はcliplibc.cに有ります。
 *	- STDIN_FILENO,STDOUT_FILENO,STDERR_FILENOの定義,及び,isatty(),truncate(),ftruncate()の宣言を、stdio.h⇒unistd.hへ移動しました。
 *	* Thu Sep 29 21:37:05 JST 2016 Naoyuki Sawa
 *	- Win32では、isatty()を宣言しないようにしました。
 *	  これまでVC++6.0では問題無かったのですが、本日、VS2015の64ビット環境でも'#include <include/unistd.h>'を有効にした所、VS2015の64ビット環境では以下の警告が出たからです。
 *	  │warning C4273: 'isatty': dll リンクが一貫していません。
 *	  │c:\program files (x86)\windows kits\10\include\10.0.10240.0\ucrt\corecrt_io.h(489): note: 'isatty' の以前の定義を確認してください
 *	  もしかするとVS2015や64ビット環境の問題ではなく、VC++6.0のプロジェクトは/MT,VS2015のプロジェクトは/MDで作成しているのが原因かも知れないのですが、とりあえずWin32ではisatty()を宣言しない事にしました。
 *	  VC++6.0ではこれまで通りisatty()を宣言しても問題無いのですが、VC++6.0でもisatty()は<io.h>で宣言されているので、ここで宣言する必要は無いので、Win32では常にisatty()を宣言しない事にしました。
 *	- 尚、本日、VS2015の64ビット環境でも'#include <include/unistd.h>'を有効にした理由は、VS2015の64ビット環境でもcliplibc.cを共通で使用するために、useconds_tの型定義が必要になったからです。
 *	  useconds_t型は、Win32のヘッダでは宣言されていないようで、<include/unistd.h>をインクルードする必要が生じました。
 */
#ifndef __UNISTD_H__
#define __UNISTD_H__

#ifdef __cplusplus
extern "C" {
#endif//__cplusplus

/****************************************************************************
 *	
 ****************************************************************************/

#define STDIN_FILENO	0	//標準入力のファイル記述子
#define STDOUT_FILENO	1	//標準出力のファイル記述子
#define STDERR_FILENO	2	//標準エラー出力のファイル記述子

typedef unsigned useconds_t;

/****************************************************************************
 *	
 ****************************************************************************/

//□「Linux Programmer's Manual - SLEEP」(http://linuxjm.osdn.jp/html/LDP_man-pages/man3/sleep.3.html)より引用:
//│sleep - 指定の秒数の間だけ休止する
//│[説明]
//│sleep()は、呼び出したスレッドをseconds秒間または無視されないシグナルが到着するまで休止する。
//│[返り値]
//│要求された時間が過ぎた場合はゼロを返す。
//│呼び出しがシグナルハンドラーに割り込まれた場合は、休止の残り時間を返す。
unsigned sleep(unsigned seconds);	//⇒cliplibc.c(P/ECE,Win32両対応)

//□「Linux Programmer's Manual - USLEEP」(http://linuxjm.osdn.jp/html/LDP_man-pages/man3/usleep.3.html)より引用:
//│usleep - マイクロ秒単位で実行を延期する
//│[説明]
//│usleep()関数は(少なくとも)usecマイクロ秒の間、呼び出し元スレッドの実行を延期する。
//│システムの動作状況や呼び出しによる時間の消費やシステムタイマーの粒度によって、停止時間は設定した値よりも少し延ばされるかもしれない。
//│[返り値]
//│usleep()関数は成功すると0を返す。
//│エラーの場合、-1が返され、errnoにエラーの原因を示す値が設定される。
int usleep(useconds_t usec);	//⇒cliplibc.c(P/ECE,Win32両対応)

//□「Linux Programmer's Manual - ISATTY」(http://linuxjm.osdn.jp/html/LDP_man-pages/man3/isatty.3.html)
//│isatty - ファイルディスクリプターが端末を参照しているかをチェックする
//│[説明]
//│isatty()関数は、fdが端末を参照するオープンされたファイルディスクリプターかどうかをチェックする。
//│[返り値]
//│isatty()は、fdが端末を参照するオープンされたファイルディスクリプターであれば1を返す。
//│そうでなければ0を返し、errnoにエラーを示す値を設定する。
#ifndef WIN32	//{{2016/09/29追加:Win32では、isatty()を宣言しないようにしました。}}
int isatty(int fd);	//⇒clipio.c(P/ECEのみ対応)	Win32はVC++6.0のランタイムライブラリを使用する。
#endif//WIN32	//{{2016/09/29追加:Win32では、isatty()を宣言しないようにしました。}}

//□「Linux Programmer's Manual - TRUNCATE」(http://linuxjm.osdn.jp/html/LDP_man-pages/man2/truncate.2.html)より引用:
//│truncate,ftruncate - 指定した長さにファイルを切り詰める
//│[説明]
//│truncate()はpathで指定されるファイルを、ftruncate()はfdで参照されるファイルをlengthバイトの長さになるように延長する、もしくは切り詰める。
//│もし切り詰める前のファイルがlengthより長ければ、lengthバイトを越える部分のデータは失われる。
//│もし切り詰める前のファイルがlengthより短かければ、伸張される。伸張された部分を読んだ場合はヌルバイト('\0')の列が返される。
//│ファイルオフセットは変更されない。
//│大きさが変更されると、ファイルのst_ctimeとst_mtimeフィールド(それぞれ最終状態変更時刻、最終修正時刻;stat(2)参照)が更新される。
//│また、set-user-IDとset-group-IDの許可ビットがクリアされるかもしれない。
//│ftruncate()の場合、ファイルは書き込み用に開いていなければならない。truncate()の場合、ファイルは書き込み可能でなければならない。
//│[返り値]
//│成功した場合は0が返される。
//│エラーの場合は-1が返され、errnoが適切に設定される。
int truncate(const char* path, /*off_t*/long length);	//⇒clipio.c(P/ECEのみ対応)	⇒cliplibc.c(Win32のみ対応)
int ftruncate(int fd, /*off_t*/long length);		//⇒clipio.c(P/ECEのみ対応)	⇒cliplibc.c(Win32のみ対応)

#ifdef __cplusplus
}//extern "C"
#endif//__cplusplus

//POSIX仕様では、getopt()は<unistd.h>，getopt_long()とgetopt_long_only()は<getopt.h>で宣言する事になっています。
//P/ECEとWindowsには<unistd.h>が無いので、これまではすべて<getopt.h>で宣言していました。
//今回、<unistd.h>を追加したので、getopt()の宣言を<unistd.h>に移す事も可能ではあるのですが、しない事にしました。
//getopt()とgetopt_long()は、同じヘッダファイル内で宣言されている方が自然だと思うからです。
//アプリケーションが<unistd.h>だけをインクルードした場合にもgetopt()が使えるように、<unistd.h>から<getopt.h>をインクルードするようにしました。
//ちなみに、glibcの<unistd.h>と<getopt.h>も、上記と同様の構成になっているようです。
#ifndef WIN32
#include <getopt.h>		//⇒getopt.c(P/ECE,Win32両対応)
#else //WIN32
#include <include/getopt.h>	//⇒getopt.c(P/ECE,Win32両対応)
#endif//WIN32

#endif//__UNISTD_H__
