/*++

Copyright (c)  2004-2006 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.


Module Name:

  PrintLibInternal.c

Abstract:

  Print Library worker functions.

--*/

#include <Common/UefiBaseTypes.h>
#include <Library/PrintLib.h>

#include "CommonLib.h"
#include "PrintLibInternal.h"

static CONST CHAR8 mHexStr[] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};

CHAR8 *
BasePrintLibFillBuffer (
  CHAR8   *Buffer,
  INTN    Length,
  UINTN   Character,
  INTN    Increment
  )
{
  INTN  Index;

  for (Index = 0; Index < Length; Index++) {
    *Buffer       =  (CHAR8) Character;
    *(Buffer + 1) =  (CHAR8) (Character >> 8);
    Buffer        += Increment;
  }
  return Buffer;
}

/**
  Print worker function that prints a Value as a decimal number in Buffer.

  @param  Buffer Location to place the Unicode or ASCII string of Value.

  @param  Value Value to convert to a Decimal or Hexidecimal string in Buffer.

  @param  Flags Flags to use in printing string, see file header for details.

  @param  Precision Minimum number of digits to return in the ASCII string

  @return Number of characters printed.

**/
UINTN
EFIAPI
BasePrintLibValueToString (
  IN OUT CHAR8  *Buffer,
  IN INT64      Value,
  IN UINTN      Radix
  )
{
  UINTN   Digits;
  UINT32  Remainder;

  //
  // Loop to convert one digit at a time in reverse order
  //
  *(Buffer++) = 0;
  Digits = 0;
  do {
    // Value = (INT64)DivU64x32Remainder ((UINT64)Value, (UINT32)Radix, &Remainder);
    Remainder = (UINT64)Value % (UINT32)Radix;
    Value = (UINT64)Value / (UINT32)Radix;
    *(Buffer++) = mHexStr[Remainder];
    Digits++;
  } while (Value != 0);
  return Digits;
}

UINTN
BasePrintLibConvertValueToString (
  IN OUT CHAR8   *Buffer,
  IN UINTN       Flags,
  IN INT64       Value,
  IN UINTN       Width,
  IN UINTN       Increment
  )
{
  CHAR8  *OriginalBuffer;
  CHAR8  ValueBuffer[MAXIMUM_VALUE_CHARACTERS];
  UINTN  Count;
  UINTN  Digits;
  UINTN  Index;

  OriginalBuffer = Buffer;

  if (Width == 0 || (Flags & COMMA_TYPE) != 0) {
    Flags &= (~PREFIX_ZERO);
  }

  if (Width == 0 || Width > (MAXIMUM_VALUE_CHARACTERS - 1)) {
    Width = MAXIMUM_VALUE_CHARACTERS - 1;
  }

  if (Value < 0) {
    Value = -Value;
    Buffer = BasePrintLibFillBuffer (Buffer, 1, '-', Increment);
  }

  Count = BasePrintLibValueToString (ValueBuffer, Value, 10);

  if ((Flags & PREFIX_ZERO) != 0) {
    Buffer = BasePrintLibFillBuffer (Buffer, Width - Count, '0', Increment);
  }

  Digits = 3 - (Count % 3);
  for (Index = 0; Index < Count; Index++) {
    Buffer = BasePrintLibFillBuffer (Buffer, 1, ValueBuffer[Count - Index], Increment);
    if ((Flags & COMMA_TYPE) != 0) {
      Digits++;
      if (Digits == 3) {
        Digits = 0;
        if ((Index + 1) < Count) {
          Buffer = BasePrintLibFillBuffer (Buffer, 1, ',', Increment);
        }
      }
    }
  }

  Buffer = BasePrintLibFillBuffer (Buffer, 1, 0, Increment);

  return ((Buffer - OriginalBuffer) / Increment);
}
