/* Public Domain Curses */

#include <curspriv.h>

RCSID("$Id: termattr.c,v 1.54 2008/07/13 16:08:18 wmcbrine Exp $")

/*man-start**************************************************************

  Name:                                                         termattr

  Synopsis:
        int baudrate(void);
        char erasechar(void);
        bool has_ic(void);
        bool has_il(void);
        char killchar(void);
        char *longname(void);
        chtype termattrs(void);
        attr_t term_attrs(void);
        char *termname(void);

        int erasewchar(wchar_t *ch);
        int killwchar(wchar_t *ch);

        char wordchar(void);

  Description:
        baudrate() is supposed to return the output speed of the
        terminal. In PDCurses, it simply returns INT_MAX.

        has_ic and has_il() return TRUE. These functions have meaning in
        some other implementations of curses.

        erasechar() and killchar() return ^H and ^U, respectively -- the
        ERASE and KILL characters. In other curses implementations,
        these may vary by terminal type. erasewchar() and killwchar()
        are the wide-character versions; they take a pointer to a
        location in which to store the character, and return OK or ERR.

        longname() returns a pointer to a static area containing a
        verbose description of the current terminal. The maximum length
        of the string is 128 characters.  It is defined only after the
        call to initscr() or newterm().

        termname() returns a pointer to a static area containing a
        short description of the current terminal (14 characters).

        termattrs() returns a logical OR of all video attributes
        supported by the terminal.

        wordchar() is a PDCurses extension of the concept behind the
        functions erasechar() and killchar(), returning the "delete
        word" character, ^W.

  Portability                                X/Open    BSD    SYS V
        baudrate                                Y       Y       Y
        erasechar                               Y       Y       Y
        has_ic                                  Y       Y       Y
        has_il                                  Y       Y       Y
        killchar                                Y       Y       Y
        longname                                Y       Y       Y
        termattrs                               Y       Y       Y
        termname                                Y       Y       Y
        erasewchar                              Y
        killwchar                               Y
        term_attrs                              Y
        wordchar                                -       -       -

**man-end****************************************************************/

#include <string.h>
#include <limits.h>

int baudrate(void)
{
    PDC_LOG(("baudrate() - called\n"));

    return INT_MAX;
}

char erasechar(void)
{
    PDC_LOG(("erasechar() - called\n"));

    return _ECHAR;      /* character delete char (^H) */
}

bool has_ic(void)
{
    PDC_LOG(("has_ic() - called\n"));

    return TRUE;
}

bool has_il(void)
{
    PDC_LOG(("has_il() - called\n"));

    return TRUE;
}

char killchar(void)
{
    PDC_LOG(("killchar() - called\n"));

    return _DLCHAR;     /* line delete char (^U) */
}

char *longname(void)
{
    PDC_LOG(("longname() - called\n"));

    return ttytype + 9; /* skip "pdcurses|" */
}

chtype termattrs(void)
{
    chtype temp = A_BLINK | A_BOLD | A_INVIS | A_REVERSE | A_UNDERLINE;

    /* note: blink is bold background on some platforms */

    PDC_LOG(("termattrs() - called\n"));

    if (!SP->mono)
        temp |= A_COLOR;

    return temp;
}

attr_t term_attrs(void)
{
    PDC_LOG(("term_attrs() - called\n"));

    return WA_BLINK | WA_BOLD | WA_INVIS | WA_LEFT | WA_REVERSE |
           WA_RIGHT | WA_UNDERLINE;
}

const char *termname(void)
{
    PDC_LOG(("termname() - called\n"));

    return "pdcurses";
}

char wordchar(void)
{
    PDC_LOG(("wordchar() - called\n"));

    return _DWCHAR;         /* word delete char */
}

#ifdef PDC_WIDE
int erasewchar(wchar_t *ch)
{
    PDC_LOG(("erasewchar() - called\n"));

    if (!ch)
        return ERR;

    *ch = (wchar_t)_ECHAR;

    return OK;
}

int killwchar(wchar_t *ch)
{
    PDC_LOG(("killwchar() - called\n"));

    if (!ch)
        return ERR;

    *ch = (wchar_t)_DLCHAR;

    return OK;
}
#endif
