sloane@noscvax.UUCP (04/30/84)
In response to: --------------------------- >I'm trying to incorporate the cursor movement (cm) option from >termcap. Can someone describe the proper sequence of calls needed >to move the cursor to column X, row Y using tgetstr(), tputs(), >and tgoto()? I don't have access to the curses package. > --------------------------- These routines allow some screen control using termcap strings as defined in the TERM variable. They have *NOT* yet been tested, although they probably work since they were 'borrowed' from another program. Good luck... Compile these with: cc -o displib displib.c -ltermlib Use as: #include displib The usual disclaimers apply... Gary K. Sloane c/o Naval Ocean Systems Center COTD Building 1 Room B205 San Diego, California 92152 MILNET: sloane@nosc UUCP: ...{sdcsvax}!noscvax!sloane DDD: (619) 225-8401 x391 ---------------------------CUT HERE------------------- #include <stdio.h> #define bool int /* terminal capabilities to get from termcap */ char *AL, /* insert line */ *CD, /* clear to end of display */ *CE, /* clear to end of line */ *CL, /* clear display */ *CM, /* cursor motion string */ *DL, /* delete line */ *IS, /* initialize terminal */ PC, /* pad character */ *TE, /* initialize CM mode */ *TI; /* terminate CM mode */ /* termcap routines */ char *tgetent(), /* extract termcap entry */ *tgetstr(), /* get string value of a capability */ *tgoto(); /* return cursor addressing string */ /* getenv routine and vars */ char *getenv(), /* get environment variables */ *term; /* pointer to $TERM value */ /* termcap and getenv data buffers */ char tbuf[1024], tcapbuf[256]; /* screen parameters */ int scrlen, /* screen length */ scrwid, /* screen width -1 */ curline, /* current line */ curcol; /* current column */ /************************************************************************/ /* routine to get terminal capabilities, validate & initialize terminal */ /************************************************************************/ initscr() { char *ap, *pcptr; /* get terminal type and termcap entry */ term = getenv("TERM"); if(term == 0) { fprintf(stderr, "** No TERM variable in environment **\n"); exit(1); } switch(tgetent(tbuf, term)) { case -1: { fprintf(stderr, "** Cannot open termcap data file **\n"); exit(2); } case 0: { fprintf(stderr, "** %s: Unknown terminal type **\n", term); exit(3); } } /* make sure it's not a hard-copy terminal */ if(tgetnum("hc") != -1) { fprintf(stderr, "** You cannot run this program from a hard copy terminal **\n"); exit(4); } /* get terminal attributes and capabilities */ ap = tcapbuf; AL = tgetstr("al", &ap); CD = tgetstr("cd", &ap); CE = tgetstr("ce", &ap); CL = tgetstr("cl", &ap); CM = tgetstr("cm", &ap); DL = tgetstr("dl", &ap); IS = tgetstr("is", &ap); TE = tgetstr("te", &ap); TI = tgetstr("ti", &ap); if(pcptr = tgetstr("pc", &ap)) PC = *pcptr; scrlen = tgetnum("li"); scrwid = tgetnum("co"); /* make sure terminal has required capabilities */ if( (CM == 0) || (CL == 0) ) { fprintf(stderr, "** Terminal must have clear and cursor movement capabilities **\n"); exit(5); } if( (scrlen <= 0) || (scrwid <= 0) ) { fprintf(stderr, "** Termcap entry must show screen size **\n"); exit(6); } /* send initialization string if defined */ if(IS != 0) { putpad(IS); } /* home cursor and clear screen either way */ home(); clear(); /* normal exit */ exit(0); } /**************************************************************************/ /* routines to send control sequences to terminal with appropriate padding */ /**************************************************************************/ outch(c) char c; { putchar(c); } putpad(str) char *str; { if(str) tputs(str, 0, outch); } /*********************************/ /* routine to move cursor home */ /* uses curxy so HO is not req'd */ /*********************************/ home() { gotoxy(0,0); } /***************************/ /* routine to clear screen */ /***************************/ clear() { putpad(CL); } /******************************************/ /* routine to move cursor to position x,y */ /******************************************/ gotoxy(lin,col) int lin, col; { char *cmstr = tgoto(CM, col, lin); /* if special mode for CM, start it */ if(TI != 0) putpad(TI); /* do the CM */ putpad(cmstr); /* if special mode for CM, end it */ if(TE != 0) putpad(TE); /* set current line and column */ curline = lin; curcol = col; } /***********************************/ /* routine to clear to end of line */ /***********************************/ cleol() { int i; /* if terminal has CE, do it */ if (CE != 0) putpad(CE); /* if terminal doesn't have CE, fake it */ else { for(i=curcol; i<scrwid; i++) putchar(' '); gotoxy(curline, curcol); } } /**************************************/ /* routine to clear to end of display */ /**************************************/ cleod() { int lin, col; /* if terminal has CD, do it */ if (CD != 0) putpad(CD); /* if it doesn't have CD, fake it */ else { /* save cursor position */ lin = curline; col = curcol; /* clear rest of current line */ cleol(); /* clear rest of screen */ while (curline < scrlen) { gotoxy(++curline, 0); cleol(); } /* return to correct position */ gotoxy(lin,col); } }