+# include <stdio.h>
+
+# include <sgtty.h>
+
+# define bool char /* boolean variable */
+# define reg register /* register varaible abbr. */
+
+# define TRUE (1)
+# define FALSE (0)
+# define ERR (0) /* default return on error */
+# define OK (1) /* default return on good run */
+
+# define _SUBWIN 01 /* window is a subindow */
+# define _ENDLINE 02 /* lines go to end of screen */
+# define _FULLWIN 04 /* window is entire screen */
+# define _SCROLLWIN 010 /* window could cause scroll */
+# define _STANDOUT 0200 /* standout mode in effect */
+# define _NOCHANGE -1 /* no change on this line */
+
+# define _puts(s) tputs(s, 0, _putchar);
+
+typedef struct sgttyb SGTTY;
+
+# ifndef WINDOW
+
+/* Copyright (c) 1979 Regents of the University of California */
+/*
+ * Capabilities from termcap
+ */
+
+char *AL; /* P* Add new blank line */
+bool AM; /* Automatic margins */
+char *BC; /* Back cursor */
+bool BS; /* Backspace works */
+char *BT; /* P Back tab */
+bool CA; /* Cursor addressible */
+char *CD; /* P* Clear to end of display */
+char *CE; /* P Clear to end of line */
+char *CL; /* P* Clear screen */
+char *CM; /* P Cursor motion */
+bool DA; /* Display may be retained above */
+bool DB; /* Display may be retained below */
+char *DC; /* P* Delete character */
+char *DL; /* P* Delete line sequence */
+char *DM; /* Delete mode (enter) */
+char *DO; /* Down line sequence */
+char *ED; /* End delete mode */
+bool EO; /* Can erase overstrikes with ' ' */
+char *EI; /* End insert mode */
+bool GT; /* Gtty indicates tabs */
+char *HO; /* Home cursor */
+bool HZ; /* Hazeltine ~ braindamage */
+char *IC; /* P Insert character */
+bool IN; /* Insert-null blessing */
+char *IM; /* Insrt mode (as ':im=:' if 'ic') */
+char *IP; /* P* pad after char ins'd using IM+IE */
+char *LL; /* Quick to last line, column 0 */
+char *MA; /* Ctrl character map for cmd mode */
+bool MI; /* can move in insert mode */
+bool NC; /* No Cr: \r sends \r\n then eats \n */
+char *ND; /* Non-destructive space */
+bool OS; /* Overstrike works */
+char PC; /* Pad character */
+char *SE; /* Standout end (may leave space) */
+char *SF; /* P Scroll forwards */
+char *SO; /* Stand out begin (may leave space) */
+char *SR; /* P Scroll backwards */
+char *TA; /* P Tab (not ^I or with padding) */
+char *TE; /* End sequence after TI */
+char *TI; /* Terminal Initialize */
+char *UC; /* Underline a single Character */
+char *UE; /* Underline End sequence */
+bool UL; /* Underlining works even though !os */
+char *UP; /* Upline */
+char *US; /* Underline Start sequence */
+char *VB; /* Visible bell */
+char *VE; /* Visual end sequence */
+char *VS; /* Visual start sequence */
+bool XN; /* A newline gets eaten after wrap */
+ /* X? is reserved for severely nauseous glitches */
+ /* If there are enough of these we may need bit masks! */
+
+/*
+ * From the tty modes...
+ */
+bool NONL; /* Term can't hack linefeeds doing a CR */
+bool UPPERCASE; /* Ick! */
+
+bool normtty; /* set if must normal mode from normf */
+bool pfast; /* Have stty -nl'ed to go faster */
+
+# define WINDOW struct _win_st
+
+struct _win_st { /* window description structure */
+ short _cury, _curx; /* current y,x positions */
+ short _maxy, _maxx; /* maximum y,x positions */
+ short _begy, _begx; /* start y,x positions */
+ short _flags; /* various window flags */
+ bool _clear; /* need to clear */
+ bool _leave; /* leave curx,y at last update */
+ bool _scroll; /* scrolls allowed */
+ char **_y; /* actual window */
+ short *_firstch; /* first change on line */
+ short *_lastch; /* last change on line */
+};
+
+extern bool My_term, /* set if user species terminal */
+ _echoit, /* set if echoing characters */
+ _rawmode; /* set if terminal in raw mode */
+
+extern char *Def_term, /* default terminal type */
+ ttytype[]; /* long name of current terminal */
+
+extern int LINES, COLS, /* number of lines and columns */
+ _tty_ch, /* channel with tty on it */
+ _res_flg; /* sgtty flags stored for reset */
+
+# ifdef DEBUG
+FILE *outf; /* error outfile */
+# endif
+
+SGTTY _tty; /* tty structure */
+
+WINDOW *stdscr, /* standard screen */
+ *curscr; /* current screen */
+
+/*
+ * Define VOID to stop lint from generating "null effect"
+ * comments.
+ */
+# ifdef lint
+int __void__; /* place to assign to */
+# define VOID(x) (__void__ = (int) (x))
+# else
+# define VOID(x) (x)
+# endif
+
+# endif
+
+/*
+ * psuedo functions for standard screen
+ */
+# define addch(ch) VOID(waddch(stdscr, ch))
+# define getch() VOID(wgetch(stdscr))
+# define addstr(str) VOID(waddstr(stdscr, str))
+# define getstr(str) VOID(wgetstr(stdscr, str))
+# define move(y, x) VOID(wmove(stdscr, y, x))
+# define clear() VOID(wclear(stdscr))
+# define erase() VOID(werase(stdscr))
+# define clrtobot() VOID(wclrtobot(stdscr))
+# define clrtoeol() VOID(wclrtoeol(stdscr))
+# define insertln() VOID(winsertln(stdscr))
+# define deleteln() VOID(wdeleteln(stdscr))
+# define refresh() VOID(wrefresh(stdscr))
+# define inch() VOID(winch(stdscr))
+# define standout() VOID(wstandout(stdscr))
+# define standend() VOID(wstandend(stdscr))
+
+/*
+ * mv functions
+ */
+#define mvwaddch(win,y,x,ch) VOID(wmove(win,y,x)==ERR?ERR:waddch(win,ch))
+#define mvwgetch(win,y,x) VOID(wmove(win,y,x)==ERR?ERR:wgetch(win))
+#define mvwaddstr(win,y,x,str) VOID(wmove(win,y,x)==ERR?ERR:waddstr(win,str))
+#define mvwgetstr(win,y,x) VOID(wmove(win,y,x)==ERR?ERR:wgetstr(win))
+#define mvwinch(win,y,x) VOID(wmove(win,y,x) == ERR ? ERR : winch(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 mvgetstr(y,x) mvwgetstr(stdscr,y,x)
+#define mvinch(y,x) mvwinch(win,y,x)
+
+/*
+ * psuedo functions
+ */
+
+#define clearok(win,bf) (win->_clear = bf)
+#define leaveok(win,bf) (win->_leave = bf)
+#define scrollok(win,bf) (win->_scroll = bf)
+#define getyx(win,y,x) y = win->_cury, x = win->_curx
+#define winch(win) (win->_y[win->_cury][win->_curx])
+
+#define raw() (_tty.sg_flags|=RAW, pfast=_rawmode=TRUE, stty(_tty_ch,&_tty))
+#define noraw() (_tty.sg_flags&=~RAW,pfast=_rawmode=FALSE,stty(_tty_ch,&_tty))
+#define crmode() (_tty.sg_flags |= CBREAK, _rawmode = TRUE, stty(_tty_ch,&_tty))
+#define nocrmode() (_tty.sg_flags &= ~CBREAK,_rawmode=FALSE,stty(_tty_ch,&_tty))
+#define echo() (_tty.sg_flags |= ECHO, _echoit = TRUE, stty(_tty_ch, &_tty))
+#define noecho() (_tty.sg_flags &= ~ECHO, _echoit = FALSE, stty(_tty_ch, &_tty))
+#define nl() (_tty.sg_flags |= CRMOD, pfast = FALSE, stty(_tty_ch, &_tty))
+#define nonl() (_tty.sg_flags &= ~CRMOD, pfast = TRUE, stty(_tty_ch, &_tty))
+#define savetty() (gtty(_tty_ch, &_tty), _res_flg = _tty.sg_flags)
+#define resetty() (_tty.sg_flags = _res_flg, stty(_tty_ch, &_tty))
+
+WINDOW *initscr(), *newwin();