mirror of
				https://github.com/acidanthera/audk.git
				synced 2025-10-27 01:03:45 +01:00 
			
		
		
		
	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
		
	
			
		
			
				
	
	
		
			150 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			150 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| /** @file
 | |
|     Utility functions for performing basic math operations constrained within a
 | |
|     modulus.
 | |
| 
 | |
|     These functions are intended to simplify small changes to a value which much
 | |
|     remain within a specified modulus.
 | |
| 
 | |
|   NOTE: Changes must be less than or equal to the modulus specified by MaxVal.
 | |
| 
 | |
|     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>
 | |
| 
 | |
| /** Counter = (Counter + 1) % MaxVal;
 | |
| 
 | |
|     Counter is always expected to be LESS THAN MaxVal.
 | |
|         0 <= Counter < MaxVal
 | |
| 
 | |
|     @param[in]    Counter   The value to be incremented.
 | |
|     @param[in]    MaxVal    Modulus of the operation.
 | |
| 
 | |
|     @return   Returns the result of incrementing Counter, modulus MaxVal.
 | |
|               If Counter >= MaxVal, returns -1.
 | |
| **/
 | |
| INT32
 | |
| EFIAPI
 | |
| ModuloIncrement(
 | |
|   UINT32  Counter,
 | |
|   UINT32  MaxVal
 | |
|   )
 | |
| {
 | |
|   INT32  Temp;
 | |
| 
 | |
|   if(Counter < MaxVal) {
 | |
|     Temp = (INT32)(Counter + 1);
 | |
|     if(Temp >= (INT32)MaxVal) {
 | |
|       Temp = 0;
 | |
|     }
 | |
|   }
 | |
|   else {
 | |
|     Temp = -1;
 | |
|   }
 | |
|   return Temp;
 | |
| }
 | |
| 
 | |
| /** Counter = (Counter - 1) % MaxVal;
 | |
| 
 | |
|     Counter is always expected to be LESS THAN MaxVal.
 | |
|         0 <= Counter < MaxVal
 | |
| 
 | |
|     @param[in]    Counter   The value to be decremented.
 | |
|     @param[in]    MaxVal    Modulus of the operation.
 | |
| 
 | |
|     @return   Returns the result of decrementing Counter, modulus MaxVal.
 | |
|               If Counter >= MaxVal, returns -1.
 | |
| **/
 | |
| INT32
 | |
| EFIAPI
 | |
| ModuloDecrement(
 | |
|   UINT32  Counter,
 | |
|   UINT32  MaxVal
 | |
|   )
 | |
| {
 | |
|   INT32  Temp;
 | |
| 
 | |
|   if(Counter < MaxVal) {
 | |
|     Temp = (INT32)Counter - 1;
 | |
|     // If Counter is zero, Temp will become -1.
 | |
|     if(Temp < 0) {
 | |
|       Temp = (INT32)MaxVal - 1;
 | |
|     }
 | |
|   }
 | |
|   else {
 | |
|     Temp = -1;
 | |
|   }
 | |
| 
 | |
|   return Temp;
 | |
| }
 | |
| 
 | |
| /** Decrement Counter but don't decrement past zero.
 | |
| 
 | |
|     @param[in]    Counter   The value to be decremented.
 | |
| 
 | |
|     @return   Returns the result of decrementing Counter.
 | |
| **/
 | |
| UINT32
 | |
| EFIAPI
 | |
| BoundDecrement(
 | |
|   UINT32  Counter
 | |
|   )
 | |
| {
 | |
|   return ((Counter > 0) ? (Counter - 1) : 0);
 | |
| }
 | |
| 
 | |
| /** Increment Counter but don't increment past MaxVal.
 | |
|     Counter should be maintained in the range (0 <= Counter < MaxVal).
 | |
| 
 | |
|     @param[in]    Counter   The value to be decremented.
 | |
|     @param[in]    MaxVal    The upper bound for Counter.
 | |
| 
 | |
|     @return   Returns the result of incrementing Counter.
 | |
| **/
 | |
| UINT32
 | |
| EFIAPI
 | |
| BoundIncrement(
 | |
|   UINT32  Counter,
 | |
|   UINT32  MaxVal
 | |
|   )
 | |
| {
 | |
|   return ((Counter < (MaxVal - 1)) ? (Counter + 1) : (MaxVal - 1));
 | |
| }
 | |
| 
 | |
| /** Counter = (Counter + Increment) % MaxVal;
 | |
| 
 | |
|     @param[in]    Counter   The value to be incremented.
 | |
|     @param[in]    Increment The value to add to Counter.
 | |
|     @param[in]    MaxVal    Modulus of the operation.
 | |
| 
 | |
|     @return   Returns the result of adding Increment to Counter, modulus MaxVal,
 | |
|               or -1 if Increment is larger than MaxVal.
 | |
| **/
 | |
| INT32
 | |
| EFIAPI
 | |
| ModuloAdd (
 | |
|   UINT32  Counter,
 | |
|   UINT32  Increment,
 | |
|   UINT32  MaxVal
 | |
|   )
 | |
| {
 | |
|   UINT32   Temp;
 | |
| 
 | |
|   if(Increment > MaxVal) {
 | |
|     return -1;
 | |
|   }
 | |
|   Temp = (Counter + Increment);
 | |
|   while(Temp >= MaxVal) {
 | |
|     Temp -= MaxVal;
 | |
|   }
 | |
|   return Temp;
 | |
| }
 |