StdLib: Add terminal type line editing (Interactive IO) for console devices.
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
This commit is contained in:
149
StdLib/LibC/Containers/Common/ModuloUtil.c
Normal file
149
StdLib/LibC/Containers/Common/ModuloUtil.c
Normal file
@@ -0,0 +1,149 @@
|
||||
/** @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;
|
||||
}
|
Reference in New Issue
Block a user