Annotation of 43BSD/contrib/notes/src/cursor.c, revision 1.1.1.1

1.1       root        1: #include "parms.h"
                      2: #include "structs.h"
                      3: 
                      4: #ifdef RCSIDENT
                      5: static char rcsid[] = "$Header: cursor.c,v 1.7 85/01/18 15:07:42 notes Rel $";
                      6: #endif RCSIDENT
                      7: 
                      8: /*
                      9:  *  at(row,col) places cursor on hazeltine at row,col
                     10:  *     row = 1 to 24    ( y coords )
                     11:  *     column = 1 to 80   ( x coords )
                     12:  *
                     13:  *     numbers <=0 will have "nrows" or "ncols" added to them so
                     14:  *     as to allow "floating" positioning relative to the bottom
                     15:  *     or right side of the screen
                     16:  *
                     17:  *     -- modified 18-nov-1981 R. Essick to handle different tty types 
                     18:  *
                     19:  */
                     20: 
                     21: static short    ttyinit = 0;                           /* whether have gotten termcap */
                     22: static char bufspace[1024];                            /* term capabilities */
                     23: static char *cm = NULL;                                        /* cursor motion */
                     24: static char *cls = NULL;                               /* clear screen string */
                     25: static char *ti = NULL;                                        /* start cursor motion */
                     26: static char *te = NULL;                                        /* stop cursor motion */
                     27: static char *ce = NULL;                                        /* clear to eol */
                     28: #ifdef USG
                     29: static char *BC,
                     30:            *UP;                                                /* backspace, upspave */
                     31: #else
                     32: extern char *BC;                                       /* backspaces */
                     33: extern char *UP;                                       /* up 1 line */
                     34: #endif
                     35: static int  atrow,
                     36:             atcol;                                     /* current position */
                     37: 
                     38: char   *tgoto ();                                      /* decodes the cursor via termcap */
                     39: 
                     40: /*     charout - output 1 character */
                     41: /*     used by tputs routine in at */
                     42: charout (c)
                     43: {
                     44:     putchar (c);
                     45: }
                     46: 
                     47: 
                     48: at (row, col)
                     49: {
                     50:     register char  *p;
                     51: 
                     52:     if (ttyinit == 0)
                     53:        cursget ();                                     /* initialize termcap */
                     54:     if (cm != NULL)                                    /* was there a cm field? */
                     55:     {
                     56:        if (row <= 0)
                     57:            row += nrows;                               /* wraparound - cute */
                     58:        if (col <= 0)
                     59:            col += ncols;
                     60:        p = tgoto (cm, col - 1, row - 1);
                     61:        tputs (p, 1, charout);
                     62: 
                     63:     }
                     64:     else
                     65:        if (atrow != row)
                     66:            printf ("\n");
                     67:        else
                     68:            printf (" ");
                     69:     atrow = row;
                     70:     atcol = col;
                     71: }
                     72: 
                     73: /*
                     74:  * erase()  erases the screen
                     75:  *     modified R. Essick 18-nov-81 - allow different tty types 
                     76:  *     Modified R Kolstad Jan '84 for true erase-abort function
                     77:  */
                     78: 
                     79: erase ()
                     80: {
                     81:     clearerr (stdout);                                 /* to be sure */
                     82:     if (ttyinit == 0)
                     83:        cursget ();                                     /* initialize termcap */
                     84: #ifdef BSD4x
                     85:     {
                     86: #include <sgtty.h>
                     87:        int     flusher = 2;
                     88: /*
                     89:  *     2 is magic constant used in kernel to mean flush write buffers
                     90:  *     only.
                     91:  */
                     92:        ioctl (1, TIOCFLUSH, &flusher);
                     93:     }
                     94: #endif BSD4x
                     95: 
                     96:     if (cls != NULL)
                     97:        tputs (cls, 1, charout);
                     98:     else
                     99:        printf ("\n\n");
                    100:     atrow = 1;                                         /* back in top of screen */
                    101:     atcol = 1;                                         /* on left hand side */
                    102: }
                    103: 
                    104: /*
                    105:  *     cmstart, cmstop
                    106:  *
                    107:  *     prepare fancy tty's for cursor motion stuff 
                    108:  *
                    109:  */
                    110: cmstart ()
                    111: {
                    112:     if (ttyinit == 0)
                    113:        cursget ();
                    114:     if (ti != NULL)
                    115:        tputs (ti, 1, charout);
                    116: }
                    117: 
                    118: cmstop ()
                    119: {
                    120:     if (ttyinit == 0)
                    121:        cursget ();
                    122:     if (te != NULL)
                    123:        tputs (te, 1, charout);
                    124: }
                    125: 
                    126: /*
                    127:  *     clear to end of line if the capability exists.
                    128:  *
                    129:  *     FIX FOR DUMB TERMINALS
                    130:  */
                    131: 
                    132: ceol ()
                    133: {
                    134:     if (ttyinit == 0)
                    135:        cursget ();
                    136:     if (ce != NULL)
                    137:        tputs (ce, 1, charout);
                    138: }
                    139: 
                    140: cursget ()
                    141: {
                    142:     char   *getenv (), *tgetstr ();
                    143:     char   *p,
                    144:            *q;
                    145:     extern char *histty;                               /* tty type on control card */
                    146:     register int    i;                                 /* rows, cols */
                    147:     char    bp[1024];                                  /* termcap stuff */
                    148: /*     bp made dynamic to give the pdp-11 breathing room */
                    149: 
                    150:     ttyinit = 1;                                       /* say we got it */
                    151: /*
                    152:  *     ttyinit set now so don't loop on ttystop/cmstop/cursget/ttystop...
                    153:  */
                    154:     if ((p = histty) == 0)
                    155:     {
                    156:        if ((p = getenv ("TERM")) == NULL)              /* a terminal ?? */
                    157:        {
                    158:            fprintf (stderr, "You have no TERM environmental variable.  This variable tells the\n");
                    159:            fprintf (stderr, "system what type of terminal you are using so it's features may be used.\n");
                    160:            fprintf (stderr, "To set this variable:\n\n");
                    161:            fprintf (stderr, "  From csh type 'setenv TERM <term-type>'.\n");
                    162:            fprintf (stderr, "  From sh type 'TERM=<termtype>;export TERM'.\n\n");
                    163:            fprintf (stderr, "Where <term-type> is the system designation for your terminal.\n");
                    164:            fprintf (stderr, "(E.g. hp2621, adm3a, aaa40, etc).\n");
                    165:            ttystop ();                                 /* make sure tty is in normal state */
                    166:            exit (BAD);                                 /* and terminate */
                    167:        }
                    168:     }
                    169:     if (tgetent (bp, p) != 1)
                    170:     {
                    171:        fprintf (stderr,
                    172:                "Can't find capabilities for terminal type \"%s\"\n", p);
                    173:        ttystop ();                                     /* reset tty states */
                    174:        exit (BAD);
                    175:     }
                    176:     q = bufspace;
                    177:     cm = tgetstr ("cm", &q);                           /* get cursor motion */
                    178:     cls = tgetstr ("cl", &q);                          /* clear screen */
                    179:     ti = tgetstr ("ti", &q);                           /* start cursor motion */
                    180:     te = tgetstr ("te", &q);                           /* stop cursor motion */
                    181:     UP = tgetstr ("up", &q);                           /* cursor up */
                    182:     BC = tgetstr ("bc", &q);                           /* cursor left */
                    183:     ce = tgetstr ("ce", &q);                           /* clear to eol */
                    184:     if ((i = tgetnum ("li")) != -1)
                    185:        nrows = i;                                      /* rows on screen */
                    186:     if (nrows != 24)                                   /* different screen size */
                    187:     {
                    188:        Nindex = nrows - 12;                            /* header, trailer, prompt */
                    189:     }
                    190:     if ((i = tgetnum ("co")) != -1)
                    191:        ncols = i;                                      /* cols on screen */
                    192: }
                    193: 
                    194: /*
                    195:  * miscellaneous output routines for the terminal
                    196:  *
                    197:  * center(p,len,row,col) takes a character string pointed at by p and centers it
                    198:  *    within a field of length n.  it is printed on screen at row,col
                    199:  *    (centered).  It is also assumed that p's string is BLANK TERMINATED
                    200:  *
                    201:  * prdate(w) struct when_f *w;  prints the date.  Assumes 'at' is already done
                    202:  *
                    203:  * sprdate(w,str) struct when_f *w; char str[]; formats the date and returns
                    204:  *             the result in the string pointed to by str.
                    205:  *
                    206:  */
                    207: 
                    208: center (p, len, row, col) char *p;
                    209: {
                    210:     register int    i;
                    211:     char   *r;
                    212: 
                    213:     i = strlen (p);                                    /* get length */
                    214:     if (i != 0)
                    215:     {
                    216:        at (row, col + (len - i) / 2);
                    217:        fwrite (p, sizeof (char), i, stdout);           /* write it */
                    218:     }
                    219: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.