/*
 * Console I/O definitions
 *
 * Derived from the mingw header written by Colin Peters.
 * Modified for Wine use by Jon Griffiths and Francois Gouget.
 * This file is in the public domain.
 */
#ifndef __WINE_CONIO_H
#define __WINE_CONIO_H

#include <crtdefs.h>

#ifdef __cplusplus
extern "C" {
#endif

char* __cdecl _cgets(char*);
int   __cdecl _cprintf(const char*,...);
int   __cdecl _cputs(const char*);
int   __cdecl _cscanf(const char*,...);
int   __cdecl _getch(void);
int   __cdecl _getche(void);
int   __cdecl _kbhit(void);
int   __cdecl _putch(int);
int   __cdecl _ungetch(int);

#ifdef _M_IX86
int            __cdecl _inp(unsigned short);
unsigned long  __cdecl _inpd(unsigned short);
unsigned short __cdecl _inpw(unsigned short);
int            __cdecl _outp(unsigned short, int);
unsigned long  __cdecl _outpd(unsigned short, unsigned long);
unsigned short __cdecl _outpw(unsigned short, unsigned short);
#endif

#ifdef __cplusplus
}
#endif


static inline char* cgets(char* str) { return _cgets(str); }
static inline int cputs(const char* str) { return _cputs(str); }
static inline int getch(void) { return _getch(); }
static inline int getche(void) { return _getche(); }
static inline int kbhit(void) { return _kbhit(); }
static inline int putch(int c) { return _putch(c); }
static inline int ungetch(int c) { return _ungetch(c); }
#ifdef _M_IX86
static inline int inp(unsigned short i) { return _inp(i); }
static inline unsigned short inpw(unsigned short i) { return _inpw(i); }
static inline int outp(unsigned short i, int j) { return _outp(i, j); }
static inline unsigned short outpw(unsigned short i, unsigned short j) { return _outpw(i, j); }
#endif

#if defined(__GNUC__) && (__GNUC__ < 4)
extern int __cdecl cprintf(const char*,...) __attribute__((alias("_cprintf"),format(printf,1,2)));
extern int __cdecl cscanf(const char*,...) __attribute__((alias("_cscanf"),format(scanf,1,2)));
#else
#define cprintf _cprintf
#define cscanf _cscanf
#endif /* __GNUC__ */

#endif /* __WINE_CONIO_H */
