tony@wldrdg.UUCP (06/10/87)
#! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create the files: # curses.c # This archive created: Tue Jun 9 22:59:39 1987 export PATH; PATH=/bin:$PATH if test -f 'curses.c' then echo shar: will not over-write existing file "'curses.c'" else cat << \HE_HATES_THESE_CANS > 'curses.c' /* #[curses: simple-minded implementation of the curses package */ /* #[intro: introduction */ /* */ /* This source and resulting object may be modified, used or distributed by */ /* anyone who so desires under the following conditions : */ /* */ /* 1) This notice and the copyright notice shall not be removed or */ /* changed. */ /* 2) No credit shall be taken for this source and resulting objects */ /* 3) This source or resulting objects is not to be traded, sold or */ /* used for personal gain or profit. */ /* 4) Inclusion of this source or resulting objects in commercially */ /* available packages is forbidden without written consent of the */ /* author of this source. */ /* */ /* #]intro: */ /* #[include: include files */ #include "portab.h" #include "osbind.h" #include "curses.h" /* #]include: */ /* define supervisor mode entry forgotten in osbind.h */ #define Supexec(a) xbios(38,a) /* terminal states : cooked, cbreak and raw */ #define COOKED 0 #define CBREAK 1 #define RAW 2 /* define address of system-variable _conterm for kbshift return value */ #define CONTERM (*((char *)0x484)) /* #[globals: definition of global variables */ /* #[curglob: define the following variables as external in curses.h */ WINDOW *curscr ; WINDOW *stdscr ; char *Def_term = "AtariST" ; bool My_term = FALSE ; char *ttytype = "Atari ST-series computer, VT52/CURSES mode" ; int LINES = 25 ; int COLS = 80 ; int ERR = 0 ; int OK = 1 ; /* #]curglob: */ bool _doecho = FALSE ; bool _nlmap = FALSE ; bool _curini = FALSE ; BYTE _modinp = 0 ; /* set input to Un*x compatability, i.e only char's */ BYTE _csry = 0 ; BYTE _csrx = 0 ; char *cpyrid = "Copyright, R. van't Veen. All rights reserved. 1987" ; overlay "curses" /* put in separate segment */ /* #]globals: */ /* #[miscel: miscellaneous curses functions */ /* #[initscr: initialize the curses package */ initscr() { WORD i,j ; WINDOW *newwin() ; if ( _curini ) { wrefresh(curscr) ; if ( cpyrid == NULL ) Pterm(-12L) ; ERR = 1 ; OK = 0 ; return ; } ; _curini = 1 ; curscr = newwin(0,0,0,0) ; if ( curscr == NULL ) { ERR = 1 ; OK = 0 ; return ; } ; stdscr = newwin(0,0,0,0) ; if ( stdscr == NULL ) { ERR = 1 ; OK = 0 ; return ; } ; Bconout(2,'\033') ; Bconout(2,'E') ; Bconout(2,'\033') ; Bconout(2,'w') ; Bconout(2,'\033') ; Bconout(2,'f') ; _csry = 0 ; _csrx = 0 ; ERR = 0 ; OK = 1 ; } /* #]initscr: */ /* #[endwin: end of curses package */ endwin() { if ( !_curini ) { ERR = 1 ; OK = 0 ; return ; } ; _curini = 0 ; delwin(stdscr) ; delwin(curscr) ; _movcur(LINES,0) ; Bconout(2,'\033') ; Bconout(2,'e') ; ERR = 1 ; OK = 0 ; } /* #]endwin: */ /* #[newwin: create a new window for the user */ WINDOW *newwin(l,c,by,bx) int l,c,bx,by ; { WINDOW *tmp ; WORD i, j, nl, nc ; char *malloc() ; tmp = ( WINDOW * ) malloc(sizeof(WINDOW)) ; if ( tmp == NULL ) { ERR = 1 ; OK = 0 ; return(NULL) ; } ; tmp->_curx = 0 ; tmp->_cury = 0 ; tmp->_clear = 0 ; tmp->_leave = 0 ; tmp->_scroll = 0 ; if ( l == 0 ) nl = LINES - by ; else nl = l ; if ( c == 0 ) nc = COLS - bx ; else nc = c ; if ( nl < 1 || nl > LINES || nc < 1 || nc > COLS ) { free(tmp) ; ERR = 1 ; OK = 0 ; return(NULL) ; } ; tmp->_maxy = nl - 1 ; tmp->_maxx = nc - 1 ; if ( nl == LINES && nc == COLS ) tmp->_flags = _FULLWIN ; else tmp->_flags = 0 ; if ( by < 0 || by >= LINES || bx < 0 || bx >= COLS ) { free(tmp) ; ERR = 1 ; OK = 0 ; return(NULL) ; } ; tmp->_begy = by ; tmp->_begx = bx ; tmp->_y = ( WORD ** ) malloc(sizeof(WORD *)*(tmp->_maxy+1)) ; if ( tmp->_y == NULL ) { free(tmp) ; ERR = 1 ; OK = 0 ; return(NULL) ; } ; tmp->_y[0] = ( WORD * ) malloc(sizeof(WORD)*(tmp->_maxy+1)*(tmp->_maxx+1)) ; if ( tmp->_y[0] == NULL ) { free(tmp->_y) ; free(tmp) ; ERR = 1 ; OK = 0 ; return(NULL) ; } ; for ( i = 1 ; i <= tmp->_maxy ; i++ ) tmp->_y[i] = tmp->_y[0] + i * ( tmp->_maxx + 1 ) ; for ( i = 0 ; i <= tmp->_maxy ; i++ ) { for ( j = 0 ; j <= tmp->_maxx ; j++ ) tmp->_y[i][j] = ' ' ; } ; /* make everything changed on first update of tmp */ touchwin(tmp) ; ERR = 0 ; OK = 1 ; return(tmp) ; } /* #]newwin: */ /* #[delwin: delete a window */ delwin(w) WINDOW *w ; { if ( w == NULL ) { ERR = 1 ; OK = 0 ; return ; } ; if ( w->_flags & _SUBWIN ) free(w->_y) ; else { free(w->_y[0]) ; free(w->_y) ; } ; free(w) ; ERR = 0 ; OK = 1 ; } /* #]delwin: */ /* #[mvwin: move window */ mvwin(w,y,x) WINDOW *w ; int y,x ; { if ( y < 0 || x < 0 || ( y + w->_maxy + 1 ) > LINES || ( x + w->_maxx + 1 ) > COLS ) { ERR = 1 ; OK = 0 ; return ; } ; w->_begy = y ; w->_begx = x ; touchwin(w) ; ERR = 0 ; OK = 1 ; } /* #]mvwin: */ /* #[touchwin: touch a window */ touchwin(w) WINDOW *w ; { WORD i,j ; w->_firstch = w->_y[0] ; w->_lastch = &(w->_y[w->_maxy][w->_maxx]) ; for ( i = 0 ; i <= w->_maxy ; i++ ) for ( j = 0 ; j <= w->_maxx ; j++ ) w->_y[i][j] = w->_y[i][j] | TOUCHED ; ERR = 0 ; OK = 1 ; } /* #]touchwin: */ /* #[subwin: create a sub-window */ WINDOW *subwin(w,l,c,by,bx) WINDOW *w ; int l,c,by,bx ; { WINDOW *tmp ; WORD i, nl, nc ; char *malloc() ; /* cannot take subwindows of curscr */ if ( w == curscr ) { ERR = 1 ; OK = 0 ; return(NULL) ; } ; tmp = ( WINDOW * ) malloc(sizeof(WINDOW)) ; if ( tmp == NULL ) { ERR = 1 ; OK = 0 ; return(NULL) ; } ; tmp->_curx = 0 ; tmp->_cury = 0 ; tmp->_clear = 0 ; tmp->_leave = 0 ; tmp->_scroll = 0 ; if ( l == 0 ) nl = LINES - by ; else nl = l ; if ( c == 0 ) nc = COLS - bx ; else nc = c ; if ( l < 1 || l > (w->_maxy+1) || c < 1 || c > (w->_maxx+1) ) { free(tmp) ; ERR = 1 ; OK = 0 ; return(NULL) ; } ; tmp->_maxy = nl - 1 ; tmp->_maxx = nc - 1 ; if ( nl == LINES && nc == COLS ) tmp->_flags = _FULLWIN | _SUBWIN ; else tmp->_flags = _SUBWIN ; if ( by < w->_begy || by >= (w->_maxy+w->_begy) || bx < w->_begx || bx >= (w->_maxx+w->_begx) ) { free(tmp) ; ERR = 1 ; OK = 0 ; return(NULL) ; } ; tmp->_begy = by ; tmp->_begx = bx ; tmp->_y = ( WORD ** ) malloc(sizeof(WORD *)*(tmp->_maxy+1)) ; if ( tmp->_y == NULL ) { free(tmp) ; ERR = 1 ; OK = 0 ; return(NULL) ; } ; tmp->_y[0] = w->_y[0] + ( tmp->_begy - w->_begy ) * ( w->_maxx + 2 ) + ( tmp->_maxx - w->_maxx ) ; for ( i = 1 ; i <= tmp->_maxy ; i++ ) tmp->_y[i] = tmp->_y[0] + i * ( w->_maxx + 2 ) ; /* make everything changed on first update of tmp */ touchwin(tmp) ; ERR = 0 ; OK = 1 ; return(tmp) ; } /* #]subwin: */ /* #[leaveok: tell curses where to leave the cursor after updating */ leaveok(w,f) WINDOW *w ; bool f ; { w->_leave = f ; ERR = 0 ; OK = 1 ; } /* #]leaveok: */ /* #[scrollok: tell curses it is ok to scroll the window */ scrollok(w,f) WINDOW *w ; bool f ; { w->_scroll = f ; ERR = 0 ; OK = 1 ; } /* #]scrollok: */ /* #[nl: tell curses to map CR to CR,LF */ nl() { _nlmap = 1 ; ERR = 0 ; OK = 1 ; } /* #]nl: */ /* #[nonl: tell curses not to map CR to CR,LF */ nonl() { _nlmap = 0 ; ERR = 0 ; OK = 1 ; } /* #]nonl: */ /* #[longname: return the full name of the terminal */ /* always returns the contents of ttytype in name */ longname(termbuf,name) char *termbuf, *name ; { int i ; for ( i = 0 ; ttytype[i] != '\0' ; i++ ) name[i] = ttytype[i] ; name[i] = '\0' ; } /* #]longname: */ /* #]miscel: */ /* #[output: output functions */ /* #[waddch: add a character to a window */ waddch(w,c) WINDOW *w ; char c ; { WORD i, tpos ; ERR = 0 ; OK = 1 ; if ( c >= 0x20 ) { if ( w == curscr ) { if ( ( w->_flags & _STANDOUT )) { w->_y[w->_cury][w->_curx] = c | STANDOUT | TOUCHED ; Bconout(2,'\033') ; Bconout(2,'p') ; Bconout(5,c) ; Bconout(2,'\033') ; Bconout(2,'q') ; } else { w->_y[w->_cury][w->_curx] = c | TOUCHED ; Bconout(5,c) ; } ; _csrx++ ; } else { if ( (w->_flags & _STANDOUT )) w->_y[w->_cury][w->_curx] = c | STANDOUT | TOUCHED ; else w->_y[w->_cury][w->_curx] = c | TOUCHED ; if ( w->_firstch == 0 ) { w->_firstch = &(w->_y[w->_cury][w->_curx]) ; w->_lastch = w->_firstch ; } else { if ( w->_firstch > &(w->_y[w->_cury][w->_curx]) ) w->_firstch = &(w->_y[w->_cury][w->_curx]) ; else { if ( w->_lastch < &(w->_y[w->_cury][w->_curx]) ) w->_lastch = &(w->_y[w->_cury][w->_curx]) ; } ; } ; } ; wmove(w,w->_cury,w->_curx+1) ; } else if ( c == '\n' ) { wclrtoeol(w) ; if ( _nlmap ) wmove(w,w->_cury+1,0) ; else wmove(w,w->_cury+1,w->_curx) ; } else if ( c == '\r' ) { wmove(w,w->_cury,0) ; } else if ( c == '\t' ) { tpos = ( w->_curx + w->_begx ) % 8 ; tpos = ( tpos == 0 ) ? 8 : tpos ; for ( i = 0 ; i < tpos ; i++ ) waddch(w,' ') ; } else { if ( w == curscr ) { if ( ( w->_flags & _STANDOUT )) { w->_y[w->_cury][w->_curx] = c | STANDOUT | TOUCHED ; Bconout(2,'\033') ; Bconout(2,'p') ; Bconout(5,c) ; Bconout(2,'\033') ; Bconout(2,'q') ; } else { w->_y[w->_cury][w->_curx] = c | TOUCHED ; Bconout(5,c) ; } ; _csrx++ ; } else { if ( (w->_flags & _STANDOUT )) w->_y[w->_cury][w->_curx] = c | STANDOUT | TOUCHED ; else w->_y[w->_cury][w->_curx] = c | TOUCHED ; if ( w->_firstch == 0 ) { w->_firstch = &(w->_y[w->_cury][w->_curx]) ; w->_lastch = w->_firstch ; } else { if ( w->_firstch > &(w->_y[w->_cury][w->_curx]) ) w->_firstch = &(w->_y[w->_cury][w->_curx]) ; else { if ( w->_lastch < &(w->_y[w->_cury][w->_curx]) ) w->_lastch = &(w->_y[w->_cury][w->_curx]) ; } ; } ; } ; wmove(w,w->_cury,w->_curx+1) ; } ; } /* #]waddch: */ /* #[waddstr: add a string of characters to a window */ waddstr(w,s) WINDOW *w ; char *s ; { WORD i ; ERR = 0 ; OK = 1 ; for ( i = 0 ; s[i] != '\0' ; i++ ) waddch(w,s[i]) ; } /* #]waddstr: */ /* #[box: draw a box around a window */ box(w,v,h) WINDOW *w ; char v,h ; { WORD i ; ERR = 0 ; OK = 1 ; for ( i = 0 ; i <= w->_maxy ; i++ ) { mvwaddch(w,i,0,v) ; mvwaddch(w,i,w->_maxx,v) ; } ; for ( i = 1 ; i < w->_maxx ; i++ ) { mvwaddch(w,0,i,h) ; mvwaddch(w,w->_maxy,i,h) ; } ; } /* #]box: */ /* #[wclear: clear a window */ wclear(w) WINDOW *w ; { ERR = 0 ; OK = 1 ; werase(w) ; clearok(w,TRUE) ; w->_curx = 0 ; w->_cury = 0 ; } /* #]wclear: */ /* #[wclrtobo: clear a window to the bottom */ wclrtobot(w) WINDOW *w ; { WORD i,j ; ERR = 0 ; OK = 1 ; for ( i = w->_curx ; i <= w->_maxx ; i++ ) w->_y[w->_cury][i] = ' ' | TOUCHED ; for ( i = w->_cury + 1 ; i <= w->_maxy ; i++ ) { for ( j = 0 ; j <= w->_maxx ; j++ ) w->_y[i][j] = ' ' | TOUCHED ; } ; if ( w == curscr ) { Bconout(2,'\033') ; Bconout(2,'J') ; } else { if ( w->_firstch == 0 ) { w->_firstch = &(w->_y[w->_cury][w->_curx]) ; w->_lastch = &(w->_y[w->_maxy][w->_maxx]) ; } else { if ( w->_firstch > &(w->_y[w->_cury][w->_curx]) ) w->_firstch = &(w->_y[w->_cury][w->_curx]) ; w->_lastch = &(w->_y[w->_maxy][w->_maxx]) ; } ; } ; } /* #]wclrtobo: */ /* #[wclrtoeo: clear a window to the end of the line */ wclrtoeol(w) WINDOW *w ; { WORD i ; ERR = 0 ; OK = 1 ; for ( i = w->_curx ; i <= w->_maxx ; i++ ) w->_y[w->_cury][i] = ' ' | TOUCHED ; if ( w == curscr ) { Bconout(2,'\033') ; Bconout(2,'K') ; } else { if ( w->_firstch == 0 ) { w->_firstch = &(w->_y[w->_cury][w->_curx]) ; w->_lastch = &(w->_y[w->_cury][w->_maxx]) ; } else { if ( w->_firstch > &(w->_y[w->_cury][w->_curx]) ) w->_firstch = &(w->_y[w->_cury][w->_curx]) ; if ( w->_lastch < &(w->_y[w->_cury][w->_maxx]) ) w->_lastch = &(w->_y[w->_cury][w->_maxx]) ; } ; } ; } /* #]wclrtoeo: */ /* #[wdelch: delete a character on a window */ wdelch(w) WINDOW *w ; { WORD ox, oy, i ; ERR = 0 ; OK = 1 ; ox = w->_curx ; oy = w->_cury ; for ( i = ox + 1 ; i <= w->_maxx ; i++ ) { w->_y[oy][i-1] = w->_y[oy][i] | TOUCHED ; } ; w->_y[oy][w->_maxx] = ' ' | TOUCHED ; w->_curx = ox ; w->_cury = oy ; if ( w == curscr ) { Bconout(2,'\033') ; Bconout(2,'K') ; for ( i = w->_curx ; i <= w->_maxx ; i++ ) { Bconout(5,(w->_y[w->_cury][i] & 0xff )) ; _csrx++ ; } ; _movcur(w->_cury,w->_curx) ; } else { if ( w->_firstch == 0 ) { w->_firstch = &(w->_y[w->_cury][w->_curx]) ; w->_lastch = &(w->_y[w->_cury][w->_maxx]) ; } else { if ( w->_firstch > &(w->_y[w->_cury][w->_curx]) ) w->_firstch = w->_y[w->_cury] ; if ( w->_lastch < &(w->_y[w->_cury][w->_maxx]) ) w->_lastch = &(w->_y[w->_cury][w->_maxx]) ; } ; } ; } /* #]wdelch: */ /* #[wdeletel: delete a line from a window */ wdeleteln(w) WINDOW *w ; { WORD i,j ; ERR = 0 ; OK = 1 ; for ( i = w->_cury + 1 ; i <= w->_maxy ; i++ ) { for ( j = 0 ; j <= w->_maxx ; j++ ) w->_y[i-1][j] = w->_y[i][j] | TOUCHED ; } ; for ( j = 0 ; j <= w->_maxx ; j++ ) w->_y[w->_maxy][j] = ' ' | TOUCHED ; if ( w == curscr ) { Bconout(2,'\033') ; Bconout(2,'M') ; _csrx = 0 ; _movcur(w->_cury,w->_curx) ; } else { if ( w->_firstch == 0 ) { w->_firstch = w->_y[w->_cury] ; w->_lastch = &(w->_y[w->_maxy][w->_maxx]) ; } else { if ( w->_firstch > w->_y[w->_cury] ) w->_firstch = w->_y[w->_cury] ; w->_lastch = &(w->_y[w->_maxy][w->_maxx]) ; } ; } ; } /* #]wdeletel: */ /* #[werase: erase a window */ werase(w) WINDOW *w ; { WORD i,j ; ERR = 0 ; OK = 1 ; for ( i = 0 ; i <= w->_maxy ; i++ ) { for ( j = 0 ; j <= w->_maxx ; j++ ) w->_y[i][j] = ' ' | TOUCHED ; } ; if ( w == curscr ) { Bconout(2,'\033') ; Bconout(2,'E') ; _csry = 0 ; _csrx = 0 ; _movcur(curscr->_cury,curscr->_curx) ; } else { w->_firstch = w->_y[0] ; w->_lastch = &(w->_y[w->_maxy][w->_maxx]) ; } ; } /* #]werase: */ /* #[winsch: insert a character */ winsch(w,c) WINDOW *w ; char c ; { WORD ox,oy,i ; BYTE tstr[2] ; ERR = 0 ; OK = 1 ; ox = w->_curx ; oy = w->_cury ; for ( i = w->_maxx - 1 ; i >= ox ; --i ) { w->_y[oy][i+1] = w->_y[oy][i] | TOUCHED ; } ; if ( w == curscr ) { Bconout(2,'\033') ; Bconout(2,'K') ; for ( i = w->_curx ; i <= w->_maxx ; i++ ) { Bconout(5,(w->_y[w->_cury][i] & 0xff )) ; _csrx++ ; } ; _movcur(w->_cury,w->_curx) ; } else { if ( w->_firstch == 0 ) { w->_firstch = &(w->_y[w->_cury][w->_curx]) ; w->_lastch = &(w->_y[w->_cury][w->_maxx]) ; } else { if ( w->_firstch > &(w->_y[w->_cury][w->_curx]) ) w->_firstch = &(w->_y[w->_cury][w->_curx]) ; if ( w->_lastch < &(w->_y[w->_cury][w->_maxx]) ) w->_lastch = &(w->_y[w->_cury][w->_maxx]) ; } ; } ; mvwaddch(w,oy,ox,c) ; } /* #]winsch: */ /* #[winsertl: insert a line in a window */ winsertln(w) WINDOW *w ; { WORD ox,oy,i,j ; ERR = 0 ; OK = 1 ; for ( i = w->_maxy - 1 ; i >= w->_cury ; --i ) { for ( j = 0 ; j <= w->_maxx ; j++ ) w->_y[i+1][j] = w->_y[i][j] | TOUCHED ; } ; for ( j = 0 ; j <= w->_maxx ; j++ ) w->_y[w->_cury][j] = ' ' | TOUCHED ; if ( w == curscr ) { Bconout(2,'\033') ; Bconout(2,'L') ; _csrx = 0 ; _movcur(w->_cury,w->_curx) ; } else { if ( w->_firstch == 0 ) w->_firstch = w->_y[w->_cury] ; else { if ( w->_firstch > w->_y[w->_cury] ) w->_firstch = w->_y[w->_cury] ; } ; w->_lastch = &(w->_y[w->_maxy][w->_maxx]) ; } ; } /* #]winsertl: */ /* #[wmove: move the cursor of the window to a location */ wmove(w,y,x) WINDOW *w ; int y,x ; { WORD i ; ERR = 0 ; OK = 1 ; if ( x < 0 ) { w->_curx = 0 ; ERR = 1 ; OK = 0 ; } else { if ( x > w->_maxx ) { w->_curx = w->_maxx ; ERR = 1 ; OK = 0 ; } else w->_curx = x ; } ; if ( y < 0 ) { w->_cury = 0 ; ERR = 1 ; OK = 0 ; } else { if ( y > w->_maxy ) { if ( w->_scroll ) { for ( i = w->_maxy ; i < y ; i++ ) scroll(w) ; } ; w->_cury = w->_maxy ; ERR = 1 ; OK = 0 ; } else w->_cury = y ; } ; if ( w == curscr ) { _movcur(curscr->_cury,curscr->_curx) ; } ; } /* #]wmove: */ /* #[woverlay: overlay two windows. */ woverlay(v,w) WINDOW *v, *w ; { WORD i, j ; for ( i = 0 ; i <= w->_maxy && i <= v->_maxy ; i++ ) { for ( j = 0 ; j <= w->_maxx && j <= v->_maxx ; j++ ) { if ( ( v->_y[i][j] & 0xff ) == 0x20 ) w->_y[i][j] = v->_y[i][j] | TOUCHED ; } ; } ; if ( w == curscr ) wrefresh(curscr) ; else { w->_firstch = w->_y[0] ; w->_lastch = &(w->_y[w->_maxy][w->_maxx]) ; } ; } /* #]woverlay: */ /* #[overwrit: overwrite two windows. */ overwrite(v,w) WINDOW *v, *w ; { WORD i, j ; for ( i = 0 ; i <= w->_maxy && i <= v->_maxy ; i++ ) { for ( j = 0 ; j <= w->_maxx && j <= v->_maxx ; j++ ) { w->_y[i][j] = v->_y[i][j] | TOUCHED ; } ; } ; if ( w == curscr ) wrefresh(curscr) ; else { w->_firstch = w->_y[0] ; w->_lastch = &(w->_y[w->_maxy][w->_maxx]) ; } ; } /* #]overwrit: */ /* #[wstandou: set the standout flag for a window */ wstandout(w) WINDOW *w ; { w->_flags = w->_flags | _STANDOUT ; ERR = 0 ; OK = 1 ; } /* #]wstandou: */ /* #[wstanden: end standout mode */ wstandend(w) WINDOW *w ; { w->_flags = w->_flags & ( ~_STANDOUT) ; ERR = 0 ; OK = 1 ; } /* #]wstanden: */ /* #]output: */ /* #[input: input functions */ /* #[raw: set terminal in raw mode */ raw() { /* * raw mode means : * when getting a character from the keyboard, return everything * including keyboard shift state. */ int __sshft() ; if ( _modinp == RAW ) return ; Supexec(__sshft) ; _modinp = RAW ; } /* #]raw: */ /* #[noraw: reset terminal from raw mode into cooked mode */ noraw() { int __ushft() ; if ( _modinp != RAW ) return ; Supexec(__ushft) ; _modinp = COOKED ; } /* #]noraw: */ /* #[__sshft: set terminal to return keyboard shift state */ /* execute in supervisor mode only */ __sshft() { int ov, nv ; ov = CONTERM ; nv = ov | 0x08 ; CONTERM = nv ; } /* #]__sshft: */ /* #[__ushft: set terminal to not return keyboard shift state */ /* execute in supervisor mode only */ __ushft() { int ov, nv ; ov = CONTERM ; nv = ov & ~0x08 ; CONTERM = nv ; } /* #]__ushft: */ /* #[crmode: set terminal in cbreak mode */ /* * cbreak mode means for the atari ; * return both keyboard scan code as well as the character value. * kill the process with a process terminate -1 as soons as a control C is met * control D is also recognized to be the EOF. */ crmode() { if ( _modinp == CBREAK ) return ; if ( _modinp == RAW ) noraw() ; _modinp = CBREAK ; } /* #]crmode: */ /* #[nocrmode: reset terminal from cbreak into cooked mode */ nocrmode() { if ( _modinp != CBREAK ) return ; _modinp = COOKED ; } /* #]nocrmode: */ /* #[echo: set curses to echo characters on input */ echo() { _doecho = TRUE ; ERR = 0 ; OK = 1 ; } /* #]echo: */ /* #[noecho: set curses not to echo characters on input */ noecho() { _doecho = FALSE ; ERR = 0 ; OK = 1 ; } /* #]noecho: */ /* #[wgetch: get a character from the terminal */ /* WARNING : wgetch returns a 32-bit value, not a char although only */ /* the lowest 8 bits may actually be transmitted. */ wgetch(w) WINDOW *w ; { bool reset ; LONG retval ; reset = FALSE ; if ( _modinp == COOKED && _doecho == TRUE ) { reset = TRUE ; crmode() ; } ; Bconout(2,'\033') ; Bconout(2,'e') ; switch ( _modinp ) { case COOKED: while ( !Cconis() ) ; retval = Cnecin() ; retval = retval & 0x00ff ; /* kill process on control C */ if ( retval == 0x03 ) Pterm(-1L) ; break ; case CBREAK: while ( !Cconis() ) ; retval = Cnecin() ; /* kill process on control C */ if ( ( retval & 0x00ff ) == 0x03 ) Pterm(-1L) ; break ; case RAW: while ( !Cconis() ) ; retval = Crawcin() ; break ; } ; Bconout(2,'\033') ; Bconout(2,'f') ; if ( _doecho ) waddch(w,(char ) ( 0x00ff & retval )) ; if ( reset ) nocrmode() ; return(retval) ; } /* #]wgetch: */ /* #[wgetstr: get a string from the terminal */ wgetstr(w,s) WINDOW *w ; char *s ; { WORD ox, oy ; bool reset, end ; char c ; int i ; LONG wgetch() ; reset = FALSE ; getyx(w,oy,ox) ; if ( _modinp == COOKED && _doecho == TRUE ) { reset = TRUE ; _doecho = FALSE ; } ; i = 0 ; for ( end = FALSE ; !end ; i++ ) { wrefresh(w); switch ( _modinp ) { case COOKED: c = ( char ) wgetch(w) ; if ( c == 0x0d || c == 0x0a || c == 0x04 || c == 0 ) { s[i] = '\0' ; end = TRUE ; break ; } ; /* receive a backspace */ if ( c == 0x08 ) { if ( i != 0 ) { --i ; s[i] = 0 ; if ( reset ) { int x, y; getyx(w, y, x); mvwaddch(w,y,x-1,' '); wmove(w, y, x-1); /* mvwaddstr(w,oy,ox,s) ; */ } } i--; break; } /* receive control U or line kill */ if ( c == 0x13 ) { i = 0 ; if ( reset ) wmove(w,oy,ox) ; break ; } ; s[i] = c ; if (reset) waddch(w,c) ; break ; case CBREAK: c = ( char ) wgetch(w) ; if ( c == 0x0d || c == 0x0a || c == 0x04 || c == 0 ) { s[i] = '\0' ; end = TRUE ; break ; } ; s[i] = c ; break ; case RAW: c = ( char ) wgetch(w) ; if ( c == 0x0d || c == 0x0a || c == 0x04 || c == 0 ) { s[i] = '\0' ; end = TRUE ; break ; } ; s[i] = c ; break ; } ; } ; if ( reset ) _doecho = TRUE ; } /* #]wgetstr: */ /* #]input: */ /* #[wrefresh: refresh a window on the screen */ wrefresh(w) WINDOW *w ; { WORD i,j,k,l ; WORD c, *ptr ; ERR = 0 ; OK = 1 ; if ( w != curscr && curscr->_clear ) { Bconout(2,'\033') ; Bconout(2,'E') ; _csry = 0 ; _csrx = 0 ; for ( i = 0 ; i < LINES ; i++ ) { for ( j = 0 ; j < COLS ; j++ ) curscr->_y[i][j] = ' ' ; } ; curscr->_clear = 0 ; } ; if ( w->_clear ) { if ( ( w->_flags & _FULLWIN ) ) { Bconout(2,'\033') ; Bconout(2,'E') ; _csry = 0 ; _csrx = 0 ; for ( i = 0 ; i < LINES ; i++ ) { for ( j = 0 ; j < COLS ; j++ ) curscr->_y[i][j] = ' ' ; } ; } ; w->_firstch = w->_y[0] ; w->_lastch = &(w->_y[w->_maxy][w->_maxx]) ; w->_clear = 0 ; } ; if ( w != curscr ) { if ( w->_firstch != 0 ) { if ( w->_flags & _SUBWIN ) { for ( i = 0 ; i <= w->_maxy ; i++ ) { ptr = w->_y[i] ; if ( ptr >= w->_firstch && ptr <= w->_lastch ) { for ( j = 0 ; j <= w->_maxx ; j++ ) { c = ptr[j] ; k = i + w->_begy ; l = j + w->_begx ; if ( ( c & TOUCHED ) && ( k >= 0 && k < LINES && l >= 0 && l < COLS ) ) { ptr[j] = c & ~TOUCHED ; if ( ( curscr->_y[k][l] & 0x01ff ) != ( c & 0x01ff ) ) { curscr->_y[k][l] = c ; _movcur(k,l) ; if ( ( c & STANDOUT ) ) { Bconout(2,'\033') ; Bconout(2,'p') ; Bconout(5,(c & 0xff)) ; Bconout(2,'\033') ; Bconout(2,'q') ; } else { Bconout(5,( c & 0xff )) ; } ; _csry = k ; _csrx = l + 1 ; } ; } ; } ; } ; } ; } else { for ( ptr = w->_firstch ; ptr <= w->_lastch ; ptr++ ) { c = *ptr ; if ( c & TOUCHED ) { k = ( WORD ) ( ptr - w->_y[0] ) ; k = k / ( w->_maxx + 1 ) ; l = ( WORD ) ( ptr - w->_y[k] ) + w->_begx ; k = k + w->_begy ; if ( k >= 0 && k < LINES && l >= 0 && l < COLS ) { *ptr = c & ~TOUCHED ; if ( ( curscr->_y[k][l] & 0x01ff ) != ( c & 0x01ff ) ) { curscr->_y[k][l] = c ; _movcur(k,l) ; if ( ( c & STANDOUT ) ) { Bconout(2,'\033') ; Bconout(2,'p') ; Bconout(5,(c & 0xff)) ; Bconout(2,'\033') ; Bconout(2,'q') ; } else { Bconout(5,( c & 0xff )) ; } ; _csry = k ; _csrx = l + 1 ; } ; } ; } ; } ; } ; w->_firstch = 0 ; w->_lastch = 0 ; if ( w->_leave ) { w->_curx = _csrx - w->_begx ; w->_cury = _csry - w->_begy ; curscr->_cury = _csry ; curscr->_curx = _csrx ; } else { curscr->_cury = w->_cury + w->_begy ; curscr->_curx = w->_curx + w->_begx ; _movcur(curscr->_cury, curscr->_curx) ; } ; } else { curscr->_cury = w->_cury + w->_begy ; curscr->_curx = w->_curx + w->_begx ; _movcur(curscr->_cury, curscr->_curx) ; } ; } else { Bconout(2,'\033') ; Bconout(2,'H') ; _csry = 0 ; _csrx = 0 ; for ( i = 0 ; i < LINES ; i++ ) { for ( j = 0 ; j < COLS ; j++ ) { c = w->_y[i][j] ; if ( ( c & STANDOUT ) ) { Bconout(2,'\033') ; Bconout(2,'p') ; Bconout(5,(c & 0xff)) ; Bconout(2,'\033') ; Bconout(2,'q') ; } else { Bconout(5,(c & 0xff)) ; } ; _csrx++ ; } ; _movcur(i+1,0) ; } ; _movcur( curscr->_cury, curscr->_curx) ; } ; } /* #]wrefresh: */ /* #[detail: detail functions of curses */ /* #[mvcur: move cursor in standard curses manner */ mvcur(ly,lx,ny,nx) int ly,lx,ny,nx ; { _movcur((WORD) ny,( WORD) nx) ; } /* #]mvcur: */ /* #[_movcur: move cursor */ _movcur(y,x) WORD y,x ; { if ( _csry == y && _csrx == x ) return ; Bconout(2,'\033') ; Bconout(2,'Y') ; Bconout(2,y+' ') ; Bconout(2,x+' ') ; _csry = y ; _csrx = x ; } /* #]_movcur: */ /* #[scroll: scroll a window upward one line */ scroll(w) WINDOW *w ; { WORD i,j ; ERR = 0 ; OK = 1 ; for ( i = 0 ; i < w->_maxy ; i++ ) for ( j = 0 ; j <= w->_maxx ; j++ ) w->_y[i][j] = w->_y[i+1][j] ; for ( i = 0 ; i <= w->_maxx ; i++ ) w->_y[w->_maxy][i] = ' ' ; if ( w == curscr ) wrefresh(curscr) ; else { w->_firstch = w->_y[0] ; w->_lastch = &(w->_y[w->_maxy][w->_maxx]) ; } ; } /* #]scroll: */ /* #]detail: */ /* #]curses: */ /* * Extra stuff added - tony */ printw(format, a1, a2, a3, a4, a5, a6, a7, a8, a9) char *format; int a1, a2, a3, a4, a5, a6, a7, a8, a9; { char lbuf[256]; sprintf(lbuf, format, a1, a2, a3, a4, a5, a6, a7, a8, a9); addstr(lbuf); } scanw(format, a1, a2, a3, a4, a5, a6, a7, a8, a9) char *format; int a1, a2, a3, a4, a5, a6, a7, a8, a9; { char lbuf[256]; echo(); getstr(lbuf); sscanf(lbuf, format, a1, a2, a3, a4, a5, a6, a7, a8, a9); } HE_HATES_THESE_CANS fi # end of overwriting check # End of shell archive exit 0