/* The header stdio.h defines several macros, and declares three types and many
 * functions for performing input and output.
 */
#ifndef _STDIO_
#define _STDIO_

#include<civl-stdio.cvh>

/* Needed from stdarg.h: */

#include <stdarg.h>
#pragma CIVL ACSL 
/* Types */

typedef unsigned long int size_t;

typedef int fpos_t;

/* Macros */

#ifndef NULL
#define NULL ((void*)0)
#endif
#define _IOFBF 1
#define _IOLBF 2
#define _IONBF 3
#define BUFSIZ 100
#define EOF (-100)
#define FOPEN_MAX 100
#define FILENAME_MAX 500
#define L_tmpnam 500
#define SEEK_CUR 1
#define SEEK_END 2
#define SEEK_SET 3
#define TMP_MAX 100
//#define stdin (FILE*)0
//#define stdout (FILE*)1
//#define stderr (FILE*)2

/* external variables */

extern FILE * stdout;
extern FILE * stdin;
extern FILE * stderr;

/* Functions */

int remove(const char *filename);
int rename(const char *old, const char *new);
FILE *tmpfile(void);
char *tmpnam(char *s);
/*@ depends_on \access(stream);
  @ executes_when \true;
  @*/
$system int fclose(FILE *stream);
/*@ depends_on \access(stream);
  @ executes_when \true;
  @*/
$system int fflush(FILE *stream);
FILE *fopen(const char * restrict filename,
     const char * restrict mode);
FILE *freopen(const char * restrict filename,
     const char * restrict mode,
     FILE * restrict stream);
void setbuf(FILE * restrict stream,
     char * restrict buf);
int setvbuf(FILE * restrict stream,
     char * restrict buf,
     int mode, size_t size);
/*@ depends_on \access(stream, format);
  @ executes_when \true;
  @*/
$system int fprintf(FILE * restrict stream,
     const char * restrict format, ...);
/*@ depends_on \access(stream, format);
  @ executes_when \true;
  @*/
$system int fscanf(FILE * restrict stream,
     const char * restrict format, ...);
/*@ depends_on \access(format);
  @ executes_when \true;
  @*/
$system int printf(const char * restrict format, ...);
/*@ depends_on \access(format);
  @ executes_when \true;
  @*/
$system int scanf(const char * restrict format, ...);
int snprintf(char * restrict s, size_t n,
     const char * restrict format, ...);
$system int sprintf(char * restrict s,
     const char * restrict format, ...);
/*@ depends_on \access(s, format);
  @ executes_when \true;
  @*/
$system int sscanf(const char * restrict s,
     const char * restrict format, ...);
int vfprintf(FILE * restrict stream,
     const char * restrict format, va_list arg);
int vfscanf(FILE * restrict stream,
     const char * restrict format, va_list arg);
int vprintf(const char * restrict format, va_list arg);
int vscanf(const char * restrict format, va_list arg);
int vsnprintf(char * restrict s, size_t n,
     const char * restrict format, va_list arg);
int vsprintf(char * restrict s,
     const char * restrict format, va_list arg);
int vsscanf(const char * restrict s,
     const char * restrict format, va_list arg);
int fgetc(FILE *stream);
$system char *fgets(char * restrict s, int n,
     FILE * restrict stream);
int fputc(int c, FILE *stream);
int fputs(const char * restrict s,
     FILE * restrict stream);
int getc(FILE *stream);
int getchar(void);
int putc(int c, FILE *stream);
int putchar(int c);
int puts(const char *s);
int ungetc(int c, FILE *stream);
size_t fread(void * restrict ptr,
     size_t size, size_t nmemb,
     FILE * restrict stream);
size_t fwrite(const void * restrict ptr,
     size_t size, size_t nmemb,
     FILE * restrict stream);
int fgetpos(FILE * restrict stream,
     fpos_t * restrict pos);
int fseek(FILE *stream, long int offset, int whence);
int fsetpos(FILE *stream, const fpos_t *pos);
long int ftell(FILE *stream);
void rewind(FILE *stream);
void clearerr(FILE *stream);
int feof(FILE *stream);
int ferror(FILE *stream);
void perror(const char *s);

/* Optional Extensions */

#define __STDC_WANT_LIB_EXT1__ 1
#define L_tmpnam_s 100
#define TMP_MAX_S 100
typedef int errno_t;
typedef size_t rsize_t;
errno_t tmpfile_s(FILE * restrict * restrict streamptr);
errno_t tmpnam_s(char *s, rsize_t maxsize);
errno_t fopen_s(FILE * restrict * restrict streamptr,
     const char * restrict filename,
     const char * restrict mode);
errno_t freopen_s(FILE * restrict * restrict newstreamptr,
     const char * restrict filename,
     const char * restrict mode,
     FILE * restrict stream);
int fprintf_s(FILE * restrict stream,
     const char * restrict format, ...);
int fscanf_s(FILE * restrict stream,
     const char * restrict format, ...);
int printf_s(const char * restrict format, ...);
int scanf_s(const char * restrict format, ...);
int snprintf_s(char * restrict s, rsize_t n,
     const char * restrict format, ...);
int sprintf_s(char * restrict s, rsize_t n,
     const char * restrict format, ...);
int sscanf_s(const char * restrict s,
     const char * restrict format, ...);
int vfprintf_s(FILE * restrict stream,
     const char * restrict format,
     va_list arg);
int vfscanf_s(FILE * restrict stream,
     const char * restrict format,
     va_list arg);
int vprintf_s(const char * restrict format,
     va_list arg);
int vscanf_s(const char * restrict format,
     va_list arg);
int vsnprintf_s(char * restrict s, rsize_t n,
     const char * restrict format,
     va_list arg);
int vsprintf_s(char * restrict s, rsize_t n,
     const char * restrict format,
     va_list arg);
int vsscanf_s(const char * restrict s,
     const char * restrict format,
     va_list arg);
char *gets_s(char *s, rsize_t n);

#endif
