static char rcsid[] = "@(#)$Id: init.c,v 1.5 2006/04/09 07:37:37 hurtta Exp $";

/******************************************************************************
 *  The Elm (ME+) Mail System  -  $Revision: 1.5 $   $State: Exp $
 *
 *  Modified by: Kari Hurtta <hurtta+elm@posti.FMI.FI> 
 *                           (was hurtta+elm@ozone.FMI.FI)
 ******************************************************************************
 * Most of code copied from src/init.c. It have following copyright:
 *
 *  The Elm Mail System 
 *
 *			Copyright (c) 1988-1992 USENET Community Trust
 *			Copyright (c) 1986,1987 Dave Taylor
 *****************************************************************************/

#include "def_screen.h"

DEBUG_VAR(Debug,__FILE__,"screen");

#include <errno.h>
#ifndef ANSI_C
extern int errno;		/* system error number on failure */
#endif       


#ifdef TERMIOS
#  include <termios.h>
   typedef struct termios term_buff;
#else
# ifdef TERMIO
#  include <termio.h>
#  define tcgetattr(fd,buf)	ioctl((fd),TCGETA,(buf))
   typedef struct termio term_buff;
# else
#  include <sgtty.h>
typedef struct {
  struct sgttyb sgttyb;
  struct tchars tchars;
#ifdef TIOCLGET
  struct ltchars ltchars;
#endif
} term_buff;
static int tcgetattr P_((int,term_buff *));  /* Prototype */
# endif
#endif

char backspace,			/* the current backspace char */

     kill_line,			/* the current kill-line char */
     word_erase,		/* the current word-erase char */
     interrupt_char,		/* the current interrupt char */
     reprint_char,		/* the current reprint-line char */
     eof_char;			/* the current end-of-file char */

char VQUIT_char,                /* the current quit char */
    VSUSP_char;                 /* the current suspend char */

void get_term_chars(fd)
     int fd;
{
    /** This routine sucks out the special terminal characters
	ERASE and KILL for use in the input routine.  The meaning 
	of the characters are (dare I say it?) fairly obvious... **/
    
    term_buff term_buffer;
    
    if (tcgetattr(fd,&term_buffer) == -1) {
	int err = errno;

	DPRINT(Debug,3,
	       (&Debug, 
		"Error: %s encountered on ioctl call (get_term_chars, fd=%d)\n", 
		error_description(err), fd));

	/* set to defaults for terminal driver */
	backspace = BACKSPACE;
	kill_line = ctrl('U');
	word_erase = ctrl('W');
	interrupt_char = 0177;	/* DEL */
	reprint_char = ctrl('R');
	eof_char   = ctrl('D');
	VQUIT_char = 034;       /* Ctrl \ */
	VSUSP_char = ctrl('Z');
    } else {
#if defined(TERMIO) || defined(TERMIOS)
	backspace = term_buffer.c_cc[VERASE];
	kill_line = term_buffer.c_cc[VKILL];
#if   defined(TERMIOS) && defined(VWERASE)
	word_erase = term_buffer.c_cc[VWERASE];
#else
	word_erase = ctrl('W');
#endif
	interrupt_char = term_buffer.c_cc[VINTR];
#if defined(TERMIOS) && defined(VREPRINT)
	reprint_char = term_buffer.c_cc[VREPRINT];
#else
	reprint_char = ctrl('R');
#endif
	eof_char = term_buffer.c_cc[VEOF];
#else
	backspace = term_buffer.sgttyb.sg_erase;
	kill_line = term_buffer.sgttyb.sg_kill;
#ifdef     TIOCLGET
	word_erase = term_buffer.ltchars.t_werasc;
	reprint_char = term_buffer.ltchars.t_rprntc;
#else
	word_erase = ctrl('W');
	reprint_char = ctrl('R');
#endif
	interrupt_char = term_buffer.tchars.t_intrc;
	eof_char = term_buffer.tchars.t_eofc;
#endif

#if defined(TERMIOS)
	VQUIT_char = term_buffer.c_cc[VQUIT];
	VSUSP_char = term_buffer.c_cc[VSUSP];
#else
	VQUIT_char = 034;       /* Ctrl \ */
	VSUSP_char = ctrl('Z');
#endif
    }

    DPRINT(Debug,4,
	   (&Debug,"get_term_chars(%d): \n\
    backspace      %3d\n\
    kill_line      %3d\n\
    word_erase     %3d\n\
    interrupt_char %3d\n\
    reprint_char   %3d\n\
    eof_char       %3d\n\
",
	    fd,
	    backspace,
	    kill_line,
	    word_erase,
	    interrupt_char,
	    reprint_char,
	    eof_char));
    
}

#if !defined(TERMIO) && !defined(TERMIOS)
static int
tcgetattr(fd, buf)
     int fd;
     term_buff *buf;
{
    if (ioctl(fd, TIOCGETP, &buf->sgttyb) < 0)
	return(-1);
    if (ioctl(fd, TIOCGETC, &buf->tchars) < 0)
	return(-1);
#ifdef TIOCLGET
    if (ioctl(fd, TIOCLGET, &buf->ltchars) < 0)
	return(-1);
#endif
    return(0);
}
#endif


/*
 * Local Variables:
 *  mode:c
 *  c-basic-offset:4
 *  buffer-file-coding-system: iso-8859-1
 * End:
 */


syntax highlighted by Code2HTML, v. 0.9.1