
    /********************************************************/
    /*                                                      */
    /*                                                      */
    /*         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で宣言する事にしました。 */
    /*                                                      */
    /********************************************************/
                                        
#ifndef _STDIO_H
#define _STDIO_H

#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

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 * );

//{{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へ移しました。

//{{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*/int getline(char** lineptr, size_t* n, FILE* stream);
/*ssize_t*/int 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で宣言することにしました。
#define STDIN_FILENO  0 /* 標準入力のファイル記述子 */
#define STDOUT_FILENO 1 /* 標準出力のファイル記述子 */
#define STDERR_FILENO 2 /* 標準エラー出力のファイル記述子 */
/* 指定されたストリームの、ファイル記述子を返します。指定されたストリームが、有効なストリームでなければ、-1 を返します。 */
int fileno(FILE* stream); /* -> clipio.c */
/* 指定されたファイル記述子が、端末を参照するファイル記述子ならば、1 を返します。そうでなければ、0 を返します。 */
int isatty(int fd); /* -> clipio.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/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で宣言する事にしました。

#endif _STDIO_H
