OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-old/] [gdb-7.1/] [readline/] [terminal.c] - Diff between revs 834 and 842

Go to most recent revision | Only display areas with differences | Details | Blame | View Log

Rev 834 Rev 842
/* terminal.c -- controlling the terminal with termcap. */
/* terminal.c -- controlling the terminal with termcap. */
 
 
/* Copyright (C) 1996-2005 Free Software Foundation, Inc.
/* Copyright (C) 1996-2005 Free Software Foundation, Inc.
 
 
   This file is part of the GNU Readline Library, a library for
   This file is part of the GNU Readline Library, a library for
   reading lines of text with interactive input and history editing.
   reading lines of text with interactive input and history editing.
 
 
   The GNU Readline Library is free software; you can redistribute it
   The GNU Readline Library is free software; you can redistribute it
   and/or modify it under the terms of the GNU General Public License
   and/or modify it under the terms of the GNU General Public License
   as published by the Free Software Foundation; either version 2, or
   as published by the Free Software Foundation; either version 2, or
   (at your option) any later version.
   (at your option) any later version.
 
 
   The GNU Readline Library is distributed in the hope that it will be
   The GNU Readline Library is distributed in the hope that it will be
   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
   useful, but WITHOUT ANY WARRANTY; without even the implied warranty
   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.
   GNU General Public License for more details.
 
 
   The GNU General Public License is often shipped with GNU software, and
   The GNU General Public License is often shipped with GNU software, and
   is generally kept in a file called COPYING or LICENSE.  If you do not
   is generally kept in a file called COPYING or LICENSE.  If you do not
   have a copy of the license, write to the Free Software Foundation,
   have a copy of the license, write to the Free Software Foundation,
   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
#define READLINE_LIBRARY
#define READLINE_LIBRARY
 
 
#if defined (HAVE_CONFIG_H)
#if defined (HAVE_CONFIG_H)
#  include <config.h>
#  include <config.h>
#endif
#endif
 
 
#include <sys/types.h>
#include <sys/types.h>
#include "posixstat.h"
#include "posixstat.h"
#include <fcntl.h>
#include <fcntl.h>
#if defined (HAVE_SYS_FILE_H)
#if defined (HAVE_SYS_FILE_H)
#  include <sys/file.h>
#  include <sys/file.h>
#endif /* HAVE_SYS_FILE_H */
#endif /* HAVE_SYS_FILE_H */
 
 
#if defined (HAVE_UNISTD_H)
#if defined (HAVE_UNISTD_H)
#  include <unistd.h>
#  include <unistd.h>
#endif /* HAVE_UNISTD_H */
#endif /* HAVE_UNISTD_H */
 
 
#if defined (HAVE_STDLIB_H)
#if defined (HAVE_STDLIB_H)
#  include <stdlib.h>
#  include <stdlib.h>
#else
#else
#  include "ansi_stdlib.h"
#  include "ansi_stdlib.h"
#endif /* HAVE_STDLIB_H */
#endif /* HAVE_STDLIB_H */
 
 
#if defined (HAVE_LOCALE_H)
#if defined (HAVE_LOCALE_H)
#  include <locale.h>
#  include <locale.h>
#endif
#endif
 
 
#include <stdio.h>
#include <stdio.h>
 
 
/* System-specific feature definitions and include files. */
/* System-specific feature definitions and include files. */
#include "rldefs.h"
#include "rldefs.h"
 
 
#if defined (GWINSZ_IN_SYS_IOCTL) && !defined (TIOCGWINSZ)
#if defined (GWINSZ_IN_SYS_IOCTL) && !defined (TIOCGWINSZ)
#  include <sys/ioctl.h>
#  include <sys/ioctl.h>
#endif /* GWINSZ_IN_SYS_IOCTL && !TIOCGWINSZ */
#endif /* GWINSZ_IN_SYS_IOCTL && !TIOCGWINSZ */
 
 
#ifdef __MSDOS__
#ifdef __MSDOS__
# include <pc.h>
# include <pc.h>
#endif
#endif
 
 
#include "rltty.h"
#include "rltty.h"
#include "tcap.h"
#include "tcap.h"
 
 
/* Some standard library routines. */
/* Some standard library routines. */
#include "readline.h"
#include "readline.h"
#include "history.h"
#include "history.h"
 
 
#include "rlprivate.h"
#include "rlprivate.h"
#include "rlshell.h"
#include "rlshell.h"
#include "xmalloc.h"
#include "xmalloc.h"
 
 
#if defined (__MINGW32__)
#if defined (__MINGW32__)
# include <windows.h>
# include <windows.h>
# include <wincon.h>
# include <wincon.h>
#endif
#endif
 
 
#define CUSTOM_REDISPLAY_FUNC() (rl_redisplay_function != rl_redisplay)
#define CUSTOM_REDISPLAY_FUNC() (rl_redisplay_function != rl_redisplay)
#define CUSTOM_INPUT_FUNC() (rl_getc_function != rl_getc)
#define CUSTOM_INPUT_FUNC() (rl_getc_function != rl_getc)
 
 
int rl_prefer_env_winsize;
int rl_prefer_env_winsize;
 
 
/* **************************************************************** */
/* **************************************************************** */
/*                                                                  */
/*                                                                  */
/*                      Terminal and Termcap                        */
/*                      Terminal and Termcap                        */
/*                                                                  */
/*                                                                  */
/* **************************************************************** */
/* **************************************************************** */
 
 
#ifndef __MSDOS__
#ifndef __MSDOS__
static char *term_buffer = (char *)NULL;
static char *term_buffer = (char *)NULL;
static char *term_string_buffer = (char *)NULL;
static char *term_string_buffer = (char *)NULL;
#endif /* !__MSDOS__ */
#endif /* !__MSDOS__ */
 
 
static int tcap_initialized;
static int tcap_initialized;
 
 
#if !defined (__linux__)
#if !defined (__linux__)
#  if defined (__EMX__) || defined (NEED_EXTERN_PC)
#  if defined (__EMX__) || defined (NEED_EXTERN_PC)
extern
extern
#  endif /* __EMX__ || NEED_EXTERN_PC */
#  endif /* __EMX__ || NEED_EXTERN_PC */
char PC, *BC, *UP;
char PC, *BC, *UP;
#endif /* __linux__ */
#endif /* __linux__ */
 
 
/* Some strings to control terminal actions.  These are output by tputs (). */
/* Some strings to control terminal actions.  These are output by tputs (). */
char *_rl_term_clreol;
char *_rl_term_clreol;
char *_rl_term_clrpag;
char *_rl_term_clrpag;
char *_rl_term_cr;
char *_rl_term_cr;
char *_rl_term_backspace;
char *_rl_term_backspace;
char *_rl_term_goto;
char *_rl_term_goto;
char *_rl_term_pc;
char *_rl_term_pc;
 
 
/* Non-zero if we determine that the terminal can do character insertion. */
/* Non-zero if we determine that the terminal can do character insertion. */
int _rl_terminal_can_insert = 0;
int _rl_terminal_can_insert = 0;
 
 
/* How to insert characters. */
/* How to insert characters. */
char *_rl_term_im;
char *_rl_term_im;
char *_rl_term_ei;
char *_rl_term_ei;
char *_rl_term_ic;
char *_rl_term_ic;
char *_rl_term_ip;
char *_rl_term_ip;
char *_rl_term_IC;
char *_rl_term_IC;
 
 
/* How to delete characters. */
/* How to delete characters. */
char *_rl_term_dc;
char *_rl_term_dc;
char *_rl_term_DC;
char *_rl_term_DC;
 
 
#if defined (HACK_TERMCAP_MOTION)
#if defined (HACK_TERMCAP_MOTION)
char *_rl_term_forward_char;
char *_rl_term_forward_char;
#endif  /* HACK_TERMCAP_MOTION */
#endif  /* HACK_TERMCAP_MOTION */
 
 
/* How to go up a line. */
/* How to go up a line. */
char *_rl_term_up;
char *_rl_term_up;
 
 
/* A visible bell; char if the terminal can be made to flash the screen. */
/* A visible bell; char if the terminal can be made to flash the screen. */
static char *_rl_visible_bell;
static char *_rl_visible_bell;
 
 
/* Non-zero means the terminal can auto-wrap lines. */
/* Non-zero means the terminal can auto-wrap lines. */
int _rl_term_autowrap = -1;
int _rl_term_autowrap = -1;
 
 
/* Non-zero means that this terminal has a meta key. */
/* Non-zero means that this terminal has a meta key. */
static int term_has_meta;
static int term_has_meta;
 
 
/* The sequences to write to turn on and off the meta key, if this
/* The sequences to write to turn on and off the meta key, if this
   terminal has one. */
   terminal has one. */
static char *_rl_term_mm;
static char *_rl_term_mm;
static char *_rl_term_mo;
static char *_rl_term_mo;
 
 
/* The key sequences output by the arrow keys, if this terminal has any. */
/* The key sequences output by the arrow keys, if this terminal has any. */
static char *_rl_term_ku;
static char *_rl_term_ku;
static char *_rl_term_kd;
static char *_rl_term_kd;
static char *_rl_term_kr;
static char *_rl_term_kr;
static char *_rl_term_kl;
static char *_rl_term_kl;
 
 
/* How to initialize and reset the arrow keys, if this terminal has any. */
/* How to initialize and reset the arrow keys, if this terminal has any. */
static char *_rl_term_ks;
static char *_rl_term_ks;
static char *_rl_term_ke;
static char *_rl_term_ke;
 
 
/* The key sequences sent by the Home and End keys, if any. */
/* The key sequences sent by the Home and End keys, if any. */
static char *_rl_term_kh;
static char *_rl_term_kh;
static char *_rl_term_kH;
static char *_rl_term_kH;
static char *_rl_term_at7;      /* @7 */
static char *_rl_term_at7;      /* @7 */
 
 
/* Delete key */
/* Delete key */
static char *_rl_term_kD;
static char *_rl_term_kD;
 
 
/* Insert key */
/* Insert key */
static char *_rl_term_kI;
static char *_rl_term_kI;
 
 
/* Cursor control */
/* Cursor control */
static char *_rl_term_vs;       /* very visible */
static char *_rl_term_vs;       /* very visible */
static char *_rl_term_ve;       /* normal */
static char *_rl_term_ve;       /* normal */
 
 
static void bind_termcap_arrow_keys PARAMS((Keymap));
static void bind_termcap_arrow_keys PARAMS((Keymap));
 
 
/* Variables that hold the screen dimensions, used by the display code. */
/* Variables that hold the screen dimensions, used by the display code. */
int _rl_screenwidth, _rl_screenheight, _rl_screenchars;
int _rl_screenwidth, _rl_screenheight, _rl_screenchars;
 
 
/* Non-zero means the user wants to enable the keypad. */
/* Non-zero means the user wants to enable the keypad. */
int _rl_enable_keypad;
int _rl_enable_keypad;
 
 
/* Non-zero means the user wants to enable a meta key. */
/* Non-zero means the user wants to enable a meta key. */
int _rl_enable_meta = 1;
int _rl_enable_meta = 1;
 
 
#if defined (__EMX__)
#if defined (__EMX__)
static void
static void
_emx_get_screensize (swp, shp)
_emx_get_screensize (swp, shp)
     int *swp, *shp;
     int *swp, *shp;
{
{
  int sz[2];
  int sz[2];
 
 
  _scrsize (sz);
  _scrsize (sz);
 
 
  if (swp)
  if (swp)
    *swp = sz[0];
    *swp = sz[0];
  if (shp)
  if (shp)
    *shp = sz[1];
    *shp = sz[1];
}
}
#endif
#endif
 
 
/* Get readline's idea of the screen size.  TTY is a file descriptor open
/* Get readline's idea of the screen size.  TTY is a file descriptor open
   to the terminal.  If IGNORE_ENV is true, we do not pay attention to the
   to the terminal.  If IGNORE_ENV is true, we do not pay attention to the
   values of $LINES and $COLUMNS.  The tests for TERM_STRING_BUFFER being
   values of $LINES and $COLUMNS.  The tests for TERM_STRING_BUFFER being
   non-null serve to check whether or not we have initialized termcap. */
   non-null serve to check whether or not we have initialized termcap. */
void
void
_rl_get_screen_size (tty, ignore_env)
_rl_get_screen_size (tty, ignore_env)
     int tty, ignore_env;
     int tty, ignore_env;
{
{
  char *ss;
  char *ss;
#if defined (TIOCGWINSZ)
#if defined (TIOCGWINSZ)
  struct winsize window_size;
  struct winsize window_size;
#endif /* TIOCGWINSZ */
#endif /* TIOCGWINSZ */
  int wr, wc;
  int wr, wc;
 
 
  wr = wc = -1;
  wr = wc = -1;
#if defined (TIOCGWINSZ)
#if defined (TIOCGWINSZ)
  if (ioctl (tty, TIOCGWINSZ, &window_size) == 0)
  if (ioctl (tty, TIOCGWINSZ, &window_size) == 0)
    {
    {
      wc = (int) window_size.ws_col;
      wc = (int) window_size.ws_col;
      wr = (int) window_size.ws_row;
      wr = (int) window_size.ws_row;
    }
    }
#endif /* TIOCGWINSZ */
#endif /* TIOCGWINSZ */
 
 
  /* For MinGW, we get the console size from the Windows API.  */
  /* For MinGW, we get the console size from the Windows API.  */
#if defined (__MINGW32__)
#if defined (__MINGW32__)
  HANDLE hConOut = GetStdHandle (STD_OUTPUT_HANDLE);
  HANDLE hConOut = GetStdHandle (STD_OUTPUT_HANDLE);
  if (hConOut != INVALID_HANDLE_VALUE)
  if (hConOut != INVALID_HANDLE_VALUE)
    {
    {
      CONSOLE_SCREEN_BUFFER_INFO scr;
      CONSOLE_SCREEN_BUFFER_INFO scr;
      if (GetConsoleScreenBufferInfo (hConOut, &scr))
      if (GetConsoleScreenBufferInfo (hConOut, &scr))
        {
        {
          wc = scr.dwSize.X;
          wc = scr.dwSize.X;
          wr = scr.srWindow.Bottom - scr.srWindow.Top + 1;
          wr = scr.srWindow.Bottom - scr.srWindow.Top + 1;
        }
        }
    }
    }
#endif
#endif
 
 
#if defined (__EMX__)
#if defined (__EMX__)
  _emx_get_screensize (&_rl_screenwidth, &_rl_screenheight);
  _emx_get_screensize (&_rl_screenwidth, &_rl_screenheight);
#endif
#endif
 
 
  if (ignore_env || rl_prefer_env_winsize == 0)
  if (ignore_env || rl_prefer_env_winsize == 0)
    {
    {
      _rl_screenwidth = wc;
      _rl_screenwidth = wc;
      _rl_screenheight = wr;
      _rl_screenheight = wr;
    }
    }
  else
  else
    _rl_screenwidth = _rl_screenheight = -1;
    _rl_screenwidth = _rl_screenheight = -1;
 
 
  /* Environment variable COLUMNS overrides setting of "co" if IGNORE_ENV
  /* Environment variable COLUMNS overrides setting of "co" if IGNORE_ENV
     is unset.  If we prefer the environment, check it first before
     is unset.  If we prefer the environment, check it first before
     assigning the value returned by the kernel. */
     assigning the value returned by the kernel. */
  if (_rl_screenwidth <= 0)
  if (_rl_screenwidth <= 0)
    {
    {
      if (ignore_env == 0 && (ss = sh_get_env_value ("COLUMNS")))
      if (ignore_env == 0 && (ss = sh_get_env_value ("COLUMNS")))
        _rl_screenwidth = atoi (ss);
        _rl_screenwidth = atoi (ss);
 
 
      if (_rl_screenwidth <= 0)
      if (_rl_screenwidth <= 0)
        _rl_screenwidth = wc;
        _rl_screenwidth = wc;
 
 
#if defined (__DJGPP__)
#if defined (__DJGPP__)
      if (_rl_screenwidth <= 0)
      if (_rl_screenwidth <= 0)
        _rl_screenwidth = ScreenCols ();
        _rl_screenwidth = ScreenCols ();
#else
#else
      if (_rl_screenwidth <= 0 && term_string_buffer)
      if (_rl_screenwidth <= 0 && term_string_buffer)
        _rl_screenwidth = tgetnum ("co");
        _rl_screenwidth = tgetnum ("co");
#endif
#endif
    }
    }
 
 
  /* Environment variable LINES overrides setting of "li" if IGNORE_ENV
  /* Environment variable LINES overrides setting of "li" if IGNORE_ENV
     is unset. */
     is unset. */
  if (_rl_screenheight <= 0)
  if (_rl_screenheight <= 0)
    {
    {
      if (ignore_env == 0 && (ss = sh_get_env_value ("LINES")))
      if (ignore_env == 0 && (ss = sh_get_env_value ("LINES")))
        _rl_screenheight = atoi (ss);
        _rl_screenheight = atoi (ss);
 
 
      if (_rl_screenheight <= 0)
      if (_rl_screenheight <= 0)
        _rl_screenheight = wr;
        _rl_screenheight = wr;
 
 
#if defined (__DJGPP__)
#if defined (__DJGPP__)
      if (_rl_screenheight <= 0)
      if (_rl_screenheight <= 0)
        _rl_screenheight = ScreenRows ();
        _rl_screenheight = ScreenRows ();
#else
#else
      if (_rl_screenheight <= 0 && term_string_buffer)
      if (_rl_screenheight <= 0 && term_string_buffer)
        _rl_screenheight = tgetnum ("li");
        _rl_screenheight = tgetnum ("li");
#endif
#endif
    }
    }
 
 
  /* If all else fails, default to 80x24 terminal. */
  /* If all else fails, default to 80x24 terminal. */
  if (_rl_screenwidth <= 1)
  if (_rl_screenwidth <= 1)
    _rl_screenwidth = 80;
    _rl_screenwidth = 80;
 
 
  if (_rl_screenheight <= 0)
  if (_rl_screenheight <= 0)
    _rl_screenheight = 24;
    _rl_screenheight = 24;
 
 
  /* If we're being compiled as part of bash, set the environment
  /* If we're being compiled as part of bash, set the environment
     variables $LINES and $COLUMNS to new values.  Otherwise, just
     variables $LINES and $COLUMNS to new values.  Otherwise, just
     do a pair of putenv () or setenv () calls. */
     do a pair of putenv () or setenv () calls. */
  sh_set_lines_and_columns (_rl_screenheight, _rl_screenwidth);
  sh_set_lines_and_columns (_rl_screenheight, _rl_screenwidth);
 
 
  if (_rl_term_autowrap == 0)
  if (_rl_term_autowrap == 0)
    _rl_screenwidth--;
    _rl_screenwidth--;
 
 
  _rl_screenchars = _rl_screenwidth * _rl_screenheight;
  _rl_screenchars = _rl_screenwidth * _rl_screenheight;
}
}
 
 
void
void
_rl_set_screen_size (rows, cols)
_rl_set_screen_size (rows, cols)
     int rows, cols;
     int rows, cols;
{
{
  if (_rl_term_autowrap == -1)
  if (_rl_term_autowrap == -1)
    _rl_init_terminal_io (rl_terminal_name);
    _rl_init_terminal_io (rl_terminal_name);
 
 
  if (rows > 0)
  if (rows > 0)
    _rl_screenheight = rows;
    _rl_screenheight = rows;
  if (cols > 0)
  if (cols > 0)
    {
    {
      _rl_screenwidth = cols;
      _rl_screenwidth = cols;
      if (_rl_term_autowrap == 0)
      if (_rl_term_autowrap == 0)
        _rl_screenwidth--;
        _rl_screenwidth--;
    }
    }
 
 
  if (rows > 0 || cols > 0)
  if (rows > 0 || cols > 0)
    _rl_screenchars = _rl_screenwidth * _rl_screenheight;
    _rl_screenchars = _rl_screenwidth * _rl_screenheight;
}
}
 
 
void
void
rl_set_screen_size (rows, cols)
rl_set_screen_size (rows, cols)
     int rows, cols;
     int rows, cols;
{
{
  _rl_set_screen_size (rows, cols);
  _rl_set_screen_size (rows, cols);
}
}
 
 
void
void
rl_get_screen_size (rows, cols)
rl_get_screen_size (rows, cols)
     int *rows, *cols;
     int *rows, *cols;
{
{
  if (rows)
  if (rows)
    *rows = _rl_screenheight;
    *rows = _rl_screenheight;
  if (cols)
  if (cols)
    *cols = _rl_screenwidth;
    *cols = _rl_screenwidth;
}
}
 
 
void
void
rl_reset_screen_size ()
rl_reset_screen_size ()
{
{
  _rl_get_screen_size (fileno (rl_instream), 0);
  _rl_get_screen_size (fileno (rl_instream), 0);
}
}
 
 
void
void
rl_resize_terminal ()
rl_resize_terminal ()
{
{
  if (readline_echoing_p)
  if (readline_echoing_p)
    {
    {
      _rl_get_screen_size (fileno (rl_instream), 1);
      _rl_get_screen_size (fileno (rl_instream), 1);
      if (CUSTOM_REDISPLAY_FUNC ())
      if (CUSTOM_REDISPLAY_FUNC ())
        rl_forced_update_display ();
        rl_forced_update_display ();
      else
      else
        _rl_redisplay_after_sigwinch ();
        _rl_redisplay_after_sigwinch ();
    }
    }
}
}
 
 
struct _tc_string {
struct _tc_string {
     const char *tc_var;
     const char *tc_var;
     char **tc_value;
     char **tc_value;
};
};
 
 
/* This should be kept sorted, just in case we decide to change the
/* This should be kept sorted, just in case we decide to change the
   search algorithm to something smarter. */
   search algorithm to something smarter. */
static struct _tc_string tc_strings[] =
static struct _tc_string tc_strings[] =
{
{
  { "@7", &_rl_term_at7 },
  { "@7", &_rl_term_at7 },
  { "DC", &_rl_term_DC },
  { "DC", &_rl_term_DC },
  { "IC", &_rl_term_IC },
  { "IC", &_rl_term_IC },
  { "ce", &_rl_term_clreol },
  { "ce", &_rl_term_clreol },
  { "cl", &_rl_term_clrpag },
  { "cl", &_rl_term_clrpag },
  { "cr", &_rl_term_cr },
  { "cr", &_rl_term_cr },
  { "dc", &_rl_term_dc },
  { "dc", &_rl_term_dc },
  { "ei", &_rl_term_ei },
  { "ei", &_rl_term_ei },
  { "ic", &_rl_term_ic },
  { "ic", &_rl_term_ic },
  { "im", &_rl_term_im },
  { "im", &_rl_term_im },
  { "kD", &_rl_term_kD },       /* delete */
  { "kD", &_rl_term_kD },       /* delete */
  { "kH", &_rl_term_kH },       /* home down ?? */
  { "kH", &_rl_term_kH },       /* home down ?? */
  { "kI", &_rl_term_kI },       /* insert */
  { "kI", &_rl_term_kI },       /* insert */
  { "kd", &_rl_term_kd },
  { "kd", &_rl_term_kd },
  { "ke", &_rl_term_ke },       /* end keypad mode */
  { "ke", &_rl_term_ke },       /* end keypad mode */
  { "kh", &_rl_term_kh },       /* home */
  { "kh", &_rl_term_kh },       /* home */
  { "kl", &_rl_term_kl },
  { "kl", &_rl_term_kl },
  { "kr", &_rl_term_kr },
  { "kr", &_rl_term_kr },
  { "ks", &_rl_term_ks },       /* start keypad mode */
  { "ks", &_rl_term_ks },       /* start keypad mode */
  { "ku", &_rl_term_ku },
  { "ku", &_rl_term_ku },
  { "le", &_rl_term_backspace },
  { "le", &_rl_term_backspace },
  { "mm", &_rl_term_mm },
  { "mm", &_rl_term_mm },
  { "mo", &_rl_term_mo },
  { "mo", &_rl_term_mo },
#if defined (HACK_TERMCAP_MOTION)
#if defined (HACK_TERMCAP_MOTION)
  { "nd", &_rl_term_forward_char },
  { "nd", &_rl_term_forward_char },
#endif
#endif
  { "pc", &_rl_term_pc },
  { "pc", &_rl_term_pc },
  { "up", &_rl_term_up },
  { "up", &_rl_term_up },
  { "vb", &_rl_visible_bell },
  { "vb", &_rl_visible_bell },
  { "vs", &_rl_term_vs },
  { "vs", &_rl_term_vs },
  { "ve", &_rl_term_ve },
  { "ve", &_rl_term_ve },
};
};
 
 
#define NUM_TC_STRINGS (sizeof (tc_strings) / sizeof (struct _tc_string))
#define NUM_TC_STRINGS (sizeof (tc_strings) / sizeof (struct _tc_string))
 
 
/* Read the desired terminal capability strings into BP.  The capabilities
/* Read the desired terminal capability strings into BP.  The capabilities
   are described in the TC_STRINGS table. */
   are described in the TC_STRINGS table. */
static void
static void
get_term_capabilities (bp)
get_term_capabilities (bp)
     char **bp;
     char **bp;
{
{
#if !defined (__DJGPP__)        /* XXX - doesn't DJGPP have a termcap library? */
#if !defined (__DJGPP__)        /* XXX - doesn't DJGPP have a termcap library? */
  register int i;
  register int i;
 
 
  for (i = 0; i < NUM_TC_STRINGS; i++)
  for (i = 0; i < NUM_TC_STRINGS; i++)
    *(tc_strings[i].tc_value) = tgetstr ((char *)tc_strings[i].tc_var, bp);
    *(tc_strings[i].tc_value) = tgetstr ((char *)tc_strings[i].tc_var, bp);
#endif
#endif
  tcap_initialized = 1;
  tcap_initialized = 1;
}
}
 
 
int
int
_rl_init_terminal_io (terminal_name)
_rl_init_terminal_io (terminal_name)
     const char *terminal_name;
     const char *terminal_name;
{
{
  const char *term;
  const char *term;
  char *buffer;
  char *buffer;
  int tty, tgetent_ret;
  int tty, tgetent_ret;
 
 
  term = terminal_name ? terminal_name : sh_get_env_value ("TERM");
  term = terminal_name ? terminal_name : sh_get_env_value ("TERM");
  _rl_term_clrpag = _rl_term_cr = _rl_term_clreol = (char *)NULL;
  _rl_term_clrpag = _rl_term_cr = _rl_term_clreol = (char *)NULL;
  tty = rl_instream ? fileno (rl_instream) : 0;
  tty = rl_instream ? fileno (rl_instream) : 0;
 
 
  if (term == 0)
  if (term == 0)
    term = "dumb";
    term = "dumb";
 
 
#ifdef __MSDOS__
#ifdef __MSDOS__
  _rl_term_im = _rl_term_ei = _rl_term_ic = _rl_term_IC = (char *)NULL;
  _rl_term_im = _rl_term_ei = _rl_term_ic = _rl_term_IC = (char *)NULL;
  _rl_term_up = _rl_term_dc = _rl_term_DC = _rl_visible_bell = (char *)NULL;
  _rl_term_up = _rl_term_dc = _rl_term_DC = _rl_visible_bell = (char *)NULL;
  _rl_term_ku = _rl_term_kd = _rl_term_kl = _rl_term_kr = (char *)NULL;
  _rl_term_ku = _rl_term_kd = _rl_term_kl = _rl_term_kr = (char *)NULL;
  _rl_term_mm = _rl_term_mo = (char *)NULL;
  _rl_term_mm = _rl_term_mo = (char *)NULL;
  _rl_terminal_can_insert = term_has_meta = _rl_term_autowrap = 0;
  _rl_terminal_can_insert = term_has_meta = _rl_term_autowrap = 0;
  _rl_term_cr = "\r";
  _rl_term_cr = "\r";
  _rl_term_clreol = _rl_term_clrpag = _rl_term_backspace = (char *)NULL;
  _rl_term_clreol = _rl_term_clrpag = _rl_term_backspace = (char *)NULL;
  _rl_term_goto = _rl_term_pc = _rl_term_ip = (char *)NULL;
  _rl_term_goto = _rl_term_pc = _rl_term_ip = (char *)NULL;
  _rl_term_ks = _rl_term_ke =_rl_term_vs = _rl_term_ve = (char *)NULL;
  _rl_term_ks = _rl_term_ke =_rl_term_vs = _rl_term_ve = (char *)NULL;
  _rl_term_kh = _rl_term_kH = _rl_term_at7 = _rl_term_kI = (char *)NULL;
  _rl_term_kh = _rl_term_kH = _rl_term_at7 = _rl_term_kI = (char *)NULL;
#if defined(HACK_TERMCAP_MOTION)
#if defined(HACK_TERMCAP_MOTION)
  _rl_term_forward_char = (char *)NULL;
  _rl_term_forward_char = (char *)NULL;
#endif
#endif
 
 
  _rl_get_screen_size (tty, 0);
  _rl_get_screen_size (tty, 0);
#else  /* !__MSDOS__ */
#else  /* !__MSDOS__ */
  /* I've separated this out for later work on not calling tgetent at all
  /* I've separated this out for later work on not calling tgetent at all
     if the calling application has supplied a custom redisplay function,
     if the calling application has supplied a custom redisplay function,
     (and possibly if the application has supplied a custom input function). */
     (and possibly if the application has supplied a custom input function). */
  if (CUSTOM_REDISPLAY_FUNC())
  if (CUSTOM_REDISPLAY_FUNC())
    {
    {
      tgetent_ret = -1;
      tgetent_ret = -1;
    }
    }
  else
  else
    {
    {
      if (term_string_buffer == 0)
      if (term_string_buffer == 0)
        term_string_buffer = (char *)xmalloc(2032);
        term_string_buffer = (char *)xmalloc(2032);
 
 
      if (term_buffer == 0)
      if (term_buffer == 0)
        term_buffer = (char *)xmalloc(4080);
        term_buffer = (char *)xmalloc(4080);
 
 
      buffer = term_string_buffer;
      buffer = term_string_buffer;
 
 
      tgetent_ret = tgetent (term_buffer, term);
      tgetent_ret = tgetent (term_buffer, term);
    }
    }
 
 
  if (tgetent_ret <= 0)
  if (tgetent_ret <= 0)
    {
    {
      FREE (term_string_buffer);
      FREE (term_string_buffer);
      FREE (term_buffer);
      FREE (term_buffer);
      buffer = term_buffer = term_string_buffer = (char *)NULL;
      buffer = term_buffer = term_string_buffer = (char *)NULL;
 
 
      _rl_term_autowrap = 0;     /* used by _rl_get_screen_size */
      _rl_term_autowrap = 0;     /* used by _rl_get_screen_size */
 
 
      /* Allow calling application to set default height and width, using
      /* Allow calling application to set default height and width, using
         rl_set_screen_size */
         rl_set_screen_size */
      if (_rl_screenwidth <= 0 || _rl_screenheight <= 0)
      if (_rl_screenwidth <= 0 || _rl_screenheight <= 0)
        {
        {
#if defined (__EMX__)
#if defined (__EMX__)
          _emx_get_screensize (&_rl_screenwidth, &_rl_screenheight);
          _emx_get_screensize (&_rl_screenwidth, &_rl_screenheight);
          _rl_screenwidth--;
          _rl_screenwidth--;
#else /* !__EMX__ */
#else /* !__EMX__ */
          _rl_get_screen_size (tty, 0);
          _rl_get_screen_size (tty, 0);
#endif /* !__EMX__ */
#endif /* !__EMX__ */
        }
        }
 
 
      /* Defaults. */
      /* Defaults. */
      if (_rl_screenwidth <= 0 || _rl_screenheight <= 0)
      if (_rl_screenwidth <= 0 || _rl_screenheight <= 0)
        {
        {
          _rl_screenwidth = 79;
          _rl_screenwidth = 79;
          _rl_screenheight = 24;
          _rl_screenheight = 24;
        }
        }
 
 
      /* Everything below here is used by the redisplay code (tputs). */
      /* Everything below here is used by the redisplay code (tputs). */
      _rl_screenchars = _rl_screenwidth * _rl_screenheight;
      _rl_screenchars = _rl_screenwidth * _rl_screenheight;
      _rl_term_cr = "\r";
      _rl_term_cr = "\r";
      _rl_term_im = _rl_term_ei = _rl_term_ic = _rl_term_IC = (char *)NULL;
      _rl_term_im = _rl_term_ei = _rl_term_ic = _rl_term_IC = (char *)NULL;
      _rl_term_up = _rl_term_dc = _rl_term_DC = _rl_visible_bell = (char *)NULL;
      _rl_term_up = _rl_term_dc = _rl_term_DC = _rl_visible_bell = (char *)NULL;
      _rl_term_ku = _rl_term_kd = _rl_term_kl = _rl_term_kr = (char *)NULL;
      _rl_term_ku = _rl_term_kd = _rl_term_kl = _rl_term_kr = (char *)NULL;
      _rl_term_kh = _rl_term_kH = _rl_term_kI = _rl_term_kD = (char *)NULL;
      _rl_term_kh = _rl_term_kH = _rl_term_kI = _rl_term_kD = (char *)NULL;
      _rl_term_ks = _rl_term_ke = _rl_term_at7 = (char *)NULL;
      _rl_term_ks = _rl_term_ke = _rl_term_at7 = (char *)NULL;
      _rl_term_mm = _rl_term_mo = (char *)NULL;
      _rl_term_mm = _rl_term_mo = (char *)NULL;
      _rl_term_ve = _rl_term_vs = (char *)NULL;
      _rl_term_ve = _rl_term_vs = (char *)NULL;
#if defined (HACK_TERMCAP_MOTION)
#if defined (HACK_TERMCAP_MOTION)
      term_forward_char = (char *)NULL;
      term_forward_char = (char *)NULL;
#endif
#endif
      _rl_terminal_can_insert = term_has_meta = 0;
      _rl_terminal_can_insert = term_has_meta = 0;
 
 
      /* Reasonable defaults for tgoto().  Readline currently only uses
      /* Reasonable defaults for tgoto().  Readline currently only uses
         tgoto if _rl_term_IC or _rl_term_DC is defined, but just in case we
         tgoto if _rl_term_IC or _rl_term_DC is defined, but just in case we
         change that later... */
         change that later... */
      PC = '\0';
      PC = '\0';
      BC = _rl_term_backspace = "\b";
      BC = _rl_term_backspace = "\b";
      UP = _rl_term_up;
      UP = _rl_term_up;
 
 
      return 0;
      return 0;
    }
    }
 
 
  get_term_capabilities (&buffer);
  get_term_capabilities (&buffer);
 
 
  /* Set up the variables that the termcap library expects the application
  /* Set up the variables that the termcap library expects the application
     to provide. */
     to provide. */
  PC = _rl_term_pc ? *_rl_term_pc : 0;
  PC = _rl_term_pc ? *_rl_term_pc : 0;
  BC = _rl_term_backspace;
  BC = _rl_term_backspace;
  UP = _rl_term_up;
  UP = _rl_term_up;
 
 
  if (!_rl_term_cr)
  if (!_rl_term_cr)
    _rl_term_cr = "\r";
    _rl_term_cr = "\r";
 
 
  _rl_term_autowrap = tgetflag ("am") && tgetflag ("xn");
  _rl_term_autowrap = tgetflag ("am") && tgetflag ("xn");
 
 
  /* Allow calling application to set default height and width, using
  /* Allow calling application to set default height and width, using
     rl_set_screen_size */
     rl_set_screen_size */
  if (_rl_screenwidth <= 0 || _rl_screenheight <= 0)
  if (_rl_screenwidth <= 0 || _rl_screenheight <= 0)
    _rl_get_screen_size (tty, 0);
    _rl_get_screen_size (tty, 0);
 
 
  /* "An application program can assume that the terminal can do
  /* "An application program can assume that the terminal can do
      character insertion if *any one of* the capabilities `IC',
      character insertion if *any one of* the capabilities `IC',
      `im', `ic' or `ip' is provided."  But we can't do anything if
      `im', `ic' or `ip' is provided."  But we can't do anything if
      only `ip' is provided, so... */
      only `ip' is provided, so... */
  _rl_terminal_can_insert = (_rl_term_IC || _rl_term_im || _rl_term_ic);
  _rl_terminal_can_insert = (_rl_term_IC || _rl_term_im || _rl_term_ic);
 
 
  /* Check to see if this terminal has a meta key and clear the capability
  /* Check to see if this terminal has a meta key and clear the capability
     variables if there is none. */
     variables if there is none. */
  term_has_meta = (tgetflag ("km") || tgetflag ("MT"));
  term_has_meta = (tgetflag ("km") || tgetflag ("MT"));
  if (!term_has_meta)
  if (!term_has_meta)
    _rl_term_mm = _rl_term_mo = (char *)NULL;
    _rl_term_mm = _rl_term_mo = (char *)NULL;
 
 
#endif /* !__MSDOS__ */
#endif /* !__MSDOS__ */
 
 
  /* Attempt to find and bind the arrow keys.  Do not override already
  /* Attempt to find and bind the arrow keys.  Do not override already
     bound keys in an overzealous attempt, however. */
     bound keys in an overzealous attempt, however. */
 
 
  bind_termcap_arrow_keys (emacs_standard_keymap);
  bind_termcap_arrow_keys (emacs_standard_keymap);
 
 
#if defined (VI_MODE)
#if defined (VI_MODE)
  bind_termcap_arrow_keys (vi_movement_keymap);
  bind_termcap_arrow_keys (vi_movement_keymap);
  bind_termcap_arrow_keys (vi_insertion_keymap);
  bind_termcap_arrow_keys (vi_insertion_keymap);
#endif /* VI_MODE */
#endif /* VI_MODE */
 
 
  return 0;
  return 0;
}
}
 
 
/* Bind the arrow key sequences from the termcap description in MAP. */
/* Bind the arrow key sequences from the termcap description in MAP. */
static void
static void
bind_termcap_arrow_keys (map)
bind_termcap_arrow_keys (map)
     Keymap map;
     Keymap map;
{
{
  Keymap xkeymap;
  Keymap xkeymap;
 
 
  xkeymap = _rl_keymap;
  xkeymap = _rl_keymap;
  _rl_keymap = map;
  _rl_keymap = map;
 
 
  rl_bind_keyseq_if_unbound (_rl_term_ku, rl_get_previous_history);
  rl_bind_keyseq_if_unbound (_rl_term_ku, rl_get_previous_history);
  rl_bind_keyseq_if_unbound (_rl_term_kd, rl_get_next_history);
  rl_bind_keyseq_if_unbound (_rl_term_kd, rl_get_next_history);
  rl_bind_keyseq_if_unbound (_rl_term_kr, rl_forward_char);
  rl_bind_keyseq_if_unbound (_rl_term_kr, rl_forward_char);
  rl_bind_keyseq_if_unbound (_rl_term_kl, rl_backward_char);
  rl_bind_keyseq_if_unbound (_rl_term_kl, rl_backward_char);
 
 
  rl_bind_keyseq_if_unbound (_rl_term_kh, rl_beg_of_line);      /* Home */
  rl_bind_keyseq_if_unbound (_rl_term_kh, rl_beg_of_line);      /* Home */
  rl_bind_keyseq_if_unbound (_rl_term_at7, rl_end_of_line);     /* End */
  rl_bind_keyseq_if_unbound (_rl_term_at7, rl_end_of_line);     /* End */
 
 
  rl_bind_keyseq_if_unbound (_rl_term_kD, rl_delete);
  rl_bind_keyseq_if_unbound (_rl_term_kD, rl_delete);
 
 
  _rl_keymap = xkeymap;
  _rl_keymap = xkeymap;
}
}
 
 
char *
char *
rl_get_termcap (cap)
rl_get_termcap (cap)
     const char *cap;
     const char *cap;
{
{
  register int i;
  register int i;
 
 
  if (tcap_initialized == 0)
  if (tcap_initialized == 0)
    return ((char *)NULL);
    return ((char *)NULL);
  for (i = 0; i < NUM_TC_STRINGS; i++)
  for (i = 0; i < NUM_TC_STRINGS; i++)
    {
    {
      if (tc_strings[i].tc_var[0] == cap[0] && strcmp (tc_strings[i].tc_var, cap) == 0)
      if (tc_strings[i].tc_var[0] == cap[0] && strcmp (tc_strings[i].tc_var, cap) == 0)
        return *(tc_strings[i].tc_value);
        return *(tc_strings[i].tc_value);
    }
    }
  return ((char *)NULL);
  return ((char *)NULL);
}
}
 
 
/* Re-initialize the terminal considering that the TERM/TERMCAP variable
/* Re-initialize the terminal considering that the TERM/TERMCAP variable
   has changed. */
   has changed. */
int
int
rl_reset_terminal (terminal_name)
rl_reset_terminal (terminal_name)
     const char *terminal_name;
     const char *terminal_name;
{
{
  _rl_screenwidth = _rl_screenheight = 0;
  _rl_screenwidth = _rl_screenheight = 0;
  _rl_init_terminal_io (terminal_name);
  _rl_init_terminal_io (terminal_name);
  return 0;
  return 0;
}
}
 
 
/* A function for the use of tputs () */
/* A function for the use of tputs () */
#ifdef _MINIX
#ifdef _MINIX
void
void
_rl_output_character_function (c)
_rl_output_character_function (c)
     int c;
     int c;
{
{
  putc (c, _rl_out_stream);
  putc (c, _rl_out_stream);
}
}
#else /* !_MINIX */
#else /* !_MINIX */
int
int
_rl_output_character_function (c)
_rl_output_character_function (c)
     int c;
     int c;
{
{
  return putc (c, _rl_out_stream);
  return putc (c, _rl_out_stream);
}
}
#endif /* !_MINIX */
#endif /* !_MINIX */
 
 
/* Write COUNT characters from STRING to the output stream. */
/* Write COUNT characters from STRING to the output stream. */
void
void
_rl_output_some_chars (string, count)
_rl_output_some_chars (string, count)
     const char *string;
     const char *string;
     int count;
     int count;
{
{
  fwrite (string, 1, count, _rl_out_stream);
  fwrite (string, 1, count, _rl_out_stream);
}
}
 
 
/* Move the cursor back. */
/* Move the cursor back. */
int
int
_rl_backspace (count)
_rl_backspace (count)
     int count;
     int count;
{
{
  register int i;
  register int i;
 
 
#ifndef __MSDOS__
#ifndef __MSDOS__
  if (_rl_term_backspace)
  if (_rl_term_backspace)
    for (i = 0; i < count; i++)
    for (i = 0; i < count; i++)
      tputs (_rl_term_backspace, 1, _rl_output_character_function);
      tputs (_rl_term_backspace, 1, _rl_output_character_function);
  else
  else
#endif
#endif
    for (i = 0; i < count; i++)
    for (i = 0; i < count; i++)
      putc ('\b', _rl_out_stream);
      putc ('\b', _rl_out_stream);
  return 0;
  return 0;
}
}
 
 
/* Move to the start of the next line. */
/* Move to the start of the next line. */
int
int
rl_crlf ()
rl_crlf ()
{
{
#if defined (NEW_TTY_DRIVER)
#if defined (NEW_TTY_DRIVER)
  if (_rl_term_cr)
  if (_rl_term_cr)
    tputs (_rl_term_cr, 1, _rl_output_character_function);
    tputs (_rl_term_cr, 1, _rl_output_character_function);
#endif /* NEW_TTY_DRIVER */
#endif /* NEW_TTY_DRIVER */
  putc ('\n', _rl_out_stream);
  putc ('\n', _rl_out_stream);
  return 0;
  return 0;
}
}
 
 
/* Ring the terminal bell. */
/* Ring the terminal bell. */
int
int
rl_ding ()
rl_ding ()
{
{
  if (readline_echoing_p)
  if (readline_echoing_p)
    {
    {
      switch (_rl_bell_preference)
      switch (_rl_bell_preference)
        {
        {
        case NO_BELL:
        case NO_BELL:
        default:
        default:
          break;
          break;
        case VISIBLE_BELL:
        case VISIBLE_BELL:
#ifdef __MSDOS__
#ifdef __MSDOS__
          ScreenVisualBell ();
          ScreenVisualBell ();
          break;
          break;
#else
#else
          if (_rl_visible_bell)
          if (_rl_visible_bell)
            {
            {
              tputs (_rl_visible_bell, 1, _rl_output_character_function);
              tputs (_rl_visible_bell, 1, _rl_output_character_function);
              break;
              break;
            }
            }
          /* FALLTHROUGH */
          /* FALLTHROUGH */
#endif
#endif
        case AUDIBLE_BELL:
        case AUDIBLE_BELL:
          fprintf (stderr, "\007");
          fprintf (stderr, "\007");
          fflush (stderr);
          fflush (stderr);
          break;
          break;
        }
        }
      return (0);
      return (0);
    }
    }
  return (-1);
  return (-1);
}
}
 
 
/* **************************************************************** */
/* **************************************************************** */
/*                                                                  */
/*                                                                  */
/*              Controlling the Meta Key and Keypad                 */
/*              Controlling the Meta Key and Keypad                 */
/*                                                                  */
/*                                                                  */
/* **************************************************************** */
/* **************************************************************** */
 
 
void
void
_rl_enable_meta_key ()
_rl_enable_meta_key ()
{
{
#if !defined (__DJGPP__)
#if !defined (__DJGPP__)
  if (term_has_meta && _rl_term_mm)
  if (term_has_meta && _rl_term_mm)
    tputs (_rl_term_mm, 1, _rl_output_character_function);
    tputs (_rl_term_mm, 1, _rl_output_character_function);
#endif
#endif
}
}
 
 
void
void
_rl_control_keypad (on)
_rl_control_keypad (on)
     int on;
     int on;
{
{
#if !defined (__DJGPP__)
#if !defined (__DJGPP__)
  if (on && _rl_term_ks)
  if (on && _rl_term_ks)
    tputs (_rl_term_ks, 1, _rl_output_character_function);
    tputs (_rl_term_ks, 1, _rl_output_character_function);
  else if (!on && _rl_term_ke)
  else if (!on && _rl_term_ke)
    tputs (_rl_term_ke, 1, _rl_output_character_function);
    tputs (_rl_term_ke, 1, _rl_output_character_function);
#endif
#endif
}
}
 
 
/* **************************************************************** */
/* **************************************************************** */
/*                                                                  */
/*                                                                  */
/*                      Controlling the Cursor                      */
/*                      Controlling the Cursor                      */
/*                                                                  */
/*                                                                  */
/* **************************************************************** */
/* **************************************************************** */
 
 
/* Set the cursor appropriately depending on IM, which is one of the
/* Set the cursor appropriately depending on IM, which is one of the
   insert modes (insert or overwrite).  Insert mode gets the normal
   insert modes (insert or overwrite).  Insert mode gets the normal
   cursor.  Overwrite mode gets a very visible cursor.  Only does
   cursor.  Overwrite mode gets a very visible cursor.  Only does
   anything if we have both capabilities. */
   anything if we have both capabilities. */
void
void
_rl_set_cursor (im, force)
_rl_set_cursor (im, force)
     int im, force;
     int im, force;
{
{
#ifndef __MSDOS__
#ifndef __MSDOS__
  if (_rl_term_ve && _rl_term_vs)
  if (_rl_term_ve && _rl_term_vs)
    {
    {
      if (force || im != rl_insert_mode)
      if (force || im != rl_insert_mode)
        {
        {
          if (im == RL_IM_OVERWRITE)
          if (im == RL_IM_OVERWRITE)
            tputs (_rl_term_vs, 1, _rl_output_character_function);
            tputs (_rl_term_vs, 1, _rl_output_character_function);
          else
          else
            tputs (_rl_term_ve, 1, _rl_output_character_function);
            tputs (_rl_term_ve, 1, _rl_output_character_function);
        }
        }
    }
    }
#endif
#endif
}
}
 
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.