#ifndef __CURSES_LOADED
#define __CURSES_LOADED	1

#include <ssdef.h>
#include <stdio.h>
#include <smgdef.h>

#ifdef __cplusplus
extern "C" {
#endif
#define	reg	register
#ifndef	TRUE
#define	TRUE	(1)
#define	FALSE	(0)
#endif
#define	ERR	(0)
#define	OK	(1)
#define	_SUBWIN		0001
#define	_ENDLINE	0002
#define	_FULLWIN	0004
#define	_SCROLLWIN	0010
#define	_FLUSH		0020
#define	_STANDOUT	0200
#define	_NOECHO		001
#define	_NONL		002
#define	_NOCRMODE	004
#define	_NORAW		010
#define	_BLINK		SMG$M_BLINK
#define	_BOLD		SMG$M_BOLD
#define	_REVERSE	SMG$M_REVERSE
#define	_UNDERLINE	SMG$M_UNDERLINE
    struct _win_st {
	int _cur_y, _cur_x;
	int _max_y, _max_x;
	int _beg_y, _beg_x;
	short _flags;
	char _clear, _leave, _scroll, _wrap;
	char **_y;
	short *_firstch, *_lastch;
	struct _win_st *_next, *_parent, *_child;
	int _id;
    };

    struct _kb_st {
	int _id;
	unsigned char _flags;
	struct {
	    unsigned short length;
	    unsigned char type;
	    unsigned char pclass;
	    char *address;
	} _buffer_desc;
	int _count;
	char *_ptr;
    };

    struct _pb_st {
	int _id;
	int _rows, _cols;
	union SMGDEF *_attr;
	int _attr_size;
    };

#define	_KEYBOARD	struct _kb_st
#define	WINDOW		struct _win_st
#define	_PASTEBOARD	struct _pb_st

    extern int LINES __asm("_$$PsectAttributes_NOSHR$$LINES");
    extern int COLS __asm("_$$PsectAttributes_NOSHR$$COLS");
    extern WINDOW *stdscr __asm("_$$PsectAttributes_NOSHR$$stdscr");
    extern WINDOW *curscr __asm("_$$PsectAttributes_NOSHR$$curscr");
    extern _KEYBOARD *stdkb __asm("_$$PsectAttributes_NOSHR$$stdkb");
    extern _PASTEBOARD *stdpb __asm("_$$PsectAttributes_NOSHR$$stdpb");

#define	getch()		wgetch	(stdscr)
#define	addch(ch)	waddch	(stdscr, ch)
#define	addstr(string)	waddstr	(stdscr, string)
#define	move(y, x)	wmove	(stdscr, y, x)
#define	refresh()	wrefresh (stdscr)
#define	clear()		wclear	(stdscr)
#define	clrtobot()	wclrtobot (stdscr)
#define	clrtoeol()	wclrtoeol (stdscr)
#define	delch()		wdelch 	(stdscr)
#define	erase()		werase (stdscr)
#define	insch(ch)	winsch	(stdscr, ch)
#define	insertln()	winsertln (stdscr)
#define	standout()	wstandout (stdscr)
#define	standend()	wstandend (stdscr)
#define	getstr(string)	wgetstr	(stdscr, string)
#define	inch()		winch	(stdscr)
#define	setattr(attr)	wsetattr (stdscr, attr)
#define	clrattr(attr)	wclrattr (stdscr, attr)
#define	deleteln()	wdeleteln (stdscr)
#define	insstr(string)	winsstr (stdscr, string)

#define mvwaddch(win,y,x,ch)	(wmove(win,y,x)==ERR)?ERR:waddch(win,ch)
#define mvwgetch(win,y,x)	(wmove(win,y,x)==ERR)?ERR:wgetch(win)
#define mvwaddstr(win,y,x,str)	(wmove(win,y,x)==ERR)?ERR:waddstr(win,str)
#define mvwinsstr(win,y,x,str)	(wmove(win,y,x)==ERR)?ERR:winsstr(win,str)
#define mvwgetstr(win,y,x,str)	(wmove(win,y,x)==ERR)?ERR:wgetstr(win,str)
#define mvwinch(win,y,x)	(wmove(win,y,x)==ERR)?ERR:winch(win)
#define mvwdelch(win,y,x)	(wmove(win,y,x)==ERR)?ERR:wdelch(win)
#define mvwinsch(win,y,x,ch)	(wmove(win,y,x)==ERR)?ERR:winsch(win,ch)
#define mvwdeleteln(win,y,x)	(wmove(win,y,x)==ERR)?ERR:wdeleteln(win)
#define mvaddch(y,x,ch)	mvwaddch (stdscr, y, x, ch)
#define mvgetch(y,x)		mvwgetch (stdscr, y, x)
#define mvaddstr(y,x,str)	mvwaddstr (stdscr, y, x, str)
#define mvinsstr(y,x,str)	mvwinsstr (stdscr, y, x, str)
#define mvgetstr(y,x,str)	mvwgetstr (stdscr, y, x, str)
#define mvinch(y,x)		mvwinch (stdscr, y, x)
#define mvdelch(y,x)		mvwdelch (stdscr, y, x)
#define mvinsch(y,x,ch)	mvwinsch (stdscr, y, x, ch)
#define mvdeleteln(y,x)	mvwdeleteln (stdscr, y, x)
#define mvcur(ly,lx,ny,nx)	wmove (stdscr, ny, nx)
#pragma standard

#define clearok(win, bf)	(win->_clear = bf)
#define leaveok(win, bf)	(win->_leave = bf)
#define scrollok(win, bf)	(win->_scroll = bf)
#define wrapok(win, bf)	(win->_wrap = bf)
#define flushok(win,bf) (bf ? win->_flags |= _FLUSH : (win->_flags &= ~_FLUSH))
#define getyx(win,y,x)		y = win->_cur_y, x = win->_cur_x

#define echo()			(stdkb->_flags &= ~_NOECHO)
#define noecho()		(stdkb->_flags |= _NOECHO)
#define nl()			(stdkb->_flags &= ~_NONL)
#define nonl()			(stdkb->_flags |= _NONL)
#define crmode()		((stdkb->_flags &= ~_NOCRMODE), nonl ())
#define nocrmode()		(stdkb->_flags |= _NOCRMODE)
#define raw()			(stdkb->_flags &= ~_NORAW)
#define noraw()		(stdkb->_flags |= _NORAW)

#define check(status)	if (!(status & SS$_NORMAL))	\
			{	c$$translate (status); 	\
				return ERR;		\
			}

#define bool int

    int waddch(WINDOW * win, char ch);

    int waddstr(WINDOW * win, char *str);

    int box(WINDOW * win, char vert, char hor);

    int wclear(WINDOW * win);

    int wclrattr(WINDOW * win, int attr);

    int wclrtobot(WINDOW * win);

    int wclrtoeol(WINDOW * win);

    int wdelch(WINDOW * win);

    int wdeleteln(WINDOW * win);

    int delwin(WINDOW * win);

    int endwin(void);

    int werase(WINDOW * win);

    int wgetch(WINDOW * win);

    int wgetstr(WINDOW * win, char *str);

    char winch(WINDOW * win);

    WINDOW *initscr(void);

    int winsch(WINDOW * win, char ch);

    int winsertln(WINDOW * win);

    int winsstr(WINDOW * win, char *str);

    int longname(char *termbuf, char *name);

    int mvwin(WINDOW * win, int st_row, int st_col);

    int wmove(WINDOW * win, int y, int x);

    WINDOW *newwin(int numlines, int numcols, int begin_y, int begin_x);

    int overlay(WINDOW * win1, WINDOW * win2);

    int overwrite(WINDOW * win1, WINDOW * win2);

#pragma NOSTANDARD
#undef printw
#undef wprintw
#undef wscanw
#undef scanw
#pragma STANDARD

    int printw(char *format_spec,...);

    int wprintw(WINDOW * win, char *format_spec,...);

    int wrefresh(WINDOW * win);

    int wscanw(WINDOW * win, char *format_spec,...);

    int scanw(char *fmt, int arg1);

    int scroll(WINDOW * win);

    int wsetattr(WINDOW * win, int attr);

    WINDOW *subwin(WINDOW * win, int numlines, int numcols,
		   int begin_y, int begin_x);

    int wstandend(WINDOW * win);

    int wstandout(WINDOW * win);

    int touchwin(WINDOW * win);

#if defined(CC$mixed_float) || defined(CC$VAXCSHR)

#ifndef CC$gfloat
#define CC$gfloat 0
#endif

#if CC$gfloat

#define printw  vaxc$gprintw
#define scanw   vaxc$gscanw
#define wprintw vaxc$gwprintw
#define wscanw  vaxc$gwscanw

#else

#define printw  vaxc$dprintw
#define scanw   vaxc$dscanw
#define wprintw vaxc$dwprintw
#define wscanw  vaxc$dwscanw

#endif
#endif

#ifdef __cplusplus
}
#endif
#endif				/* __CURSES_LOADED */
