DataMuseum.dk

Presents historical artifacts from the history of:

DKUUG/EUUG Conference tapes

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about DKUUG/EUUG Conference tapes

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - metrics - download
Index: T t

⟦3f19a6c70⟧ TextFile

    Length: 5195 (0x144b)
    Types: TextFile
    Names: »terminal.c.orig«

Derivation

└─⟦b20c6495f⟧ Bits:30007238 EUUGD18: Wien-båndet, efterår 1987
    └─⟦this⟧ »EUUGD18/General/Galaxy/src/terminal.c.orig« 

TextFile

/*
 * %W% (mrdch&amnnon) %G%
 */

# include "header"

/*
 * This file contains all termcap-using functions.  The game uses
 * these function in order to move the cursor, enter standout mode,
 * etc.
 */

FILE * tty;

struct terminal ttycs[2];
struct terminal *ttyc;

char    capbuf[1024];
char   *xxxx = capbuf;
char  **cbuf = &xxxx;

/*
 * This function tries to fill the buffer with the termcap
 * entry of the player's terminal.
 */

fillterm (s, t)
char   *s;
struct terminal *t;
{
    char   *SO,
           *SE,
           *CM,
           *CE,
           *CL,
           *FL,
           *FB,
           *IS,
           *KS,
           *TE,
           *KE,
           *TI;
    int     SG;
    char   *buf;
    char   *malloc ();
    char   *tgetstr ();

    buf = malloc (1024);
    if (buf == 0) {
        writes (2, "OUT OF MEMORY IN FILLTERM.\r\n");
        exit (126);
    }
    t -> t_name = s;
    if (tgetent (buf, s) != 1) {
        fprintf (stderr, "Sorry: Cannot get termcap entry for %s\n",
                s);
        exit (-1);
    }

    SO = tgetstr ("so", cbuf);
    SE = tgetstr ("se", cbuf);
    CM = tgetstr ("cm", cbuf);
    CE = tgetstr ("ce", cbuf);
    CL = tgetstr ("cl", cbuf);
    FL = tgetstr ("fl", cbuf);
    FB = tgetstr ("fb", cbuf);
    IS = tgetstr ("is", cbuf);
    KS = tgetstr ("ks", cbuf);
    TE = tgetstr ("te", cbuf);
    KE = tgetstr ("ke", cbuf);
    TI = tgetstr ("ti", cbuf);

    SG = tgetnum ("sg");

    if (SG == -1)
        SG = 0;

    if (!CM || !SO || !SE || !CL) {
        fprintf (stderr, "The %s terminal lacks basic capabilities. Sorry.\n", s) ;
        exit(1) ;
    }

    t -> t_so = SO;
    t -> t_se = SE;
    t -> t_cm = CM;
    t -> t_ce = CE;
    t -> t_cl = CL;
    t -> t_fl = FL;
    t -> t_fb = FB;
    t -> t_sg = SG;
    t -> t_is = IS;
    t -> t_ks = KS;
    t -> t_te = TE;
    t -> t_ke = KE;
    t -> t_ti = TI;

    free(buf);
}

/* put a single char to a given terminal */
int     xputchar (c)
int     c;
{
    putc (c, tty);
}

/* The initialization for the terminal */
cap_set (t)
struct terminal *t;
{
    tputs (t -> t_is, 1, xputchar);
    tputs (t -> t_ks, 1, xputchar);
    tputs (t -> t_ke, 1, xputchar);
}

/* put the cursor in a x,y position on the screen */
pos (x, y)
int     x,
        y;
{
/*
 * We use only CM.   No CM means no galaxy....
 */
    char   *s;
    char   *tgoto ();

    s = tgoto (ttyc -> t_cm, y, x);
    tputs (s, 1, xputchar);
}

/* output a string, encountering it with end of standout */
se (x, y, s)
char   *s;
{
    pos (x, y);
    tputs (ttyc -> t_se, 1, xputchar);
    print (s);
    tputs (ttyc -> t_se, 1, xputchar);
}

/* output a string, in the standout mode */
so (x, y, s)
char   *s;
{
    pos (x, y);
    tputs (ttyc -> t_so, 1, xputchar);
    print (s);
    tputs (ttyc -> t_se, 1, xputchar);
}

/* clear the whole screen */
clear () {
    pos (1, 1);
    tputs (ttyc -> t_cl, 1, xputchar);
}

/*
 * If the termcap entry was suitably modified, and the terminal
 * has more than one display page, this game benefits greatly
 * from such cases.
 * In short, `fl' entry contains the string that will cause the
 * terminal to "flip" forward , and `fb' entry holds the string
 * that will flip it backward.
 * Whenever any of this are missing, the "flip" is simulated
 * simply by clearing the screen, and writing the relevant
 * information on it.
 */

flip () {
    if (ttyc -> t_fl != 0) {
        if (ttyc -> t_curpage == 0) {
            tputs (ttyc -> t_fl, 1, xputchar);
            ttyc -> t_curpage = 1;
        }
        else {
            tputs (ttyc -> t_fb, 1, xputchar);
            ttyc -> t_curpage = 0;
        }
        return;
    }
    else {
        if (ttyc -> t_curpage == 0)
            ttyc -> t_curpage = 1;
        else {
            init_dis ();
            ttyc -> t_curpage = 0;
        }
    }
}

/* clear to end of line from current cursor position */
ceol () {
    tputs (ttyc -> t_ce, 1, xputchar);
}

/* clear to end of line from given cursor position */
cleol (x, y) {
    pos (x, y);
    tputs (ttyc -> t_ce, 1, xputchar);
}

writes (fd, s)
char   *s;
{
    (void) write (fd, s, strlen (s));
}


/*
 * this function brings the cursor to the current planet.
 * It will restor the video attribute to NORMAL .
 * Care must be taken to consider the effect of video attribute
 * that takes a place on the screen (tvi 925...) and also
 * that if not ended properly, it might extend to the end-of-line
 * or to the end-of-page.
 */

curse_map (pp)
planet * pp;
{
    int     x = pp -> coord[0];
    int     y = pp -> coord[1] + 1;
    draw_map (pp);
    pos (x, y);
}

draw_map (pp)
planet * pp;
{
    char    s[10];
    int     x = pp -> coord[0];
    int     y = pp -> coord[1] + 1;
    s[0] = pp -> d_symbol[player];
    s[1] = 0;

    se (x, y - ttyc -> t_sg, s);
}

/*
 * In this case we LEAVE the map, and go with the cursor to the
 * Command line. Thus we leave a mark at the current planet
 * so reference to it will be easy.
 */

curse_com (pp)
planet * pp;
{
    char    s[10];
    int     x = pp -> coord[0];
    int     y = pp -> coord[1] + 1;

    s[0] = pp -> d_symbol[player];
    s[1] = 0;
    so (x, y - ttyc -> t_sg, s);
}