Back to index

tetex-bin  3.0
Defines | Functions
lib_setup.c File Reference
#include <curses.priv.h>
#include <tic.h>
#include <term_entry.h>
#include <term.h>

Go to the source code of this file.

Defines

#define ret_error(code, fmt, arg)
#define ret_error0(code, msg)
#define CONTROL_N(s)   ((s) != 0 && strstr(s, "\016") != 0)
#define CONTROL_O(s)   ((s) != 0 && strstr(s, "\017") != 0)

Functions

 NCURSES_EXPORT_VAR (char)
static void _nc_get_screensize (int *linep, int *colp)
static void do_prototype (void)
 _nc_get_locale (void)
 _nc_unicode_locale (void)
 _nc_locale_breaks_acs (void)
 setupterm (NCURSES_CONST char *tname, int Filedes, int *errret)

Define Documentation

#define CONTROL_N (   s)    ((s) != 0 && strstr(s, "\016") != 0)

Definition at line 388 of file lib_setup.c.

#define CONTROL_O (   s)    ((s) != 0 && strstr(s, "\017") != 0)

Definition at line 389 of file lib_setup.c.

#define ret_error (   code,
  fmt,
  arg 
)
Value:
if (errret) {\
                                       *errret = code;\
                                       returnCode(ERR);\
                                   } else {\
                                       fprintf(stderr, fmt, arg);\
                                       exit(EXIT_FAILURE);\
                                   }

Definition at line 243 of file lib_setup.c.

#define ret_error0 (   code,
  msg 
)
Value:
if (errret) {\
                                       *errret = code;\
                                       returnCode(ERR);\
                                   } else {\
                                       fprintf(stderr, msg);\
                                       exit(EXIT_FAILURE);\
                                   }

Definition at line 251 of file lib_setup.c.


Function Documentation

Definition at line 345 of file lib_setup.c.

{
    char *env;
#if HAVE_LOCALE_H
    /*
     * This is preferable to using getenv() since it ensures that we are using
     * the locale which was actually initialized by the application.
     */
    env = setlocale(LC_CTYPE, 0);
#else
    if (((env = getenv("LC_ALL")) != 0 && *env != '\0')
       || ((env = getenv("LC_CTYPE")) != 0 && *env != '\0')
       || ((env = getenv("LANG")) != 0 && *env != '\0')) {
       ;
    }
#endif
    T(("_nc_get_locale %s", _nc_visbuf(env)));
    return env;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void _nc_get_screensize ( int linep,
int colp 
) [static]

Definition at line 118 of file lib_setup.c.

{
    /* figure out the size of the screen */
    T(("screen size: terminfo lines = %d columns = %d", lines, columns));

    if (!_use_env) {
       *linep = (int) lines;
       *colp = (int) columns;
    } else {                /* usually want to query LINES and COLUMNS from environment */
       int value;

       *linep = *colp = 0;

       /* first, look for environment variables */
       if ((value = _nc_getenv_num("LINES")) > 0) {
           *linep = value;
       }
       if ((value = _nc_getenv_num("COLUMNS")) > 0) {
           *colp = value;
       }
       T(("screen size: environment LINES = %d COLUMNS = %d", *linep, *colp));

#ifdef __EMX__
       if (*linep <= 0 || *colp <= 0) {
           int screendata[2];
           _scrsize(screendata);
           *colp = screendata[0];
           *linep = screendata[1];
           T(("EMX screen size: environment LINES = %d COLUMNS = %d",
              *linep, *colp));
       }
#endif
#if HAVE_SIZECHANGE
       /* if that didn't work, maybe we can try asking the OS */
       if (*linep <= 0 || *colp <= 0) {
           if (isatty(cur_term->Filedes)) {
              STRUCT_WINSIZE size;

              errno = 0;
              do {
                  if (ioctl(cur_term->Filedes, IOCTL_WINSIZE, &size) < 0
                     && errno != EINTR)
                     goto failure;
              } while
                  (errno == EINTR);

              /*
               * Solaris lets users override either dimension with an
               * environment variable.
               */
              if (*linep <= 0)
                  *linep = WINSIZE_ROWS(size);
              if (*colp <= 0)
                  *colp = WINSIZE_COLS(size);
           }
           /* FALLTHRU */
         failure:;
       }
#endif /* HAVE_SIZECHANGE */

       /* if we can't get dynamic info about the size, use static */
       if (*linep <= 0) {
           *linep = (int) lines;
       }
       if (*colp <= 0) {
           *colp = (int) columns;
       }

       /* the ultimate fallback, assume fixed 24x80 size */
       if (*linep <= 0) {
           *linep = 24;
       }
       if (*colp <= 0) {
           *colp = 80;
       }

       /*
        * Put the derived values back in the screen-size caps, so
        * tigetnum() and tgetnum() will do the right thing.
        */
       lines = (short) (*linep);
       columns = (short) (*colp);
    }

    T(("screen size is %dx%d", *linep, *colp));

    if (VALID_NUMERIC(init_tabs))
       TABSIZE = (int) init_tabs;
    else
       TABSIZE = 8;
    T(("TABSIZE = %d", TABSIZE));
}

Here is the call graph for this function:

Here is the caller graph for this function:

Definition at line 396 of file lib_setup.c.

{
    char *env = getenv("TERM");
    if (env != 0) {
       if (strstr(env, "linux"))
           return 1;        /* always broken */
       if (strstr(env, "screen") != 0
           && ((env = getenv("TERMCAP")) != 0
              && strstr(env, "screen") != 0)
           && strstr(env, "hhII00") != 0) {
           if (CONTROL_N(enter_alt_charset_mode) ||
              CONTROL_O(enter_alt_charset_mode) ||
              CONTROL_N(set_attributes) ||
              CONTROL_O(set_attributes))
              return 1;
       }
    }
    return 0;
}

Here is the caller graph for this function:

Definition at line 369 of file lib_setup.c.

{
    int result = 0;
#if HAVE_LANGINFO_CODESET
    char *env = nl_langinfo(CODESET);
    result = !strcmp(env, "UTF-8");
    T(("_nc_unicode_locale(%s) ->%d", env, result));
#else
    char *env = _nc_get_locale();
    if (env != 0) {
       if (strstr(env, ".UTF-8") != 0) {
           result = 1;
           T(("_nc_unicode_locale(%s) ->%d", env, result));
       }
    }
#endif
    return result;
}

Here is the call graph for this function:

Here is the caller graph for this function:

static void do_prototype ( void  ) [static]

Definition at line 322 of file lib_setup.c.

{
    int i;
    char CC;
    char proto;
    char *tmp;

    tmp = getenv("CC");
    CC = *tmp;
    proto = *command_character;

    for_each_string(i, &(cur_term->type)) {
       for (tmp = cur_term->type.Strings[i]; *tmp; tmp++) {
           if (*tmp == proto)
              *tmp = CC;
       }
    }
}

Here is the caller graph for this function:

NCURSES_EXPORT_VAR ( char  )

Definition at line 102 of file lib_setup.c.

{
    T((T_CALLED("use_env()")));
    _use_env = f;
    returnVoid;
}
setupterm ( NCURSES_CONST char *  tname,
int  Filedes,
int errret 
)

Definition at line 425 of file lib_setup.c.

{
    int status;

    START_TRACE();
    T((T_CALLED("setupterm(%s,%d,%p)"), _nc_visbuf(tname), Filedes, errret));

    if (tname == 0) {
       tname = getenv("TERM");
       if (tname == 0 || *tname == '\0') {
           ret_error0(-1, "TERM environment variable not set.\n");
       }
    }
    if (strlen(tname) > MAX_NAME_SIZE) {
       ret_error(-1, "TERM environment must be <= %d characters.\n",
                MAX_NAME_SIZE);
    }

    T(("your terminal name is %s", tname));

    /*
     * Allow output redirection.  This is what SVr3 does.  If stdout is
     * directed to a file, screen updates go to standard error.
     */
    if (Filedes == STDOUT_FILENO && !isatty(Filedes))
       Filedes = STDERR_FILENO;

    /*
     * Check if we have already initialized to use this terminal.  If so, we
     * do not need to re-read the terminfo entry, or obtain TTY settings.
     *
     * This is an improvement on SVr4 curses.  If an application mixes curses
     * and termcap calls, it may call both initscr and tgetent.  This is not
     * really a good thing to do, but can happen if someone tries using ncurses
     * with the readline library.  The problem we are fixing is that when
     * tgetent calls setupterm, the resulting Ottyb struct in cur_term is
     * zeroed.  A subsequent call to endwin uses the zeroed terminal settings
     * rather than the ones saved in initscr.  So we check if cur_term appears
     * to contain terminal settings for the same output file as our current
     * call - and copy those terminal settings.  (SVr4 curses does not do this,
     * however applications that are working around the problem will still work
     * properly with this feature).
     */
    if (cur_term != 0
       && cur_term->Filedes == Filedes
       && cur_term->_termname != 0
       && !strcmp(cur_term->_termname, tname)
       && _nc_name_match(cur_term->type.term_names, tname, "|")) {
       T(("reusing existing terminal information and mode-settings"));
    } else {
       TERMINAL *term_ptr;

       term_ptr = typeCalloc(TERMINAL, 1);

       if (term_ptr == 0) {
           ret_error0(-1,
                     "Not enough memory to create terminal structure.\n");
       }
#if USE_DATABASE || USE_TERMCAP
       status = grab_entry(tname, &term_ptr->type);
#else
       status = 0;
#endif

       /* try fallback list if entry on disk */
       if (status != 1) {
           const TERMTYPE *fallback = _nc_fallback(tname);

           if (fallback) {
              term_ptr->type = *fallback;
              status = 1;
           }
       }

       if (status <= 0) {
           del_curterm(term_ptr);
           if (status == -1) {
              ret_error0(-1, "terminals database is inaccessible\n");
           } else if (status == 0) {
              ret_error(0, "'%s': unknown terminal type.\n", tname);
           }
       }

       set_curterm(term_ptr);

       if (command_character && getenv("CC"))
           do_prototype();

       strncpy(ttytype, cur_term->type.term_names, NAMESIZE - 1);
       ttytype[NAMESIZE - 1] = '\0';

       cur_term->Filedes = Filedes;
       cur_term->_termname = strdup(tname);

       /*
        * If an application calls setupterm() rather than initscr() or
        * newterm(), we will not have the def_prog_mode() call in
        * _nc_setupscreen().  Do it now anyway, so we can initialize the
        * baudrate.
        */
       if (isatty(Filedes)) {
           def_prog_mode();
           baudrate();
       }
    }

    /*
     * We should always check the screensize, just in case.
     */
    _nc_get_screensize(&LINES, &COLS);

    if (errret)
       *errret = 1;

    T((T_CREATE("screen %s %dx%d"), tname, LINES, COLS));

    if (generic_type) {
       ret_error(0, "'%s': I need something more specific.\n", tname);
    }
    if (hard_copy) {
       ret_error(1, "'%s': I can't handle hardcopy terminals.\n", tname);
    }
    returnCode(OK);
}

Here is the call graph for this function:

Here is the caller graph for this function: