Adds a subset of the terminal I/O capabilities described in the Single Unix Specification, V4.
Supports:
    Erase previous character.  Default is Backspace or ^H
    Erase line.  Default is ^U
TAB characters are supported and, by default, are rendered as 8 spaces.  They will still be read as a single TAB character.
Both Canonical and Non-Canonical modes are supported.
If a terminal device is opened with O_TTY_INIT in the mode, the device will be initialized to "sane" values for interactive use.  It will be in Canonical mode, Enter will be translated to NewLine and on output, a NewLine is translated to CRLF.  Echoing will be on, control characters are output as ^X, and TABs are expanded.
See the new <sys/termios.h> file for more information.
Contributed-under: TianoCore Contribution Agreement 1.0
Signed-off-by:  daryl.mcdaniel@intel.com
Reviewed-by:    erik.c.bjorge@intel.com
Reviewed-by:    leroy.p.leahy@intel.com
Reviewed-by:    lee.g.rosenbaum@intel.com
Reviewed-by:    jaben.carsey@intel.com
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13989 6f19259b-4bc3-4df7-8a09-765794883524
		
	
		
			
				
	
	
		
			142 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			142 lines
		
	
	
		
			4.4 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/** @file
 | 
						|
  Echo characters to an Interactive I/O Output device.
 | 
						|
 | 
						|
  The functions assume that isatty() is TRUE at the time they are called.
 | 
						|
  Since the UEFI console is a WIDE character device, these functions do all
 | 
						|
  processing using wide characters.
 | 
						|
 | 
						|
  It is the responsibility of the caller, or higher level function, to perform
 | 
						|
  any necessary translation between wide and narrow characters.
 | 
						|
 | 
						|
  Copyright (c) 2012, Intel Corporation. All rights reserved.<BR>
 | 
						|
  This program and the accompanying materials are licensed and made available
 | 
						|
  under the terms and conditions of the BSD License which accompanies this
 | 
						|
  distribution.  The full text of the license may be found at
 | 
						|
  http://opensource.org/licenses/bsd-license.php.
 | 
						|
 | 
						|
  THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
 | 
						|
  WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 | 
						|
**/
 | 
						|
#include  <Uefi.h>
 | 
						|
 | 
						|
#include  <LibConfig.h>
 | 
						|
 | 
						|
#include  <assert.h>
 | 
						|
#include  <errno.h>
 | 
						|
#include  <sys/termios.h>
 | 
						|
#include  <Device/IIO.h>
 | 
						|
#include  "IIOutilities.h"
 | 
						|
#include  "IIOechoCtrl.h"
 | 
						|
 | 
						|
/** Echo one character to an IIO file.
 | 
						|
 | 
						|
    If character InCh is a special "echo control" character, process it and output
 | 
						|
    the resultant character(s), if any.  Otherwise pass the character on to the
 | 
						|
    IIO_WriteOne() function which performs generic output processing, if needed.
 | 
						|
 | 
						|
    @param[in]    filp        Pointer to an open IIO file's file descriptor structure.
 | 
						|
    @param[in]    InCh        The wide character to be echoed.
 | 
						|
    @param[in]    EchoIsOK    A flag indicating whether echoing is appropriate for this
 | 
						|
                              device or not.
 | 
						|
 | 
						|
    @retval   -1    The filp argument does not refer to an IIO device.
 | 
						|
                    Global value errno is set to EINVAL.
 | 
						|
    @retval   >=0   The number of characters actually output.
 | 
						|
 | 
						|
    @sa   IIO_WriteOne
 | 
						|
**/
 | 
						|
ssize_t
 | 
						|
IIO_EchoOne (
 | 
						|
  struct __filedes     *filp,
 | 
						|
  wchar_t               InCh,
 | 
						|
  BOOLEAN               EchoIsOK
 | 
						|
  )
 | 
						|
{
 | 
						|
  cIIO       *This;
 | 
						|
  cFIFO      *OutBuf;
 | 
						|
  cFIFO      *InBuf;
 | 
						|
  UINT8      *AttrBuf;
 | 
						|
  ssize_t     NumEcho;
 | 
						|
  tcflag_t    LFlags;
 | 
						|
  UINT32      AttrDex;
 | 
						|
  int         i;
 | 
						|
 | 
						|
  NumEcho = -1;
 | 
						|
  This    = filp->devdata;
 | 
						|
 | 
						|
  if(This != NULL) {
 | 
						|
    LFlags  = This->Termio.c_lflag;
 | 
						|
    OutBuf  = This->OutBuf;
 | 
						|
    InBuf   = This->InBuf;
 | 
						|
    AttrBuf = This->AttrBuf;
 | 
						|
    AttrDex = InBuf->GetWDex(InBuf);
 | 
						|
 | 
						|
    switch(InCh) {
 | 
						|
      case IIO_ECHO_DISCARD:
 | 
						|
        // Do not buffer or otherwise process
 | 
						|
        NumEcho = 0;
 | 
						|
        break;
 | 
						|
 | 
						|
      case IIO_ECHO_ERASE:
 | 
						|
        // Delete last character from InBuf
 | 
						|
        if(!InBuf->IsEmpty(InBuf)) {
 | 
						|
          (void)InBuf->Truncate(InBuf);
 | 
						|
 | 
						|
          // Erase screen character(s) based on Attrib value
 | 
						|
          if(LFlags & ECHO) {
 | 
						|
            AttrDex = (UINT32)ModuloDecrement(AttrDex, InBuf->NumElements);
 | 
						|
            NumEcho = AttrBuf[AttrDex];
 | 
						|
            for(i = 0; i < NumEcho; ++i) {
 | 
						|
              (void)IIO_WriteOne(filp, OutBuf, CHAR_BACKSPACE);
 | 
						|
            }
 | 
						|
            if(LFlags & ECHOE) {
 | 
						|
              for(i = 0; i < NumEcho; ++i) {
 | 
						|
                (void)IIO_WriteOne(filp, OutBuf, L' ');
 | 
						|
              }
 | 
						|
              for(i = 0; i < NumEcho; ++i) {
 | 
						|
                (void)IIO_WriteOne(filp, OutBuf, CHAR_BACKSPACE);
 | 
						|
              }
 | 
						|
            }
 | 
						|
          }
 | 
						|
          else {
 | 
						|
            NumEcho = 0;
 | 
						|
          }
 | 
						|
        }
 | 
						|
        break;
 | 
						|
 | 
						|
      case IIO_ECHO_KILL:
 | 
						|
        // Flush contents of InBuf and OutBuf
 | 
						|
        InBuf->Flush(InBuf, (size_t)-1);
 | 
						|
        OutBuf->Flush(OutBuf, (size_t)-1);
 | 
						|
 | 
						|
        // Erase characters from screen.
 | 
						|
        if(LFlags & ECHOE) {
 | 
						|
          NumEcho = IIO_CursorDelta(This, &This->InitialXY, &This->CurrentXY);
 | 
						|
          for(i = 0; i < NumEcho; ++i) {
 | 
						|
            (void)IIO_WriteOne(filp, OutBuf, L' ');
 | 
						|
          }
 | 
						|
        }
 | 
						|
        break;
 | 
						|
 | 
						|
      default:
 | 
						|
        // Add character to input buffer
 | 
						|
        (void)InBuf->Write(InBuf, &InCh, 1);
 | 
						|
 | 
						|
        NumEcho = 0;  // In case echoing is not enabled or OK
 | 
						|
        // If echoing is OK and enabled, "echo" character using IIO_WriteOne
 | 
						|
        if( EchoIsOK                &&
 | 
						|
            ( (LFlags & ECHO)       ||
 | 
						|
              ((LFlags & ECHONL) && (InCh == CHAR_LINEFEED))))
 | 
						|
        {
 | 
						|
          NumEcho = IIO_WriteOne(filp, OutBuf, InCh);
 | 
						|
        }
 | 
						|
        AttrBuf[AttrDex] = (UINT8)NumEcho;
 | 
						|
        break;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  else {
 | 
						|
    errno = EINVAL;
 | 
						|
  }
 | 
						|
  return NumEcho;
 | 
						|
}
 |