
    /********************************************************/
    /*                                                      */
    /*                                                      */
    /*         Copyright (C), 1993  SEIKO EPSON Corp.       */
    /*         ALL RIGHTS RESERVED                          */
    /*                                                      */
    /*                                                      */
    /*  file name : stdio.h                                 */
    /*                                                      */
    /*  Revision history                                    */
    /*      93/12/17    first release       S.Akaiwa        */
    /*      97/3/17	modified	    T.Katahira	    */
    /*			change function declaration	    */
    /*					to the ANSI style   */
    /*      14/3/10     modify for P/ECE    Naoyuki Sawa    */
    /*                - P/ECEで不要な部分を削除しました。   */
    /*                - sscanfの宣言を修正しました。        */
    /*                - getcharとgetcをマクロ化しました。   */
    /*                - putcharとputcをマクロ化しました。   */
    /*      14/8/7      modify for P/ECE    Naoyuki Sawa    */
    /*                - fcloseallの宣言を追加しました。     */
    /*      14/10/2   - snprintf(),vsnprintf()の宣言をclippce.h⇒include/stdio.hへ移しました。*/
    /*                - scprintf(),vscprintf(),asprintf(),vasprintf()を追加しました。         */
    /*      14/10/23  - vscanf(),vsscanf(),vfscanf()を追加しました。実装はclipscan.cにあります。 */
    /*      14/11/11  - getline(),getdelim()を追加しました。実装はgetline.cにあります。 */
    /*      15/01/07  - fileno(),isatty()の宣言を、clippce.h⇒include/stdio.hへ移動しました。実装はclipio.cにあります。                                  */
    /*                  isatty()は本当はio.hかunistd.hで宣言すべきなのですが、P/ECEにはio.hもunistd.hも無いのでinclude/stdio.hで宣言することにしました。 */
    /*      15/01/20  - size_tの定義をunsigned型に統一しました。 */
    /*      15/03/11  - truncate(),ftruncate()を追加しました。実装はclipio.cに有ります。                                             */
    /*                  本来はunistd.hで宣言すべきなのですがP/ECEにはunistd.hが無いので代りにinclude/stdio.hで宣言する事にしました。 */
    /*      15/11/18  - 'extern "C" {'〜'}'で囲みました。.cppを含むWin32プロジェクトからもインクルード出来るようにするためです。 */
    /*      15/11/24  - STDIN_FILENO,STDOUT_FILENO,STDERR_FILENOの定義,及び,isatty(),truncate(),ftruncate()の宣言を、stdio.h⇒unistd.hへ移動しました。 */
    /*      16/03/19  - /clip/include/sys/types.h(又は/clip/clipstdw.h)にssize_tの定義を追加した事に伴い、これまでssize_tの代りにintを使っていた部分を正式なssize_tに修正しました。             */
    /*                  2016/03/19時点でint⇒ssize_tに修正した箇所は、getline(),getdelim(),mq_receive()です。                                                                                   */
    /*                - 本当は、ssize_tの定義は/clip/include/sys/types.h(又は/clip/clipstdw.h)だけで行いたかったのですが、止むを得ない理由により/clip/include/stdio.hでも定義する事にしました。 */
    /*                  止むを得ない理由とは、/clip/liblua/lobject.cが<sys/types.h>をインクルードせずにstdio.hをインクルードしており、ssize_tの定義前にssize_tを使用してしまうからです。        */
    /*                  その問題を回避するために、stdio.hがインクルードされた時点でssize_tが未定義ならば、stdio.hでもssize_tを定義するようにしました。                                          */
    /*                  ssize_tが未定義かどうかを判断する方法は、既存のsize_tが_SIZE_Tマクロを使って判断しているのと同様に、_SSIZE_Tマクロを使って判断するようにしました。                      */
    /*                  ちなみに、このような目的に使うマクロ名としては、'_SSIZE_T'や'HAVE_SSIZE_T'等の流儀が有るようですが、今回は前者の流儀に倣う事にしました。                                */
    /*                  そうした理由は、EPSONライブラリが前者の流儀であるようである事と、今回ssize_tを追加する時に参照したSolaris2.8用のインクルードファイル(?)も前者の流儀のようだからです。   */
    /*                  ただし後者の流儀を使っているオープンソースのソフトも多いようで、もしかすると後者(又は両方)にする方がオープンソースのソフトを使う時に整合性が保ちやすいかも知れません。  */
    /*      16/05/28  - snprintf(),vsnprintf()の引数cntの型をint⇒size_tに修正しました。 */
    /*                  詳細は、clipprnt.cの同日のコメントを参照して下さい。             */
    /*                                                      */
    /********************************************************/
                                        
#ifndef _STDIO_H
#define _STDIO_H

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

#ifndef _SIZE_T
#define _SIZE_T
//{{2015/01/20変更:size_tの定義をunsigned型に統一しました。
//typedef unsigned long   size_t;         /* size of type */
//↓2015/01/20変更:size_tの定義をunsigned型に統一しました。
// * Tue Jan 20 23:26:57 JST 2015 Naoyuki Sawa
// - P/ECE開発環境ではsize_tはunsigned。unsigned longではない。
//   例1:○
//   │typedef unsigned size_t;
//   │extern void* memcpy(void*,const void*,size_t); ← 警告無くコンパイル出来る
//   例2:×
//   │typedef unsigned long size_t;
//   │extern void* memcpy(void*,const void*,size_t); ← warning:conflicting types for built-in function `memcpy'
//   P/ECE開発環境の標準インクルードファイルも間違っているので要注意です。
//   stddef.hでの定義は正しいけれど、stdio.h,stdlib.h,string.h,time.hでの定義は間違っています。
//   たまたまstddef.hを最初にインクルードすると大丈夫なのでした。
// - どのヘッダファイルを最初にインクルードしても大丈夫なように、定義を統一することにしました。
//   自作のP/ECEプログラムならば、stddef.hを最初にインクルードするようにできるのですが、
//   オープンソースのライブラリを変更無くコンパイルしたい時に、stddef.h以外が最初になっている場合があるからです。
//   具体的には、/clip/liblua/をコンパイルするときに警告が出て、この問題に気付きました。
typedef unsigned size_t;
//}}2015/01/20変更:size_tの定義をunsigned型に統一しました。
#endif

// * Sat Mar 19 21:19:21 JST 2016 Naoyuki Sawa
// - 本当は、ssize_tの定義は/clip/include/sys/types.h(又は/clip/clipstdw.h)だけで行いたかったのですが、止むを得ない理由により/clip/include/stdio.hでも定義する事にしました。
//   止むを得ない理由とは、/clip/liblua/lobject.cが<sys/types.h>をインクルードせずにstdio.hをインクルードしており、ssize_tの定義前にssize_tを使用してしまうからです。
//   その問題を回避するために、stdio.hがインクルードされた時点でssize_tが未定義ならば、stdio.hでもssize_tを定義するようにしました。
//   ssize_tが未定義かどうかを判断する方法は、既存のsize_tが_SIZE_Tマクロを使って判断しているのと同様に、_SSIZE_Tマクロを使って判断するようにしました。
//   ちなみに、このような目的に使うマクロ名としては、'_SSIZE_T'や'HAVE_SSIZE_T'等の流儀が有るようですが、今回は前者の流儀に倣う事にしました。
//   そうした理由は、EPSONライブラリが前者の流儀であるようである事と、今回ssize_tを追加する時に参照したSolaris2.8用のインクルードファイル(?)も前者の流儀のようだからです。
//   ただし後者の流儀を使っているオープンソースのソフトも多いようで、もしかすると後者(又は両方)にする方がオープンソースのソフトを使う時に整合性が保ちやすいかも知れません。
#ifndef _SSIZE_T
#define _SSIZE_T
typedef int ssize_t;			/* size of something in bytes or -1 */
#endif//_SSIZE_T

typedef long            fpos_t;         /* file type size */


typedef struct  {                       /* FILE structure */
        short           _flg;           /* unget exist flag */
        unsigned char   _buf;           /* unget character */
        int             _fd;            /* file descriptor */  
} FILE;

#if !defined(NULL)
#  define NULL          ((void *)0L)    /* null pointer */
#endif

#define EOF             (-1)            /* eof flag */

#define BUFSIZ          1024

#define SEEK_SET        0               /* seek from beginning */
#define SEEK_CUR        1               /* seek from here */
#define SEEK_END        2               /* seek from end */

#define _NFILE          3
#define FOPEN_MAX       _NFILE

#define FILENAME_MAX    0

#ifdef  UNIX
#define L_tmpnam        25 
#else
#define L_tmpnam        0
#endif

#define TMP_MAX         0

#define _IOFBF          0000            /* fully buffered io */
#define _IOLBF          0000            /* line buffered */
#define _IONBF          0000            /* unbuffered */

extern  FILE            _iob[FOPEN_MAX + 1];

extern	FILE			*stdin;			/* standard input stream */
extern	FILE			*stdout;		/* standard output stream */
extern	FILE			*stderr;		/* standard error stream */

#ifdef va_start
#define _VA_LIST va_list
#else
#define _VA_LIST char *
#endif

/* prototype definition */

extern  FILE    *tmpfile( void );
extern  char    *tmpnam( char * );
extern  int     remove( const char * );
extern  int     rename( const char *, const char * );
extern  FILE    *fopen( const char *, const char * );
extern  FILE    *freopen( const char *, const char *, FILE * );
extern  int     fclose( FILE * );
extern  int     fcloseall( void );				// 2014.08.07 N.SAWA 追加

extern  void    setbuf( FILE *, char * );
extern  int     setvbuf( FILE *, char *, int, size_t );
extern  int     fflush( FILE * );

extern  void    clearerr( FILE * );
extern  int     feof( FILE * );
extern  int     ferror( FILE * );
extern  void    perror( const char * );

extern  int     fseek( FILE *, long, int );
extern  int     fgetpos( FILE *, fpos_t * );
extern  int     fsetpos(  FILE *, const fpos_t * );
extern  long    ftell( FILE * );
extern  void    rewind( FILE * );

#define getchar() getc(stdin)					// 2014.03.10 N.SAWA 変更。マクロ化しました。
extern  int     fgetc( FILE * );
#define getc(s)  fgetc(s)					// 2014.03.10 N.SAWA 変更。マクロ化しました。

extern  char    *gets( char * );
extern  char    *fgets( char *, int, FILE * );

//#if defined(UNIX) && !defined(ANSI)				// 2014.03.10 N.SAWA 削除
//extern  int     scanf( /* va_alist */ );			// 2014.03.10 N.SAWA 削除
//extern  int     fscanf( /* va_alilst */ );			// 2014.03.10 N.SAWA 削除
//extern  int     sscanf( /* va_alilst */ );			// 2014.03.10 N.SAWA 削除
//#else								// 2014.03.10 N.SAWA 削除
extern  int     scanf( const char *, ... );
extern  int     fscanf( FILE *, const char *, ... );
extern  int     sscanf( const char *, const char *, ... );	// 2014.03.10 N.SAWA 変更。第一引数にconstが欠けていたので修正した。
//#endif							// 2014.03.10 N.SAWA 削除

extern  size_t  fread( void *, size_t, size_t, FILE * );

#define putchar(c) putc((c),stdout)				// 2014.03.10 N.SAWA 変更。マクロ化しました。
extern  int     fputc( int, FILE * );
#define putc(c,s) fputc((c),(s))				// 2014.03.10 N.SAWA 変更。マクロ化しました。

extern  int     puts( const char * );
extern  int     fputs( const char *, FILE * );

extern  int     ungetc( int, FILE * );

//#if defined(UNIX) && !defined(ANSI)				// 2014.03.10 N.SAWA 削除
//extern  int     printf( /* char *, ... */ );			// 2014.03.10 N.SAWA 削除
//extern  int     fprintf( /* FILE *, char *, ... */ );		// 2014.03.10 N.SAWA 削除
//extern  int     sprintf( /* char *, char *, ... */ );		// 2014.03.10 N.SAWA 削除
//extern  int     vprintf( /* char *, va_list */ );		// 2014.03.10 N.SAWA 削除
//extern  int     vfprintf( /* FILE *, char *, va_list */ );	// 2014.03.10 N.SAWA 削除
//extern  int     vsprintf( /* char *, char *, va_list */ );	// 2014.03.10 N.SAWA 削除
//#else								// 2014.03.10 N.SAWA 削除
extern  int     printf( const char *, ...  );
extern  int     fprintf( FILE *, const char *, ... );
extern  int     sprintf( char *, const char *, ... );
extern  int     vprintf( const char *, _VA_LIST );
extern  int     vfprintf( FILE *, const char *, _VA_LIST );
extern  int     vsprintf( char *, const char *, _VA_LIST );
//#endif							// 2014.03.10 N.SAWA 削除

extern  size_t  fwrite( const void *, size_t, size_t, FILE * );

//{{2016/05/28変更:snprintf(),vsnprintf()の引数cntの型をint⇒size_tに修正しました。詳細は、clipprnt.cの同日のコメントを参照して下さい。
////{{2014/10/02追加:snprintf(),vsnprintf()の宣言をclippce.h⇒include/stdio.hへ移しました。
//int snprintf(char* out, int cnt, const char* fmt, ...);
//int vsnprintf(char* out, int cnt, const char* fmt, _VA_LIST ap);		//EPSONライブラリのオリジナルのstdio.hの手法に倣って、宣言時はva_listでなく_VA_LISTを使用した。stdarg.hをインクルードせずにstdio.hをインクルードした時に、エラーになることを避けるためである。
////}}2014/10/02追加:snprintf(),vsnprintf()の宣言をclippce.h⇒include/stdio.hへ移しました。
//↓2016/05/28変更:snprintf(),vsnprintf()の引数cntの型をint⇒size_tに修正しました。詳細は、clipprnt.cの同日のコメントを参照して下さい。
int snprintf(char* out, size_t cnt, const char* fmt, ...);
int vsnprintf(char* out, size_t cnt, const char* fmt, _VA_LIST ap);		//EPSONライブラリのオリジナルのstdio.hの手法に倣って、宣言時はva_listでなく_VA_LISTを使用した。stdarg.hをインクルードせずにstdio.hをインクルードした時に、エラーになることを避けるためである。
//}}2016/05/28変更:snprintf(),vsnprintf()の引数cntの型をint⇒size_tに修正しました。詳細は、clipprnt.cの同日のコメントを参照して下さい。

//{{2014/10/02追加:scprintf(),vscprintf(),asprintf(),vasprintf()を追加しました。
int scprintf(const char* fmt, ...);
int vscprintf(const char* fmt, _VA_LIST ap);					//EPSONライブラリのオリジナルのstdio.hの手法に倣って、宣言時はva_listでなく_VA_LISTを使用した。stdarg.hをインクルードせずにstdio.hをインクルードした時に、エラーになることを避けるためである。
int asprintf(char** strp, const char* fmt, ...);
int vasprintf(char** strp, const char* fmt, _VA_LIST ap);			//EPSONライブラリのオリジナルのstdio.hの手法に倣って、宣言時はva_listでなく_VA_LISTを使用した。stdarg.hをインクルードせずにstdio.hをインクルードした時に、エラーになることを避けるためである。
//}}2014/10/02追加:scprintf(),vscprintf(),asprintf(),vasprintf()を追加しました。

//{{2014/10/23追加:vscanf(),vsscanf(),vfscanf()を追加しました。実装はclipscan.cにあります。
int vscanf(const char* fmt, _VA_LIST ap);					//EPSONライブラリのオリジナルのstdio.hの手法に倣って、宣言時はva_listでなく_VA_LISTを使用した。stdarg.hをインクルードせずにstdio.hをインクルードした時に、エラーになることを避けるためである。
int vsscanf(const char* str, const char* fmt, _VA_LIST ap);			//EPSONライブラリのオリジナルのstdio.hの手法に倣って、宣言時はva_listでなく_VA_LISTを使用した。stdarg.hをインクルードせずにstdio.hをインクルードした時に、エラーになることを避けるためである。
int vfscanf(FILE* stream, const char* fmt, _VA_LIST ap);			//EPSONライブラリのオリジナルのstdio.hの手法に倣って、宣言時はva_listでなく_VA_LISTを使用した。stdarg.hをインクルードせずにstdio.hをインクルードした時に、エラーになることを避けるためである。
//}}2014/10/23追加:vscanf(),vsscanf(),vfscanf()を追加しました。実装はclipscan.cにあります。

//{{2014/11/11追加:getline(),getdelim()を追加しました。実装はgetline.cにあります。
ssize_t getline(char** lineptr, size_t* n, FILE* stream);
ssize_t getdelim(char** lineptr, size_t* n, int delim, FILE* stream);
//}}2014/11/11追加:getline(),getdelim()を追加しました。実装はgetline.cにあります。

//{{2015/01/07追加:fileno(),isatty()の宣言を、clippce.h⇒include/stdio.hへ移動しました。実装はclipio.cにあります。isatty()は本当はio.hかunistd.hで宣言すべきなのですが、P/ECEにはio.hもunistd.hも無いのでinclude/stdio.hで宣言することにしました。
//{{2015/11/24削除:STDIN_FILENO,STDOUT_FILENO,STDERR_FILENOの定義,及び,isatty(),truncate(),ftruncate()の宣言を、stdio.h⇒unistd.hへ移動しました。
//#define STDIN_FILENO  0 /* 標準入力のファイル記述子 */
//#define STDOUT_FILENO 1 /* 標準出力のファイル記述子 */
//#define STDERR_FILENO 2 /* 標準エラー出力のファイル記述子 */
//}}2015/11/24削除:STDIN_FILENO,STDOUT_FILENO,STDERR_FILENOの定義,及び,isatty(),truncate(),ftruncate()の宣言を、stdio.h⇒unistd.hへ移動しました。
/* 指定されたストリームの、ファイル記述子を返します。指定されたストリームが、有効なストリームでなければ、-1 を返します。 */
int fileno(FILE* stream); /* -> clipio.c */
//{{2015/11/24削除:STDIN_FILENO,STDOUT_FILENO,STDERR_FILENOの定義,及び,isatty(),truncate(),ftruncate()の宣言を、stdio.h⇒unistd.hへ移動しました。
///* 指定されたファイル記述子が、端末を参照するファイル記述子ならば、1 を返します。そうでなければ、0 を返します。 */
//int isatty(int fd); /* -> clipio.c */
//}}2015/11/24削除:STDIN_FILENO,STDOUT_FILENO,STDERR_FILENOの定義,及び,isatty(),truncate(),ftruncate()の宣言を、stdio.h⇒unistd.hへ移動しました。
//}}2015/01/07追加:fileno(),isatty()の宣言を、clippce.h⇒include/stdio.hへ移動しました。実装はclipio.cにあります。isatty()は本当はio.hかunistd.hで宣言すべきなのですが、P/ECEにはio.hもunistd.hも無いのでinclude/stdio.hで宣言することにしました。

//{{2015/11/24削除:STDIN_FILENO,STDOUT_FILENO,STDERR_FILENOの定義,及び,isatty(),truncate(),ftruncate()の宣言を、stdio.h⇒unistd.hへ移動しました。
////{{2015/03/11追加:truncate(),ftruncate()を追加しました。実装はclipio.cに有ります。本来はunistd.hで宣言すべきなのですがP/ECEにはunistd.hが無いので代りにinclude/stdio.hで宣言する事にしました。
//int truncate(const char* path, /*off_t*/long length);
//int ftruncate(int fd, /*off_t*/long length);
////}}2015/03/11追加:truncate(),ftruncate()を追加しました。実装はclipio.cに有ります。本来はunistd.hで宣言すべきなのですがP/ECEにはunistd.hが無いので代りにinclude/stdio.hで宣言する事にしました。
//}}2015/11/24削除:STDIN_FILENO,STDOUT_FILENO,STDERR_FILENOの定義,及び,isatty(),truncate(),ftruncate()の宣言を、stdio.h⇒unistd.hへ移動しました。

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

#endif _STDIO_H
