/* Routines for querying termcap information on UNIX.
   These routines are shared between the alternative screen
   modules curses.c and ansi.c
*/

#include <string.h>
#include <ctype.h>
#include <stdlib.h>
#include "readtc.h"

/* the pseudographic character codes */
#define ASCII_SPECIALS "|-****|-*****><!*^v&*"
char *tt_specials = ASCII_SPECIALS;
char *tt_alternate_start = NULL;
char *tt_alternate_end = NULL;

/* cursor shape control */
char *tt_showcursor = NULL;
char *tt_hidecursor = NULL;

#ifdef UNIX

#define DEC_SPECIALS   "xqlkmjxqlkmja>< p^V&*"
#define LINUX_SPECIALS   "\225\232\226\234\223\231\205\212\206\214\203\211*><!*^V&*"
/* "\170\161\154\153\155\152\170\161\154\153\155\152\141><\160^^V&*" */


/* No chance to guess which UNIX uses term.h and which termcap.h, so we
   just have to use our own prototype. I know this is ugly ...
   #include <termcap.h>
   #include <term.h>
*/

int tgetent(char *, const char *);
char *tgetstr(char *, char **);   

static char termbuf[4096];
static char termresult[4096];

static char *transform_acs(char *template, char *terminfo)
{
    int i;
    static char buffer[22];
    char *p;

    for (i = 0; i < sizeof(buffer) && i < strlen(template); i++)
    {
        p = islower(template[i]) ? strchr(terminfo, template[i]) : NULL;
        if (p != NULL && p[0] && p[1])
        {
            buffer[i] = p[1];
        }
        else
        {
            buffer[i] = ASCII_SPECIALS[i];
        }
    }
    return buffer;
}

void query_termcap(int what)
{
    char *termname;
    char *area;
    char *acs;

    termname = getenv("TERM");

    /* READ INFORMATION ON PSEUDO GRAPHICS CHARACTERS */

    if ((termname != NULL) && (what & QUERY_ALTCHARSET))
    {
        /* The Linux people are idiots, can't even get their termcap right */
        if (!strcmp(termname, "linux") ||
            !strcmp(termname, "linux-lat") ||
            !strcmp(termname, "linux console"))
        {
            tt_specials = LINUX_SPECIALS;
            tt_alternate_start = "";
            tt_alternate_end = "";
            tt_showcursor = "\033[25h";
            tt_hidecursor = "\033[25l";
        }
        else if (tgetent(termbuf, termname) != 0)
        {
            area = termresult;
            tt_alternate_start = tgetstr("as", &area);
            tt_alternate_end = tgetstr("ae", &area);
            acs = tgetstr("ac", &area);
            tt_showcursor = tgetstr("ve", &area);
            tt_hidecursor = tgetstr("vi", &area);

            if (acs != NULL)
            {
                tt_specials = transform_acs(DEC_SPECIALS, acs);
                if (tt_alternate_start == NULL)
                {
                    tt_alternate_start = "";
                }
                if (tt_alternate_end == NULL)
                {
                    tt_alternate_end = "";
                }
            }
            else if (tt_alternate_start != NULL && tt_alternate_end != NULL)
            {
                tt_specials = DEC_SPECIALS;
            } 
            else
            {
                tt_alternate_start = NULL;
                tt_alternate_end = NULL;
            }
        }
    } else
    {
        tt_specials = ASCII_SPECIALS;
        tt_alternate_start = NULL;
        tt_alternate_end = NULL;
    }
}
#endif


syntax highlighted by Code2HTML, v. 0.9.1