From 6c6c850ad62d6fdc73828057339be1dc7df37c8e Mon Sep 17 00:00:00 2001 From: darylm503 Date: Tue, 11 Dec 2012 21:19:14 +0000 Subject: 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 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 --- StdLib/LibC/Containers/Common/ModuloUtil.c | 149 +++++++++++++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 StdLib/LibC/Containers/Common/ModuloUtil.c (limited to 'StdLib/LibC/Containers/Common/ModuloUtil.c') diff --git a/StdLib/LibC/Containers/Common/ModuloUtil.c b/StdLib/LibC/Containers/Common/ModuloUtil.c new file mode 100644 index 0000000000..5f75698bd6 --- /dev/null +++ b/StdLib/LibC/Containers/Common/ModuloUtil.c @@ -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.
+ 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 +#include +#include + +/** 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; +} -- cgit v1.2.3