/** @file
  Implementation of translation upon PC ANSI.

Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
Copyright (c) 2025, Loongson Technology Corporation Limited. All rights reserved.<BR>
SPDX-License-Identifier: BSD-2-Clause-Patent

**/

#include "Terminal.h"

/**
  Translate all raw data in the Raw FIFO into unicode, and insert
  them into Unicode FIFO.

  @param TerminalDevice          The terminal device.

**/
VOID
AnsiRawDataToUnicode (
  IN  TERMINAL_DEV  *TerminalDevice
  )
{
  UINT8  RawData;

  //
  // pop the raw data out from the raw fifo,
  // and translate it into unicode, then push
  // the unicode into unicode fifo, until the raw fifo is empty.
  //
  while (!IsRawFiFoEmpty (TerminalDevice) && !IsUnicodeFiFoFull (TerminalDevice)) {
    RawFiFoRemoveOneKey (TerminalDevice, &RawData);

    UnicodeFiFoInsertOneKey (TerminalDevice, (UINT16)RawData);
  }
}

/**
  Check if input string is valid Ascii string, valid EFI control characters,
  wide/narrow character or valid text graphics.

  @param  TerminalDevice          The terminal device.
  @param  WString                 The input string.

  @retval EFI_UNSUPPORTED         If not all input characters are valid.
  @retval EFI_SUCCESS             If all input characters are valid.

**/
EFI_STATUS
AnsiTestString (
  IN  TERMINAL_DEV  *TerminalDevice,
  IN  CHAR16        *WString
  )
{
  CHAR8  GraphicChar;

  //
  // support four kind of character:
  // valid ascii, valid efi control char, wide/narrow char, valid text graphics.
  //
  for ( ; *WString != CHAR_NULL; WString++) {
    if ((*WString == WIDE_CHAR) || (*WString == NARROW_CHAR)) {
      continue;
    }

    if ( !(TerminalIsValidAscii (*WString) ||
           TerminalIsValidEfiCntlChar (*WString) ||
           TerminalIsValidTextGraphics (*WString, &GraphicChar, NULL)))
    {
      return EFI_UNSUPPORTED;
    }
  }

  return EFI_SUCCESS;
}
