278 lines
4.8 KiB
C
278 lines
4.8 KiB
C
/****************************************************************/
|
|
/* */
|
|
/* ic_input.c */
|
|
/* */
|
|
/* Character input routines for the */
|
|
/* "Integer Calculator". */
|
|
/* */
|
|
/****************************************************************/
|
|
/* origination 1988-Apr-7 Terrence W. Holm */
|
|
/* added cmd line args 1988-May-13 Terrence W. Holm */
|
|
/****************************************************************/
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
#include <ctype.h>
|
|
#include <sgtty.h>
|
|
|
|
#include "ic.h"
|
|
|
|
static struct sgttyb saved_mode;
|
|
static struct tchars saved_chars;
|
|
|
|
|
|
|
|
|
|
/****************************************************************/
|
|
/* */
|
|
/* Save_Term() */
|
|
/* */
|
|
/* Save the current terminal characteristics. */
|
|
/* */
|
|
/****************************************************************/
|
|
|
|
|
|
Save_Term()
|
|
|
|
{
|
|
ioctl( 0, TIOCGETP, &saved_mode );
|
|
ioctl( 0, TIOCGETC, (struct sgttyb *) &saved_chars );
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/****************************************************************/
|
|
/* */
|
|
/* Set_Term() */
|
|
/* */
|
|
/* Set up the terminal characteristics for ic. */
|
|
/* */
|
|
/****************************************************************/
|
|
|
|
|
|
Set_Term()
|
|
|
|
{
|
|
struct sgttyb ic_mode;
|
|
struct tchars ic_chars;
|
|
|
|
ic_mode = saved_mode;
|
|
ic_chars = saved_chars;
|
|
|
|
|
|
/* No tab expansion, no echo, cbreak mode */
|
|
|
|
ic_mode.sg_flags = ic_mode.sg_flags & ~XTABS & ~ECHO | CBREAK;
|
|
|
|
|
|
/* Change the interrupt character to ^C, ignore ^S & ^Q */
|
|
|
|
ic_chars.t_intrc = '\003';
|
|
ic_chars.t_startc = '\377';
|
|
ic_chars.t_stopc = '\377';
|
|
|
|
ioctl( 0, TIOCSETP, &ic_mode );
|
|
ioctl( 0, TIOCSETC, (struct sgttyb *) &ic_chars );
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/****************************************************************/
|
|
/* */
|
|
/* Reset_Term() */
|
|
/* */
|
|
/* Restore the terminal characteristics. */
|
|
/* */
|
|
/****************************************************************/
|
|
|
|
|
|
Reset_Term()
|
|
|
|
{
|
|
ioctl( 0, TIOCSETP, &saved_mode );
|
|
ioctl( 0, TIOCSETC, (struct sgttyb *) &saved_chars );
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/****************************************************************/
|
|
/* */
|
|
/* Get_Char() */
|
|
/* */
|
|
/* Return the next input character. Upper case */
|
|
/* is mapped to lower case. Escape sequences */
|
|
/* are mapped to special codes (msb set). */
|
|
/* */
|
|
/****************************************************************/
|
|
|
|
|
|
int Get_Char()
|
|
|
|
{
|
|
int c;
|
|
|
|
|
|
/* fflush() used because Minix does not automatically */
|
|
/* flush the output. */
|
|
|
|
fflush( stdout );
|
|
|
|
|
|
if ( (c = Getc()) == EOF )
|
|
return( EOF );
|
|
|
|
c &= 0x7f;
|
|
|
|
|
|
if ( isupper(c) )
|
|
return( tolower(c) );
|
|
|
|
|
|
if ( c == ESCAPE )
|
|
if ( (c=Getc()) != '[' )
|
|
{
|
|
ungetc( c, stdin );
|
|
return( ESCAPE );
|
|
}
|
|
else
|
|
{
|
|
c = Getc() | 0x80;
|
|
|
|
if ( c == ESC_HOME || c == ESC_UP || c == ESC_PGUP ||
|
|
c == ESC_LEFT || c == ESC_5 || c == ESC_RIGHT ||
|
|
c == ESC_END || c == ESC_DOWN || c == ESC_PGDN ||
|
|
c == ESC_PLUS || c == ESC_MINUS )
|
|
return( c );
|
|
else
|
|
return( ESCAPE );
|
|
}
|
|
|
|
|
|
return( c );
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/****************************************************************/
|
|
/* */
|
|
/* Init_Getc( argc, argv ) */
|
|
/* */
|
|
/* Give Getc() references to the command line */
|
|
/* arguments. */
|
|
/* */
|
|
/****************************************************************/
|
|
|
|
|
|
|
|
static int args_remaining;
|
|
static char **args_pointer;
|
|
static int args_index;
|
|
|
|
|
|
|
|
Init_Getc( argc, argv )
|
|
int argc;
|
|
char *argv[];
|
|
|
|
{
|
|
args_remaining = argc - 1;
|
|
args_pointer = &argv[1];
|
|
args_index = 0;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/****************************************************************/
|
|
/* */
|
|
/* Getc() */
|
|
/* */
|
|
/* Get the next input character from the command */
|
|
/* line if there is some more, else from stdin. */
|
|
/* */
|
|
/****************************************************************/
|
|
|
|
|
|
int Getc()
|
|
|
|
{
|
|
int c;
|
|
|
|
if ( args_remaining > 0 )
|
|
if ( (c = args_pointer[ 0 ][ args_index++ ]) == '\0' )
|
|
{
|
|
--args_remaining;
|
|
++args_pointer;
|
|
args_index = 0;
|
|
|
|
if ( args_remaining > 0 )
|
|
return( '\n' );
|
|
}
|
|
else
|
|
return( c );
|
|
|
|
return( getchar() );
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/****************************************************************/
|
|
/* */
|
|
/* Get_Base( character ) */
|
|
/* */
|
|
/* Return an appropriate base number for the */
|
|
/* given character code. Used by 'i' and 'o'. */
|
|
/* */
|
|
/****************************************************************/
|
|
|
|
|
|
int Get_Base( code )
|
|
char code;
|
|
|
|
{
|
|
switch ( code )
|
|
{
|
|
case 'h' : return( HEXADECIMAL );
|
|
|
|
case 'd' : return( DECIMAL );
|
|
|
|
case 'o' : return( OCTAL );
|
|
|
|
case 'b' : return( BINARY );
|
|
|
|
case 'a' : return( ASCII );
|
|
|
|
default : return( ERROR );
|
|
}
|
|
}
|