224 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			224 lines
		
	
	
		
			5.5 KiB
		
	
	
	
		
			C
		
	
	
		
			Executable File
		
	
	
	
	
| #include <stdlib.h>
 | |
| #include <termcap.h>
 | |
| #include <sys/types.h>
 | |
| #include <sys/ioctl.h>
 | |
| #include <curses.h>
 | |
| #include "curspriv.h"
 | |
| 
 | |
| struct termios _orig_tty, _tty;
 | |
| cursv _cursvar;
 | |
| 
 | |
| WINDOW *stdscr, *curscr;
 | |
| int LINES, COLS;
 | |
| bool NONL;
 | |
| 
 | |
| char termcap[1024];		/* termcap buffer */
 | |
| char tc[200];			/* area to hold string capabilities */
 | |
| char *ttytype;			/* terminal type from env */
 | |
| static char *arp;		/* pointer for use in tgetstr */
 | |
| char *cp;			/* character pointer */
 | |
| 
 | |
| char *cl;			/* clear screen capability */
 | |
| char *cm;			/* cursor motion capability */
 | |
| char *so;			/* start standout capability */
 | |
| char *se;			/* end standout capability */
 | |
| char *mr;			/* start of reverse */
 | |
| char *me;			/* revert to normal */
 | |
| char *mb;			/* start of blink */
 | |
| char *md;			/* start of bold */
 | |
| char *us;			/* start of underscore */
 | |
| char *ue;			/* end of underscore */
 | |
| char *vi;			/* cursor invisible */
 | |
| char *ve;			/* cursor normal */
 | |
| char *vs;			/* cursor good visible */
 | |
| char *as;			/* alternative charset start */
 | |
| char *ae;			/* alternative charset end */
 | |
| char *bl;			/* ring the bell */
 | |
| char *vb;			/* visual bell */
 | |
| 
 | |
| /* fatal - report error and die. Never returns */
 | |
| void fatal(s)
 | |
| char *s;
 | |
| {
 | |
|   (void) fprintf(stderr, "curses: %s\n", s);
 | |
|   exit(1);
 | |
| }
 | |
| 
 | |
| /* Outc - call putchar, necessary because putchar is a macro. */
 | |
| void outc(c)
 | |
| int c;
 | |
| {
 | |
|   putchar(c);
 | |
| }
 | |
| 
 | |
| /* Move cursor to r,c */
 | |
| void poscur(r, c)
 | |
| int r, c;
 | |
| {
 | |
|   tputs(tgoto(cm, c, r), 1, outc);
 | |
| }
 | |
| 
 | |
| /* Clear the screen */
 | |
| void clrscr()
 | |
| {
 | |
|   tputs(cl, 1, outc);
 | |
| }
 | |
| 
 | |
| /* This are terminal independent characters which can be used in curses */
 | |
| 
 | |
| unsigned int ACS_ULCORNER;
 | |
| unsigned int ACS_LLCORNER;
 | |
| unsigned int ACS_URCORNER;
 | |
| unsigned int ACS_LRCORNER;
 | |
| unsigned int ACS_RTEE;
 | |
| unsigned int ACS_LTEE;
 | |
| unsigned int ACS_BTEE;
 | |
| unsigned int ACS_TTEE;
 | |
| unsigned int ACS_HLINE;
 | |
| unsigned int ACS_VLINE;
 | |
| unsigned int ACS_PLUS;
 | |
| unsigned int ACS_S1;
 | |
| unsigned int ACS_S9;
 | |
| unsigned int ACS_DIAMOND;
 | |
| unsigned int ACS_CKBOARD;
 | |
| unsigned int ACS_DEGREE;
 | |
| unsigned int ACS_PLMINUS;
 | |
| unsigned int ACS_BULLET;
 | |
| unsigned int ACS_LARROW;
 | |
| unsigned int ACS_RARROW;
 | |
| unsigned int ACS_DARROW;
 | |
| unsigned int ACS_UARROW;
 | |
| unsigned int ACS_BOARD;
 | |
| unsigned int ACS_LANTERN;
 | |
| unsigned int ACS_BLOCK;
 | |
| 
 | |
| /* These defines describe the full set of grafic block characters which
 | |
|  * can be defined via termcap.
 | |
|  */
 | |
| 
 | |
| #define RIGHTARROW  0
 | |
| #define LEFTARROW   1
 | |
| #define DOWNARROW   2
 | |
| #define UPARROW     3
 | |
| #define FULLSQUARE  4
 | |
| #define GREYSQUARE  5
 | |
| #define EMPTYSQUARE 6
 | |
| #define LATERN      7
 | |
| #define DIAMOND     8
 | |
| #define DEGREE      9
 | |
| #define PLUSMINUS  10
 | |
| #define DOWNRIGHT  11
 | |
| #define UPRIGHT    12
 | |
| #define UPLEFT     13
 | |
| #define DOWNLEFT   14
 | |
| #define CROSS      15
 | |
| #define UPLINE     16
 | |
| #define UPMIDLINE  17
 | |
| #define MIDLINE    18
 | |
| #define DOMIDLINE  19
 | |
| #define DOWNLINE   20
 | |
| #define TEELEFT    21
 | |
| #define TEERIGHT   22
 | |
| #define TEEHEAD    23
 | |
| #define TEENORMAL  24
 | |
| #define VERTLINE   25
 | |
| #define PARAGRAPH  26
 | |
| 
 | |
| unsigned int _cursgraftable[27] =
 | |
| {
 | |
|  '>', '<', 'v', '^', '#', ':', ' ', '#', '+', '\'', '#', '+', '+',
 | |
|  '+', '+', '+', '-', ' ', '-', ' ', '_', '+', '+', '+', '+', '|'
 | |
| };
 | |
| char _cursident[28] = "+,.-0ahI`fgjklmnopqrstuvwx~";
 | |
| 
 | |
| int setterm(type)
 | |
| char *type;
 | |
| {
 | |
|   unsigned char *ac;
 | |
|   int i;
 | |
| #ifdef TIOCGWINSZ
 | |
|   struct winsize wsize;
 | |
| #endif
 | |
| 
 | |
|   if (tgetent(termcap, type) != 1) return ERR;
 | |
| 
 | |
| #ifdef TIOCGWINSZ
 | |
|   if (ioctl(0, TIOCGWINSZ, &wsize) == 0) {
 | |
| 	LINES = wsize.ws_row != 0 ? wsize.ws_row : tgetnum("li");
 | |
| 	COLS = wsize.ws_col != 0 ? wsize.ws_col : tgetnum("co");
 | |
|   } else {
 | |
| #endif
 | |
| 	LINES = tgetnum("li");
 | |
| 	COLS = tgetnum("co");
 | |
| #ifdef TIOCGWINSZ
 | |
|   }
 | |
| #endif
 | |
|   arp = tc;
 | |
|   cl = tgetstr("cl", &arp);
 | |
|   so = tgetstr("so", &arp);
 | |
|   se = tgetstr("se", &arp);
 | |
|   cm = tgetstr("cm", &arp);
 | |
|   mr = tgetstr("mr", &arp);
 | |
|   me = tgetstr("me", &arp);
 | |
|   mb = tgetstr("mb", &arp);
 | |
|   md = tgetstr("md", &arp);
 | |
|   us = tgetstr("us", &arp);
 | |
|   ue = tgetstr("ue", &arp);
 | |
|   vi = tgetstr("vi", &arp);
 | |
|   ve = tgetstr("ve", &arp);
 | |
|   vs = tgetstr("vs", &arp);
 | |
|   as = tgetstr("as", &arp);
 | |
|   ae = tgetstr("ae", &arp);
 | |
|   ac = (unsigned char *) tgetstr("ac", &arp);
 | |
|   bl = tgetstr("bl", &arp);
 | |
|   vb = tgetstr("vb", &arp);
 | |
| 
 | |
|   if (ac) {
 | |
| 	while (*ac) {
 | |
| 		i = 0;
 | |
| 		while (*ac != _cursident[i]) i++;
 | |
| 		_cursgraftable[i] = *++ac | A_ALTCHARSET;
 | |
| 		ac++;
 | |
| 	}
 | |
|   }
 | |
| 
 | |
|   ACS_ULCORNER = _cursgraftable[UPLEFT];
 | |
|   ACS_LLCORNER = _cursgraftable[DOWNLEFT];
 | |
|   ACS_URCORNER = _cursgraftable[UPRIGHT];
 | |
|   ACS_LRCORNER = _cursgraftable[DOWNRIGHT];
 | |
|   ACS_RTEE = _cursgraftable[TEERIGHT];
 | |
|   ACS_LTEE = _cursgraftable[TEELEFT];
 | |
|   ACS_BTEE = _cursgraftable[TEEHEAD];
 | |
|   ACS_TTEE = _cursgraftable[TEENORMAL];
 | |
|   ACS_HLINE = _cursgraftable[MIDLINE];
 | |
|   ACS_VLINE = _cursgraftable[VERTLINE];
 | |
|   ACS_PLUS = _cursgraftable[CROSS];
 | |
|   ACS_S1 = _cursgraftable[UPLINE];
 | |
|   ACS_S9 = _cursgraftable[DOWNLINE];
 | |
|   ACS_DIAMOND = _cursgraftable[DIAMOND];
 | |
|   ACS_CKBOARD = _cursgraftable[GREYSQUARE];
 | |
|   ACS_DEGREE = _cursgraftable[DEGREE];
 | |
|   ACS_PLMINUS = _cursgraftable[PLUSMINUS];
 | |
|   ACS_BULLET = 'o';		/* where the hell is a bullet defined in
 | |
| 			 * termcap ??? */
 | |
|   ACS_LARROW = _cursgraftable[LEFTARROW];
 | |
|   ACS_RARROW = _cursgraftable[RIGHTARROW];
 | |
|   ACS_DARROW = _cursgraftable[DOWNARROW];
 | |
|   ACS_UARROW = _cursgraftable[UPARROW];
 | |
|   ACS_BOARD = _cursgraftable[EMPTYSQUARE];
 | |
|   ACS_LANTERN = _cursgraftable[LATERN];
 | |
|   ACS_BLOCK = _cursgraftable[FULLSQUARE];
 | |
|   /* Wow, I got it! */
 | |
|   return OK;
 | |
| }
 | |
| 
 | |
| void gettmode()
 | |
| {
 | |
|   tcgetattr(0, &_orig_tty);
 | |
|   tcgetattr(0, &_tty);
 | |
|   _cursvar.echoit = (_tty.c_lflag & ECHO) != 0;
 | |
|   _cursvar.rawmode = (_tty.c_lflag & (ICANON|ISIG)) == 0;
 | |
|   _cursvar.cbrkmode = (_tty.c_lflag & (ICANON|ISIG)) == ISIG;
 | |
|   NONL = (_tty.c_iflag & ICRNL) != 0;
 | |
| }
 | 
