bl@infovax.UUCP (Bj|rn Larsson) (08/27/87)
# This is a shar archive. # Remove everything above this line. # Run the file through sh, not csh. # (type `sh pccurses.sh.2') echo extracting - curses.cmd sed 's/^X//' > curses.cmd << 'FRIDAY_NIGHT' Xtmp Xy Xattrib.obj & X+beep.obj & X+boxes.obj & X+charadd.obj & X+chardel.obj & X+charget.obj & X+charins.obj & X+charpick.obj & X+clrtobot.obj & X+clrtoeol.obj & X+cursesio.obj & X+endwin.obj & X+initscr.obj & X+linedel.obj & X+lineins.obj & X+longname.obj & X+move.obj & X+mvcursor & X+newwin.obj & X+options.obj & X+overlay.obj & X+prntscan.obj & X+refresh.obj & X+scrreg.obj & X+setterm.obj & X+stradd.obj & X+strget.obj & X+tabsize.obj & X+termmisc.obj & X+unctrl.obj & X+update.obj & X+winclear.obj & X+windel.obj & X+winerase.obj & X+winmove.obj & X+winscrol.obj & X+wintouch.obj Xnul FRIDAY_NIGHT echo extracting - curses.h sed 's/^X//' > curses.h << 'FRIDAY_NIGHT' X/****************************************************************/ X/* CURSES.H */ X/* Header file for definitions and declarations for the */ X/* PCcurses package. This should be #include'd in all user */ X/* programs. */ X/****************************************************************/ X/* This version of curses is based on ncurses, a curses version */ X/* originally written by Pavel Curtis at Cornell University. */ X/* I have made substantial changes to make it run on IBM PC's, */ X/* and therefore consider myself free to make it public domain. */ X/* Bjorn Larsson (...mcvax!enea!infovax!bl) */ X/****************************************************************/ X/* 1.0: Release: 870515 */ X/****************************************************************/ X X/* general definitions */ X X#define TRUE 1 /* booleans */ X#define FALSE 0 X#define ERR 1 /* general error flag */ X#define OK 0 /* general OK flag */ X X/* functions defined as macros */ X X#define getch() wgetch(stdscr) /* using macroes allows you to use */ X#define ungetch(c) wungetch(c) /* #undef getch/ungetch in your */ X /* programs to use MSC getch() and */ X /* ungetch() routines */ X X#define getyx(win,y,x) (y = (win)->_cury, x = (win)->_curx) X X#ifndef max X#define max(a,b) (((a) > (b)) ? (a) : (b)) X#endif X#ifndef min X#define min(a,b) (((a) < (b)) ? (a) : (b)) X#endif X X/* video attribute definitions */ X X#define A_ALTCHARSET 0 X#define A_BLINK 0x100 X#define A_BLANK 0x200 X#define A_BOLD 0x400 X#define A_DIM 0 X#define A_PROTECT 0 X#define A_REVERSE 0x800 X#define A_STANDOUT 0x1000 X#define A_UNDERLINE 0x2000 X X/* function and keypad key definitions */ X X#define KEY_BREAK 0x101 /* Not on PC */ X#define KEY_DOWN 0x102 /* The four arrow keys */ X#define KEY_UP 0x103 X#define KEY_LEFT 0x104 X#define KEY_RIGHT 0x105 X#define KEY_HOME 0x106 /* Home key (upward+left arrow) */ X#define KEY_BACKSPACE 0x107 /* Not on PC */ X#define KEY_F0 0x108 /* Function keys. Space for */ X#define KEY_F(n) (KEY_F0+(n)) /* 64 keys is reserved. */ X#define KEY_DL 0x148 /* Not on PC */ X#define KEY_IL 0x149 /* Insert line */ X#define KEY_DC 0x14a /* Delete character */ X#define KEY_IC 0x14b /* Insert char or enter insert mode */ X#define KEY_EIC 0x14c /* Exit insert char mode */ X#define KEY_CLEAR 0x14d /* Clear screen */ X#define KEY_EOS 0x14e /* Clear to end of screen */ X#define KEY_EOL 0x14f /* Clear to end of line */ X#define KEY_SF 0x150 /* Scroll 1 line forward */ X#define KEY_SR 0x151 /* Scroll 1 line backwards (reverse) */ X#define KEY_NPAGE 0x152 /* Next page */ X#define KEY_PPAGE 0x153 /* Previous page */ X#define KEY_STAB 0x154 /* Set tab */ X#define KEY_CTAB 0x155 /* Clear tab */ X#define KEY_CATAB 0x156 /* Clear all tabs */ X#define KEY_ENTER 0x157 /* Enter or send (unreliable) */ X#define KEY_SRESET 0x158 /* soft (partial) reset (unreliable) */ X#define KEY_RESET 0x159 /* reset or hard reset (unreliable) */ X#define KEY_PRINT 0x15a /* print or copy */ X#define KEY_LL 0x15b /* home down or bottom (lower left) */ X#define KEY_ABORT 0x15c /* Abort/Terminate key (any) */ X#define KEY_SHELP 0x15d /* Short help */ X#define KEY_LHELP 0x15e /* Long help */ X X/* type declarations */ X Xtypedef char bool; /* boolean type */ X Xtypedef struct X { X int _cury; /* current pseudo-cursor */ X int _curx; X int _maxy; /* max coordinates */ X int _maxx; X int _begy; /* origin on screen */ X int _begx; X int _flags; /* window properties */ X int _attrs; /* attributes of written characters */ X int _tabsize; /* tab character size */ X bool _clear; /* causes clear at next refresh */ X bool _leave; /* leaves cursor as it happens */ X bool _scroll; /* allows window scrolling */ X bool _nodelay; /* input character wait flag */ X bool _keypad; /* flags keypad key mode active */ X int **_line; /* pointer to line pointer array */ X int *_minchng; /* First changed character in line */ X int *_maxchng; /* Last changed character in line */ X int _regtop; /* Top/bottom of scrolling region */ X int _regbottom; X } WINDOW; X X/* External variables */ X Xextern int LINES; /* terminal height */ Xextern int COLS; /* terminal width */ Xextern WINDOW *curscr; /* the current screen image */ Xextern WINDOW *stdscr; /* the default screen window */ X X/* PCcurses function declarations */ X Xextern int addch(); /* put char in stdscr */ Xextern int addstr(); /* put string in stdscr */ Xextern void attrset(); /* set stdscr char attributes */ Xextern void attroff(); /* clear attribute(a) stdscr */ Xextern void attron(); /* add attribute(s) stdscr */ Xextern int baudrate(); /* compatibility dummy */ Xextern void beep(); /* sound bell */ Xextern void box(); /* draw a box around a window */ Xextern void cbreak(); /* set terminal cbreak mode */ Xextern void clear(); /* clear stdscr */ Xextern void clearok(); /* marks a window for screen clear */ Xextern int clrtobot(); /* clear end of stdscr */ Xextern int clrtoeol(); /* clear end of line in stdscr */ Xextern void crmode(); /* set terminal cbreak mode */ Xextern void cursoff(); /* turns off hardware cursor */ Xextern void curson(); /* turns on hardware cursor */ Xextern int delch(); /* delete a char in stdscr */ Xextern int deleteln(); /* delete a line in stdscr */ Xextern void delwin(); /* delete a window or a subwindow */ Xextern void doupdate(); /* update physical screen */ Xextern void echo(); /* set terminal echo mode */ Xextern int endwin(); /* cleanup and finitialization */ Xextern void erase(); /* erase stdscr */ Xextern int erasechar(); /* return char kill character */ Xextern int fixterm(); /* compatibility dummy */ Xextern void flash(); /* flash terminal screen */ Xextern void flushinp(); /* kill pending keyboard input */ Xextern int getstr(); /* get string to stdscr and buffer */ Xextern int gettmode(); /* compatibility dummy */ Xextern void idlok(); /* use ins/del line (dummy) */ Xextern int initscr(); /* curses initialization */ Xextern int inch(); /* get char at stdscr cursor */ Xextern int insch(); /* insert character in stdscr */ Xextern int insertln(); /* insert new line in stdscr */ Xextern void keypad(); /* marks a window for keypad usage */ Xextern int killchar(); /* return line kill character */ Xextern char *longname(); /* terminal description */ Xextern void leaveok(); /* marks window for cursor 'leave' */ Xextern void meta(); /* marks window for meta (dummy) */ Xextern int move(); /* move cursor in stdscr */ Xextern int mvaddch(); /* move & put char in stdscr */ Xextern int mvaddstr(); /* move & put string in stdscr */ Xextern int mvclrtobot(); /* move & clear end of stdscr */ Xextern int mvclrtoeol(); /* move & clear lineend in stdscr */ Xextern int mvcur(); /* move terminal cursor */ Xextern int mvdelch(); /* move & delete a char in stdscr */ Xextern int mvdeleteln(); /* move & delete a line in stdscr */ Xextern int mvgetch(); /* move & get char to stdscr */ Xextern int mvgetstr(); /* move & get string to stdscr */ Xextern int mvinch(); /* move & get char at stdscr cursor */ Xextern int mvinsch(); /* move & insert char in stdscr */ Xextern int mvinsertln(); /* move & insert new line in stdscr */ Xextern int mvprintw(); /* move & print string in stdscr */ Xextern int mvscanw(); /* move & get values via stdscr */ Xextern int mvwaddch(); /* move & put char in a window */ Xextern int mvwaddstr(); /* move & put string in a window */ Xextern int mvwclrtobot(); /* move & clear end of a window */ Xextern int mvwclrtoeol(); /* move & clear lineend in a window */ Xextern int mvwdelch(); /* move & delete a char in a window */ Xextern int mvwdeleteln(); /* move & delete a line in a window */ Xextern int mvwgetch(); /* move & get char to a window */ Xextern int mvwgetstr(); /* move & get string to a window */ Xextern int mvwinch(); /* move & get char at window cursor */ Xextern int mvwinsch(); /* move & insert char in a window */ Xextern int mvwinsertln(); /* move & insert new line in window */ Xextern int mvwin(); /* move window */ Xextern int mvwprintw(); /* move & print string in a window */ Xextern int mvwscanw(); /* move & get values via a window */ Xextern WINDOW *newwin(); /* create a window */ Xextern void nl(); /* set terminal cr-crlf map mode */ Xextern void nocbreak(); /* unset terminal cbreak mode */ Xextern void nocrmode(); /* unset terminal cbreak mode */ Xextern void nodelay(); /* marks window for no input wait */ Xextern void noecho(); /* unset terminal echo mode */ Xextern void nonl(); /* unset terminal cr-crlf map mode */ Xextern void noraw(); /* unset raw terminal mode */ Xextern void overlay(); /* overlay one window on another */ Xextern void overwrite(); /* overwrite one window on another */ Xextern int printw(); /* print string in stdscr */ Xextern void raw(); /* set raw terminal mode */ Xextern void refrbrk(); /* set screen refresh break mode */ Xextern void refresh(); /* refresh stdscr */ Xextern int resetterm(); /* compatibility dummy */ Xextern int resetty(); /* restore terminal I/O modes */ Xextern int saveoldterm(); /* compatibility dummy */ Xextern int saveterm(); /* compatibility dummy */ Xextern int savetty(); /* save terminal I/O modes */ Xextern int scanw(); /* get values via stdscr */ Xextern void scroll(); /* scroll region in a window */ Xextern void scrollok(); /* marks a window to allow scroll */ Xextern int setsrcreg(); /* define stdscr's scroll region */ Xextern int setterm(); /* compatibility dummy */ Xextern int setupterm(); /* set up terminal (no-op) */ Xextern void standend(); /* start normal chars in stdscr */ Xextern void standout(); /* start standout chars in stdscr */ Xextern WINDOW *subwin(); /* create a sub-window */ Xextern int tabsize(); /* set/get tabsize of stdscr */ Xextern void touchwin(); /* mark a window as modified */ Xextern char *unctrl(); /* char-to-string converter */ Xextern int waddch(); /* put char in a window */ Xextern int waddstr(); /* put string in a window */ Xextern void wattroff(); /* clear attribute(a) in window */ Xextern void wattron(); /* add attribute(s) in window */ Xextern void wattrset(); /* set window char attributes */ Xextern int wbox(); /* draw a box inside a window */ Xextern void wclear(); /* clear a window */ Xextern int wclrtobot(); /* clear end of a window */ Xextern int wclrtoeol(); /* clear end of line in a window */ Xextern int wdelch(); /* delete a char in a window */ Xextern int wdeleteln(); /* delete a line in a window */ Xextern void werase(); /* erase a window */ Xextern int wgetch(); /* get char to a window */ Xextern int wgetstr(); /* get string to window and buffer */ Xextern int winch(); /* get char at window cursor */ Xextern int winsch(); /* insert character in a window */ Xextern int winsertln(); /* insert new line in a window */ Xextern int wmove(); /* move cursor in a window */ Xextern void wnoutrefresh(); /* create screen image, w/o display */ Xextern int wprintw(); /* print string in a window */ Xextern void wrefresh(); /* refresh screen */ Xextern int wscanw(); /* get values via a window */ Xextern int wsetsrcreg(); /* define a window's scroll region */ Xextern void wstandend(); /* start normal chars in window */ Xextern void wstandout(); /* start standout chars in window */ Xextern int wtabsize(); /* set/get tabsize of a window */ Xextern int wungetch(); /* character push-back */ FRIDAY_NIGHT echo extracting - curses.man sed 's/^X//' > curses.man << 'FRIDAY_NIGHT' XCURSES(3) MS-DOS Programmer's Manual CURSES(3) X XNAME X curses - screen/window management library X XDESCRIPTION X Curses is a library of screen and window management routines. It is modeled X after the UNIX curses and ncurses libraries. Normally, programs written for X curses should be easily ported to UNIX, and vice versa. X X To use the routines, the function initscr() must first be called. This cre- X ates two 'windows' for the user: stdscr and curscr. Stdscr is the default X window for the user to make changes on, and curscr reflects the current X contents of the physical display screen. The user writes or edits the std- X scr window to his liking, then calls the refresh() function to make curscr X and the physical screen look like stdscr. When the user program terminates, X it should call the endwin() function to restore things to normal. X X There are all sorts of window manipulation routines available to the pro- X grammer: auxiliary windows may be created, edited, moved and deleted. The X terminal may be set in many different modes, output text may be attributed X with blink, blank, bold and reverse attributes. There are window-specific X printf- and scanf-like routines, routines for scrolling, bow-drawing, win- X dow overlaying, clearing routines etc. Curses also handles terminal func- X tion keys, which is enables by calling the keypad() function. X X For more and detailed information, see the library source codes. All curses X functions are preceded by a complete description. X XCOMPILING X All programs that use curses facilities should include the file <curses.h>, X and during linking, the library ?curses.lib should be specified to the lin- X ker ('?' is 's', 'c' 'm' or 'l' for small, compact, medium or large memory X model respectively). X XFUNCTIONS X Below is a list over the available functions, together with a brief de- X scription of what they do. In general, functions whose names start with X 'w' differ from the one without 'w' (like wmove vs. move) signify that X a specific window is used. Without a 'w', sdtscr is implied. The functions X that start with 'mv' before the 'genereic' function name signify that a X cursor motion should be made before the actual work. 'mv' and 'w' combine X as expected. X X Most routines that return an int will return the manifest constant ERR if X there is a failure during execution. Routines that return a char actually X return an int, so that ERR does not conflict with the character code 0xff. X All IBM PC characters from 0 to 0xff are allowed for usage with curses. X X Some routines, like {mv}{w} printw() and {mv}{w}scanw() return a meaningful X positive value if the operation is successful. X X The curses package uses some predefined types, variables and manifest con- X stants that are also available to the programmer. There are also a few X globally accessible variables that should not be touched by the applica- X tion program. Those untouchable variables have names starting with an X underscore (_) to avoid conflicts. The user-accessible types, variables X and constants are (there are a number of other constants defining charac- X ter attribute names and function key names - consult <curses.h> for de- X tails): X X (manifest constants) X X TRUE boolean true X FALSE boolean false X ERR unsuccessfull operation X OK successfull operation X X (types) X X WINDOW a window structure type X bool boolean flag type X X (variables) X X WINDOW curscr physical display image X WINDOW stdscr default user drawing board X int LINES terminal height X int COLS terminal width X X The following is an alphabetical list of the curses functions, together X with their types, parameters and a short comment for each (win is a win- X dow, ch, vc, hc are characters, buf is a character buffer, attrs is an X attribute bit map, bf is a boolean flag. Note that `characters' in this X context usually can have 16 bits): X X X int addch(ch) put char in stdscr X int addstr(str) put string in stdscr X void attroff(attrs) clear attribute(s) in stdscr X void attron(attrs) add attribute(s) in stdscr X void attrset(attrs) set stdscr char attributes X int baudrate() dummy for compatibility X void beep() ring the bell X void box(win,vc,hc) box in a window, with given characters X void cbreak() set terminal cbreak mode X void clear() clear stdscr X void clearok(win,bf) marks window for screen clear X int clrtobot() clear end of stdscr X int clrtoeol() clear end of line in stdscr X void crmode() set terminal cbreak mode X void cursoff() turns off hardware cursor X void curson() turns on hardware cursor X int delch() delete a char in stdscr X int deleteln() delete a line in stdscr X void delwin(win) delete a window or a subwindow X void doupdate() update physical screen X void echo() set terminal echo mode X int endwin() cleanup and curses finitialization X void erase() erase stdscr X int erasechar() return char delete character X int fixterm() dummy for compatibility X void flash() flash terminal screen X void flushinp() kill pending keyboard input X int getch() (#def macro) get character via stdscr X int getstr(buf) get string via stdscr to a buffer X void getyx(win,y,x) get a window's cursor position X int gettmode() dummy for compatibility X void idlok(win,bf) dummy for compatibility X int initscr() curses initialization (ret 1 if OK) X int inch() get char at stdscr cursor X int insch(ch) insert character in stdscr X int insertln() insert an empty line in stdscr X void keypad(win,bf) marks a window for keypad usage X int killchar() return line delete character X char *longname() returns terminal description string X void leaveok(win,bf) marks window for cursor 'update leave' X void meta(win,bf) marks window for meta (dummy function) X int move(y,x) move cursor in stdscr X int mvaddch(y,x,ch) move & put char in stdscr X int mvaddstr(y,x,str) move & put string in stdscr X int mvclrtobot(y,x) move & clear end of stdscr X int mvclrtoeol(y,x) move & clear lineend in stdscr X int mvcur(oldy,oldx,y,x) move terminal cursor to <y,x> X int mvdelch(y,x) move & delete a char in stdscr X int mvdeleteln(y,x) move & delete a line in stdscr X int mvgetch(y,x) move & get char to stdscr X int mvgetstr(y,x,buf) move & get string via stdscr to buffer X int mvinch(y,x,) move & get char at stdscr cursor X int mvinsch(y,x,ch) move & insert char in stdscr X int mvinsertln(y,x) move & insert new line in stdscr X int mvprintw(y,x,fmt,args) move & print string in stdscr X int mvscanw(y,x,fmt,args) move & get values via stdscr X int mvwaddch(win,y,x,ch) move & put char in a window X int mvwaddstr(win,y,x,str) move & put string in a window X int mvwclrtobot(win,y,x) move & clear end of a window X int mvwclrtoeol(win,y,x) move & clear lineend in a window X int mvwdelch(win,y,x) move & delete a char in a window X int mvwdeleteln(win,y,x) move & delete a line in a window X int mvwgetch(win,y,x) move & get char to a window X int mvwgetstr(win,y,x,str) move & get string to a window X int mvwinch(win,y,x) move & get char at window cursor X int mvwinsch(win,y,x,ch) move & insert char in a window X int mvwinsertln(win,y,x) move & insert new line in window X int mvwin(win,y,x) move window on physical screen X int mvwprintw(win,x,y,fmt,args) move & print string in a window X int mvwscanw(win,y,x,fmt,args) move & get values via a window X WINDOW *newwin(lines,cols,begy,begx) create a new window X void nl() set terminal cr-crlf mapping mode X void nocbreak() unset terminal cbreak mod X void nocrmode() unset terminal cbreak mode X void nodelay(win,bf) marks window for no input wait X void noecho() unset terminal echo mode X void nonl() unset terminal cr-crlf mapping mode X void noraw() unset raw terminal mode X void overlay(win1,win2) overlay one window on another X void overwrite(win1,win2) overwrite one window on another X int printw(fmt,args) print string in stdscr X void raw() set raw terminal mode X void refrbrk(bf) set screen update break mode X void refresh() refresh stdscr X int resetterm() dummy for compatibility X int resetty() restore terminal I/O modes X int saveoldterm() dummy for compatibility X int saveterm() dummy for compatibility X int savetty() save terminal I/O modes X int scanw(fmt,args) get values via stdscr X void scroll(win) scroll scrolling region of a window X void scrollok(win,bf) marks a window to allow scroll X int setsrcreg(miny,maxy) define stdscr's scroll region X int setterm() dummy for compatibility X int setupterm(term,fd,errret) set up terminal (no-op on PC) X void standend() start normal chars in stdscr X void standout() start standout chars in stdscr X WINDOW *subwin(win,lines,cols,begy,begx) create a sub-window in window win X int tabsize(ts) set/get tabsize of stdscr X void touchwin(win) mark a window as totally modified X char *unctrl(ch) char-to-string converter X int ungetch(ch) (#def macro) push back a character to input */ X int waddch(win,ch) put char in a window X int waddstr(win,str) put string in a window X void wattroff(win,attrs) clear attribute(s) in window X void wattron(win,attrs) add attribute(s) in window X void wattrset(win,attrs) set window char attributes X int wbox(win,miny,minx,maxy,maxx,vc,hc) draw a box inside a window X void wclear(win) clear a window X int wclrtobot(win) clear end of a window X int wclrtoeol(win) clear end of line in a window X int wdelch(win) delete a char in a window X int wdeleteln(win) delete a line in a window X void werase(win) erase a window X int wgetch(win) get char via a window X int wgetstr(win,buf) get string via window to a buffer X int winch(win) get char at window cursor X int winsch(win,ch) insert character in a window X int winsertln(win) insert new line in a window X int wmove(win,y,x) move cursor in a window X void wnoutrefresh(win) create internal screen image X int wprintw(win,fmt,args) print string in a window X void wrefresh(win) refresh window X int wscanw(win,fmt,args) get values via a window X int wsetsrcreg(win,miny,maxy) define a window's scrolling region X void wstandend(win) start normal chars in window X void wstandout(win) start standout chars in window X int wtabsize(win,ts) set/get tabsize of a window X int wungetch(ch) push back a character to input */ X XSEE ALSO X Screen Updating And Cursor Movement Optimization: A Library Package - X Kenneth C.R.C. Arnold X The Ncurses Reference Manual - Pavel Curtis, Cornell University X XBUGS X The terminal raw I/O mode is implemented by reading characters directly X from the BIOS. This means that the programmer must not use the normal X I/O routines to the screen or from the keyboard, since they will trap the X MS-DOS ^C, ^S, ^Q and ^P characters and thus nullify the raw input. X X Also, if the terminal is in normal or cbreak mode and the programmer has X trapped CTRL-BREAK by using signal(SIGINT,ownhandler), MS-DOS will still X echo the characters '^C' on the screen when the character is intercepted. X There seems to be no way to avoid this under MS-DOS (use raw mode in- X stead). X X The function keys are hardware dependent. There is a table in charget.c X that maps keyboard scan codes from the keyboard to function key names. X The one supplied works for IBM PC/XT/AT, and for most clones. FRIDAY_NIGHT echo extracting - cursesio.asm sed 's/^X//' > cursesio.asm << 'FRIDAY_NIGHT' X TITLE PCcurses BIOS Control Functions for MicroSoft 'C' v.4.0 X NAME CURSESIO X PAGE 46,132 X ;**************************************************************** X ;* CURSESIO.ASM * X ;* * X ;* This file contains 'C' functions for the MicroSoft 'C' com- * X ;* piler v.4.0. It exercises a number of BIOS video calls, and * X ;* is intended for inclusion in a curses library package. * X ;* * X ;* The two files FARNEAR.INC and SMALHUGE.INC each contain one * X ;* EQUate. These define the module's memory model. * X ;* * X ;**************************************************************** X ;* This version of curses is based on ncurses, a curses version * X ;* originally written by Pavel Curtis at Cornell University. * X ;* I have made substantial changes to make it run on IBM PC's, * X ;* and therefore consider myself free to make it public domain. * X ;* Bjorn Larsson (...mcvax!enea!infovax!bl) * X ;**************************************************************** X ;* Author: Bjorn Larsson * X ;* Revised: * X ;* 1.0: Release: 870515 * X ;**************************************************************** X ; X INCLUDE FARNEAR.INC ;DEFINE FAR OR NEAR CALL SEQUENCE X INCLUDE SMALHUGE.INC ;DEFINE FAR OR NEAR DATA ACCESS X ; XSYSTEM EQU 21H ;SYSTEM CALL XBRKCHK EQU 33H ;BREAK SET/CHECK FUNCTION CODE X ; X_TEXT SEGMENT BYTE PUBLIC 'CODE' X ASSUME CS: _TEXT X ; X ;**************************************************************** X ;* Function entry and exit macros, and parameter fetch macro. * X ;* Used by all functions. * X ;**************************************************************** X ; Xc_entry MACRO f_name X ; X if far_call X&f_name proc far X else X&f_name proc near X endif X push bp X mov bp,sp X push di X push si X ; X ENDM X ; Xc_exit MACRO f_name X ; X pop si X pop di X pop bp X ret X&f_name endp X ; X ENDM X ; Xg_parm MACRO reg,p_num X if far_call X mov ®,[bp+&p_num*2+4] X else X mov ®,[bp+&p_num*2+2] X endif X ; X ENDM X ; X PAGE X ;**************************************************************** X ;* _cursesocattr * X ;* * X ;* void _cursescattr(chr,attr) * X ;* * X ;* Writes char 'chr' with attributes 'attr' to the current cur- * X ;* sor location. * X ;**************************************************************** X PUBLIC __cursescattr X ; X c_entry __cursescattr X MOV AH,9 X MOV BH,0 ;USE PAGE 0 X g_parm AL,2 ;GET CHR PARAMETER X g_parm BL,3 ;GET ATTR PARAMETER X MOV CX,1 ;PUT 1 CHARACTER X INT 10H X c_exit __cursescattr X ; X ;**************************************************************** X ;* _cursescursor * X ;* * X ;* void _cursescursor(row,column) * X ;* * X ;* Sets the cursor position in video page 0. 'row' and 'column' * X ;* are the cursor address. If 'row' is set to 25, no cursor at * X ;* all is displayed. * X ;**************************************************************** X PUBLIC __cursescursor X ; X c_entry __cursescursor X MOV AH,2 X MOV BH,0 ;USE PAGE 0 X g_parm DH,2 ;GET ROW PARAMETER X g_parm DL,3 ;GET COLUMN PARAMETER X INT 10H X c_exit __cursescursor X ; X ;**************************************************************** X ;* _cursesgcols * X ;* * X ;* int _cursesgcols() * X ;* * X ;* Return the current number of columns on the screen. * X ;**************************************************************** X PUBLIC __cursesgcols X ; X c_entry __cursesgcols X MOV AH,15 X INT 10H X MOV AL,AH X XOR AH,AH X c_exit __cursesgcols X ; X ;**************************************************************** X ;* _cursesputc * X ;* * X ;* void _cursesputc(chr,colour) * X ;* * X ;* Output character 'chr' to screen in tty fashion. If a colour * X ;* mode is active, the character is written with colour * X ;* 'colour'. * X ;**************************************************************** X PUBLIC __cursesputc X ; X c_entry __cursesputc X MOV AH,14 X g_parm AL,1 ;GET CHR PARAMETER X g_parm BL,2 ;GET COLOUR PARAMETER X INT 10H X c_exit __cursesputc X ; X ;**************************************************************** X ;* _cursesscroll * X ;* * X ;* void _cursesscroll(urow,lcol,lrow,rcol,lines,attr) * X ;* * X ;* Scroll a window in the current page up or down. Urow, lcol, * X ;* lrow,rcol are the window coordinats. lines is the number of * X ;* lines to scroll. If 0, clears the window, if < 0 scrolls * X ;* down, > 0 scrolls up. Blanks areas that are left, and sets * X ;* character attributes to attr. If in a colour graphics mode, * X ;* fills them with the colour 'attr' instead. * X ;**************************************************************** X PUBLIC __cursesscroll X ; X c_entry __cursesscroll X g_parm AL,5 ;GET LINES PARAMETER X MOV AH,6 X TEST AL,80H X JZ SHORT CS_1 X ; X MOV AH,7 X NEG AL X ; XCS_1: g_parm CH,1 ;GET UROW PARAMETER X g_parm CL,2 ;GET LCOL PARAMETER X g_parm DH,3 ;GET LROW PARAMETER X g_parm DL,4 ;GET RCOL PARAMETER X g_parm BH,6 ;GET ATTR PARAMETER X INT 10H X c_exit __cursesscroll X ; X ;**************************************************************** X ;* _cursesgcmode * X ;* * X ;* int _cursesgcmode() * X ;* * X ;* Return the current cursor type. Bits 8-15 of the return * X ;* value is the start scan row, and bits 0-7 is the end scan * X ;* row. * X ;**************************************************************** X PUBLIC __cursesgcmode X ; X c_entry __cursesgcmode X MOV AH,3 X INT 10H X MOV AX,CX X c_exit __cursesgcmode X ; X ;**************************************************************** X ;* _cursescmode * X ;* * X ;* void _cursescmode(startrow,endrow) * X ;* * X ;* Sets the cursor type to begin in scan line startrow and end * X ;* in scan line endrow. Both values should be 0-31. * X ;**************************************************************** X PUBLIC __cursescmode X ; X c_entry __cursescmode X MOV AH,1 X g_parm CH,1 ;GET STARTROW PARAMETER X g_parm CL,2 ;GET ENDROW PARAMETER X INT 10H X c_exit __cursescmode X ; X ;**************************************************************** X ;* _curseskey * X ;* * X ;* int _curseskey() * X ;* * X ;* Returns the next key code struck at the keyboard. If the low * X ;* 8 bits are non-0, the uper bits contain the extended cha- * X ;* racter code. If bit 0-7 are non-zero, the upper bits = 0. * X ;**************************************************************** X PUBLIC __curseskey X ; X c_entry __curseskey X MOV AH,0 X INT 16H X CMP AL,0 X JZ SHORT EXTKEY X AND AX,0FFH XEXTKEY: X c_exit __curseskey X ; X ;**************************************************************** X ;* _curseskeytst * X ;* * X ;* int _curseskeytst() * X ;* * X ;* Returns 1 if a character is available, 0 otherwise. * X ;**************************************************************** X PUBLIC __curseskeytst X ; X c_entry __curseskeytst X MOV AH,1 X INT 16H X JZ SHORT TST1 X MOV AX,0 X JMP SHORT EXTTST XTST1: MOV AX,1 XEXTTST: X c_exit __curseskeytst X ; X ;**************************************************************** X ;* _cursesgcb * X ;* * X ;* int _cursesgcb() * X ;* * X ;* Returns 1 if MSDOS BREAK CHECK is on, otherwise 0. * X ;**************************************************************** X PUBLIC __cursesgcb X ; X c_entry __cursesgcb X MOV AX,BRKCHK*256+0 X INT SYSTEM X XOR AH,AH X MOV AL,DL X c_exit __cursesgcb X ; X ;**************************************************************** X ;* _cursesscb * X ;* * X ;* void _cursesscb(setting) * X ;* * X ;* Sets MSDOS BREAK CHECK according to 'setting'. * X ;**************************************************************** X PUBLIC __cursesscb X ; X c_entry __cursesscb X MOV AX,BRKCHK*256+1 X g_parm DL,1 X AND DL,DL X JZ SHORT SCB1 X MOV DL,1 XSCB1: INT SYSTEM X c_exit __cursesscb X ; X_TEXT ENDS X if1 X %OUT Pass 1 Completed X else X %OUT Assembly Completed X endif X END FRIDAY_NIGHT echo extracting - curspriv.h sed 's/^X//' > curspriv.h << 'FRIDAY_NIGHT' X/****************************************************************/ X/* CURSPRIV.H */ X/* Header file for definitions and declarations for the */ X/* PCcurses package. These definitions should not be gene- */ X/* rally accessible to programmers. */ X/****************************************************************/ X/* This version of curses is based on ncurses, a curses version */ X/* originally written by Pavel Curtis at Cornell University. */ X/* I have made substantial changes to make it run on IBM PC's, */ X/* and therefore consider myself free to make it public domain. */ X/* Bjorn Larsson (...mcvax!enea!infovax!bl) */ X/****************************************************************/ X/* 1.0: Release: 870515 */ X/****************************************************************/ X X/* window properties */ X X#define _SUBWIN 1 /* window is a subwindow */ X#define _ENDLINE 2 /* last winline is last screen line */ X#define _FULLWIN 4 /* window fills screen */ X#define _SCROLLWIN 8 /* window lwr rgt is screen lwr rgt */ X X/* Miscellaneous */ X X#define _INBUFSIZ 200 /* size of terminal input buffer */ X#define _NO_CHANGE -1 /* flags line edge unchanged */ X X#define _BREAKCHAR 0x03 /* ^C character */ X#define _DCCHAR 0x08 /* Delete Char char (BS) */ X#define _DLCHAR 0x1b /* Delete Line char (ESC) */ X#define _GOCHAR 0x11 /* ^Q character */ X#define _PRINTCHAR 0x10 /* ^P character */ X#define _STOPCHAR 0x13 /* ^S character */ X#define NUNGETCH 10 /* max # chars to ungetch() */ X X/* character mask definitions */ X X#define CHR_MSK ((int) 0x00ff) /* ASCIIZ character mask */ X#define ATR_MSK ((int) 0xff00) /* attribute mask */ X#define ATR_NRM ((int) 0x0000) /* no special attributes */ X X/* type declarations */ X Xtypedef struct X { X WINDOW *tmpwin; /* window used for updates */ X int cursrow; /* position of physical cursor */ X int curscol; X bool autocr; /* if lf -> crlf */ X bool cbreak; /* if terminal unbuffered */ X bool echo; /* if terminal echo */ X bool raw; /* if terminal raw mode */ X bool refrbrk; /* if premature refresh brk allowed */ X bool orgcbr; /* original MSDOS ^-BREAK setting */ X } cursv; X X/* External variables */ X Xextern cursv _cursvar; /* curses variables */ X X/* 'C' standard library function declarations */ X Xextern char *calloc(); Xextern char *malloc(); Xextern void free(); Xextern int sprintf(); Xextern int sscanf(); X X/* curses internal functions, not to be used by programmers */ X Xextern void _cursescattr(); Xextern void _cursescmode(); Xextern void _cursescursor(); Xextern int _cursesgcb(); Xextern int _cursesgcmode(); Xextern int _cursesgcols(); Xextern int _curseskey(); Xextern int _curseskeytst(); Xextern bool _cursespendch(); Xextern void _cursesputc(); Xextern void _cursesscb(); FRIDAY_NIGHT echo extracting - endwin.c sed 's/^X//' > endwin.c << 'FRIDAY_NIGHT' X/****************************************************************/ X/* Endwin() routine of the PCcurses package */ X/* */ X/****************************************************************/ X/* This version of curses is based on ncurses, a curses version */ X/* originally written by Pavel Curtis at Cornell University. */ X/* I have made substantial changes to make it run on IBM PC's, */ X/* and therefore consider myself free to make it public domain. */ X/* Bjorn Larsson (...mcvax!enea!infovax!bl) */ X/****************************************************************/ X/* 1.0: Release: 870515 */ X/****************************************************************/ X X#include <curses.h> X#include <curspriv.h> X X/****************************************************************/ X/* Endwin() does neccessary clean-up after using the PCcurses */ X/* package. It should be called before exiting the user's pro- */ X/* gram. */ X/****************************************************************/ X Xint endwin() X { X delwin(stdscr); X delwin(curscr); X delwin(_cursvar.tmpwin); X curson(); /* turn on cursor if off */ X _cursescursor(0,LINES-1, 0); /* put at lower left */ X _cursesscb(_cursvar.orgcbr); /* restore original ^BREAK setting */ X return(OK); X } /* endwin */ FRIDAY_NIGHT echo extracting - farcall.inc sed 's/^X//' > farcall.inc << 'FRIDAY_NIGHT' X far_call EQU 1 FRIDAY_NIGHT echo extracting - hugedata.inc sed 's/^X//' > hugedata.inc << 'FRIDAY_NIGHT' X huge_data EQU 1 FRIDAY_NIGHT echo extracting - initscr.c sed 's/^X//' > initscr.c << 'FRIDAY_NIGHT' X/****************************************************************/ X/* Initscr() routine of the PCcurses package */ X/* */ X/****************************************************************/ X/* This version of curses is based on ncurses, a curses version */ X/* originally written by Pavel Curtis at Cornell University. */ X/* I have made substantial changes to make it run on IBM PC's, */ X/* and therefore consider myself free to make it public domain. */ X/* Bjorn Larsson (...mcvax!enea!infovax!bl) */ X/****************************************************************/ X/* 1.0: Release: 870515 */ X/****************************************************************/ X X#include <curses.h> X#include <curspriv.h> X XWINDOW *curscr; /* the current screen image */ XWINDOW *stdscr; /* the default screen window */ Xcursv _cursvar; /* curses variables */ Xint LINES; /* terminal height */ Xint COLS; /* terminal width */ X X/****************************************************************/ X/* Initscr() does neccessary initializations for the PCcurses */ X/* package. It MUST be called before any other curses routines. */ X/****************************************************************/ X Xint initscr() X { X _cursvar.cursrow = -1; /* Initial cursor unknown */ X _cursvar.curscol = -1; X _cursvar.autocr = TRUE; /* lf -> crlf by default */ X _cursvar.raw = FALSE; /* tty I/O modes */ X _cursvar.cbreak = FALSE; X _cursvar.echo = TRUE; X _cursvar.refrbrk = FALSE; /* no premature end of refresh */ X _cursvar.orgcbr = _cursesgcb(); /* original ^BREAK setting */ X X LINES = 25; /* @@@@ this must be fixed */ X COLS = _cursesgcols(); X X if ((_cursvar.tmpwin = newwin(LINES,COLS,0,0)) == (WINDOW *)ERR) X exit(1); X if ((curscr = newwin(LINES,COLS,0,0)) == (WINDOW *)ERR) X exit(1); X if ((stdscr = newwin(LINES,COLS,0,0)) == (WINDOW *)ERR) X exit(1); X curscr->_clear = FALSE; X return(OK); X } /* initscr */ FRIDAY_NIGHT echo extracting - linedel.c sed 's/^X//' > linedel.c << 'FRIDAY_NIGHT' X/****************************************************************/ X/* Wdeleteln() routine of the PCcurses package */ X/* */ X/****************************************************************/ X/* This version of curses is based on ncurses, a curses version */ X/* originally written by Pavel Curtis at Cornell University. */ X/* I have made substantial changes to make it run on IBM PC's, */ X/* and therefore consider myself free to make it public domain. */ X/* Bjorn Larsson (...mcvax!enea!infovax!bl) */ X/****************************************************************/ X/* 1.0: Release: 870515 */ X/****************************************************************/ X X#include <curses.h> X#include <curspriv.h> X X/****************************************************************/ X/* Wdeleteln() deletes the line at the window cursor, and the */ X/* lines below it are shifted up, inserting a blank line at */ X/* the bottom of the window. */ X/****************************************************************/ X Xint wdeleteln(win) X WINDOW *win; X { X int *end; X int *temp; X short y; X static int blank; X X blank = ' ' | (win->_attrs & ATR_MSK); X X temp = win->_line[win->_cury]; X for (y = win->_cury; y < win->_regbottom; y++) X { X win->_line[y] = win->_line[y+1]; X win->_minchng[y] = 0; X win->_maxchng[y] = win->_maxx; X } X win->_minchng[y] = 0; X win->_maxchng[y] = win->_maxx; X win->_line[win->_regbottom] = temp; X for (end = &(temp[win->_maxx]); temp <= end;) X *temp++ = blank; X return(OK); X } /* wdeleteln */ X X/****************************************************************/ X/* Deleteln() deletes the line at the stdscr cursor, and the */ X/* lines below it are shifted up, inserting a blank line at */ X/* the bottom of stdscr. */ X/****************************************************************/ X Xint deleteln() X { X return(wdeleteln(stdscr)); X } /* deleteln */ X X/****************************************************************/ X/* Mvdeleteln() moves the cursor to a new position in stdscr, */ X/* then deletes the line at the window cursor, and the lines */ X/* below it are shifted up, inserting a blank line at the bot- */ X/* tom of stdscr. */ X/****************************************************************/ X Xint mvdeleteln(y,x) X int y; X int x; X { X if (wmove(stdscr,y,x) == ERR) X return(ERR); X return(wdeleteln(stdscr)); X } /* mvdeleteln */ X X/****************************************************************/ X/* Mvwdeleteln() moves the cursor to a new position in a win- */ X/* dow, then deletes the line at the window cursor, and the */ X/* lines below it are shifted up, inserting a blank line at */ X/* the bottom of the window. */ X/****************************************************************/ X Xint mvwdeleteln(win,y,x) X WINDOW *win; X int y; X int x; X { X if (wmove(win,y,x) == ERR) X return(ERR); X return(wdeleteln(win)); X } /* mvwdeleteln */ FRIDAY_NIGHT echo extracting - lineins.c sed 's/^X//' > lineins.c << 'FRIDAY_NIGHT' X/****************************************************************/ X/* Winsertln() routine of the PCcurses package */ X/* */ X/****************************************************************/ X/* This version of curses is based on ncurses, a curses version */ X/* originally written by Pavel Curtis at Cornell University. */ X/* I have made substantial changes to make it run on IBM PC's, */ X/* and therefore consider myself free to make it public domain. */ X/* Bjorn Larsson (...mcvax!enea!infovax!bl) */ X/****************************************************************/ X/* 1.0: Release: 870515 */ X/****************************************************************/ X X#include <curses.h> X#include <curspriv.h> X X/****************************************************************/ X/* Winsertln() inserts a blank line instead of the cursor line */ X/* in window 'win' and pushes other lines down. */ X/****************************************************************/ X Xint winsertln(win) X WINDOW *win; X { X int *temp; X int *end; X short y; X static int blank; X X blank = ' ' | (win->_attrs & ATR_MSK); X temp = win->_line[win->_regbottom]; X for (y = win->_regbottom; y > win->_cury; y--) X { X win->_line[y] = win->_line[y-1]; X win->_minchng[y] = 0; X win->_maxchng[y] = win->_maxx; X } /* for */ X win->_line[win->_cury] = temp; X for (end = &temp[win->_maxx]; temp <= end; temp++) X *temp = blank; X win->_minchng[win->_cury] = 0; X win->_maxchng[win->_cury] = win->_maxx; X return(OK); X } /* winsertln */ X X/****************************************************************/ X/* Insertln() inserts a blank line instead of the cursor line */ X/* in stdscr and pushes other lines down. */ X/****************************************************************/ X Xint insertln() X { X return(winsertln(stdscr)); X } /* insertln */ X X/****************************************************************/ X/* Mvinsertln() moves the stdscr cursor to a new positions, in- */ X/* serts a blank line instead of the cursor line and pushes */ X/* other lines down. */ X/****************************************************************/ X Xint mvinsert(y,x) X int y; X int x; X { X if (wmove(stdscr,y,x) == ERR) X return(ERR); X return(winsertln(stdscr)); X } /* mvinsert */ X X/****************************************************************/ X/* Mvinsertln() moves the cursor in window 'win' to a new posi- */ X/* tions, inserts a blank line instead of the cursor line and */ X/* pushes other lines down. */ X/****************************************************************/ X Xint mvwinsert(win,y,x) X WINDOW *win; X int y; X int x; X { X if (wmove(win,y,x) == ERR) X return(ERR); X return(winsertln(win)); X } /* mvwinsert */ FRIDAY_NIGHT echo extracting - longname.c sed 's/^X//' > longname.c << 'FRIDAY_NIGHT' X/****************************************************************/ X/* Longname() routine of the PCcurses package */ X/* */ X/****************************************************************/ X/* This version of curses is based on ncurses, a curses version */ X/* originally written by Pavel Curtis at Cornell University. */ X/* I have made substantial changes to make it run on IBM PC's, */ X/* and therefore consider myself free to make it public domain. */ X/* Bjorn Larsson (...mcvax!enea!infovax!bl) */ X/****************************************************************/ X/* 1.0: Release: 870515 */ X/****************************************************************/ X X#include <curses.h> X#include <curspriv.h> X X/****************************************************************/ X/* Longname() returns a pointer to a string describing the */ X/* user terminal. */ X/****************************************************************/ X Xchar *longname() X { X return("IBM PC BIOS"); X }/* longname */ FRIDAY_NIGHT echo extracting - make.man sed 's/^X//' > make.man << 'FRIDAY_NIGHT' XMAKE(1) MS-DOS Programmer's Manual MAKE(1) X XNAME X make - maintain program groups X XSYNOPSIS X make [-f <makefile>] [-ainpqrst] [<target>...] X XDESCRIPTION X Make executes commands in makefile to update one or more target names. Name X is typically a program. If no -f option is present, `makefile' is tried. If X makefile is `-', the standard input is taken. More than one -f option may X appear X X Make updates a target if it depends on prerequisite files that have been X modified since the target was last modified, or if the target does not X exist. X X Makefile contains a sequence of entries that specify dependencies. The X first line of an entry is a blank-separated list of targets, then a colon, X then a list of prerequisite files. Text following a semicolon, and all X following lines that begin with a tab, are shell commands to be executed to X update the target. If a name appears on the left of more than one `colon' X line, then it depends on all of the names on the right of the colon on X those lines, but only one command sequence may be specified for it. If a X name appears on a line with a double colon :: then the command sequence X following that line is performed only if the name is out of date with X respect to the names to the right of the double colon, and is not affected X by other double colon lines on which that name may appear. X X Sharp and newline surround comments. X X The following makefile says that `pgm' depends on two files `a.obj' and X `b.obj', and that they in turn depend on `.c' files and a common file X `incl'. X X pgm: a.obj b.obj X cc a.obj b.obj -lm -o pgm X a.obj: incl a.c X cc -c a.c X b.obj: incl b.c X cc -c b.c X X Makefile entries of the form X X string1 = string2 X X are macro definitions. Subsequent appearances of $(string1) or ${string1} X are replaced by string2. If string1 is a single character, the parentheses X or braces are optional. X X Make infers prerequisites for files for which makefile gives no construc- X tion commands. For example, a `.c' file may be inferred as prerequisite for X a `.obj' file and be compiled to produce the `.obj' file. Thus the prece- X ding example can be done more briefly: X X pgm: a.obj b.obj X cc a.obj b.obj -lm -o pgm X a.obj b.obj: incl X X Prerequisites are inferred according to selected suffixes listed as the X `prerequisites' for the special name `.SUFFIXES'; multiple lists accumu- X late; an empty list clears what came before. Order is significant; the X first possible name for which both a file and a rule as described in the X next paragraph exist is inferred. The default list is X X .SUFFIXES: .obj .asm .c X X The rule to create a file with suffix s2 that depends on a similarly named X file with suffix s1 is specified as an entry for the `target' s1s2. In X such an entry, the special macros X X $* stands for the target name with suffix deleted, X $@ for the full target name, X $< for the complete list of prerequisites, X $? for the list of prerequisites that are out of date. X X For example, a rule for making optimized `.obj' files from `.c' files is X X .c.obj: ; cc -c -O -o $@ $*.c X X Certain macros are used by the default inference rules to communicate op- X tional arguments to any resulting compilations. In particular, `CFLAGS' is X used for cc(1) options, and AFLAGS for masm options. In addition, the macro X `MFLAGS' is filled in with the initial command line options supplied to X make. This simplifies maintaining a hierarchy of makefiles as one may then X invoke make on makefiles in subdirectories and pass along useful options. X X Command lines are executed one at a time. First execution of the command X is attempted directly from make. If this fails, a secondary COMMAND.COM X processor is invoked to do the job. For commands executed by a secondary X COMMAND.COM processor, exit status may not be correct, which is a flaw in X MSDOS. X X A command line is printed when it is executed unless the special target X `.SILENT' is in makefile, or the first character of the command is `@'. X X Commands returning nonzero exit status cause make to terminate unless the X special target `.IGNORE' is in makefile or the command begins with the cha- X racter sequence <tab><hyphen>, or if the `-i' option was given. X X Interrupt and quit cause the target to be deleted unless the target is a X directory or depends on the special name `.PRECIOUS'. X XOPTION X -a Disregard date/time stamps, and perform all commands that would be X necessary to update the requested final target(s). X -f Use the next command line token for the makefile name. If this is '-' X then use standard input. X -i Equivalent to the special entry `.IGNORE:'. A single command may be X forced to behave this way by preceding it by '<tab>-'. X -n Trace and print, but do not execute the commands needed to update the X targets. X -p Print all macros and targets. Good for debugging your makefiles. X -q Causes make to return the up-to-date-ness of the target as exit X status. X -r Equivalent to an initial special entry `.SUFFIXES:' with no list. This X means that the built-in inference rules are not used. X -s Equivalent to the special entry `.SILENT:'. A single command may be X forced to behave this way by preceding it by '@'. X -t Touch, i.e. update the modified date of targets, without executing any X commands. X XFILES X makefile, command.com X XSEE ALSO X touch X XRESTRICTIONS X Some commands return nonzero status inappropriately. Use -i to overcome X the difficulty. X X If a command is executed by an invocation a secondary COMMAND.COM, and X ties to set environment variables, these settings will only affect the X environment of that secondary command processor. As soon asit terminates, X the settings are lost. Also, COMMAND.COM always return successful status, X even if it tries to execute a non-existen command. In general, the inten- X tion is that COMMAND.COM is only to be invoked to run simple commands as X COPY, TYPE, DEL and the like. FRIDAY_NIGHT echo pccurses.sh.2 complc_exic