public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Samer El-Haj-Mahmoud" <samer.el-haj-mahmoud@arm.com>
To: "Chang, Abner (HPS SW/FW Technologist)" <abner.chang@hpe.com>,
	"devel@edk2.groups.io" <devel@edk2.groups.io>
Cc: Liming Gao <gaoliming@byosoft.com.cn>,
	Leif Lindholm <leif@nuviainc.com>,
	"Wang, Nickle (HPS SW)" <nickle.wang@hpe.com>,
	"O'Hanley, Peter (EXL)" <peter.ohanley@hpe.com>,
	Samer El-Haj-Mahmoud <Samer.El-Haj-Mahmoud@arm.com>
Subject: Re: [edk2-devel] [PATCH v5 1/6] RedfishPkg/Ucs2Utf8lib: UCS2 to UFT8 manipulation library
Date: Thu, 10 Dec 2020 16:43:21 +0000	[thread overview]
Message-ID: <DB7PR08MB326050AB9AF2710E0F02066190CB0@DB7PR08MB3260.eurprd08.prod.outlook.com> (raw)
In-Reply-To: <CS1PR8401MB1144DA6FCFE983729AC35E74FFCB0@CS1PR8401MB1144.NAMPRD84.PROD.OUTLOOK.COM>

Nah, no fight necessary 😊 Apologies for missing the earlier conversation. I guess moving it to MdeModulePkg in the future (when there are more use cases) is fine. I just remember the topic of handling UTF8 in EDK2 coming up in various forums and was pleasantly surprised to see the patch. Thanks for submitting it.

--Samer



> -----Original Message-----
> From: Chang, Abner (HPS SW/FW Technologist) <abner.chang@hpe.com>
> Sent: Thursday, December 10, 2020 9:27 AM
> To: Samer El-Haj-Mahmoud <Samer.El-Haj-Mahmoud@arm.com>;
> devel@edk2.groups.io
> Cc: Liming Gao <gaoliming@byosoft.com.cn>; Leif Lindholm
> <leif@nuviainc.com>; Wang, Nickle (HPS SW) <nickle.wang@hpe.com>;
> O'Hanley, Peter (EXL) <peter.ohanley@hpe.com>
> Subject: RE: [edk2-devel] [PATCH v5 1/6] RedfishPkg/Ucs2Utf8lib: UCS2 to
> UFT8 manipulation library
>
> Hah hah Samer, this file was originally went with JsonLib. Leif suggested to
> move UCS2-UTF8  functions to a separated lib under MdeModulePkg which
> was a good idea as you mentioned. However the package steward would like
> to keep this library in RedfishPkg and move it to under MdeModulePkg until
> more use cases request this lib, this makes sense as well.
> I think we need a fight :)
> Abner
>
> > -----Original Message-----
> > From: Samer El-Haj-Mahmoud [mailto:Samer.El-Haj-Mahmoud@arm.com]
> > Sent: Thursday, December 10, 2020 9:49 PM
> > To: devel@edk2.groups.io; Chang, Abner (HPS SW/FW Technologist)
> > <abner.chang@hpe.com>
> > Cc: Liming Gao <gaoliming@byosoft.com.cn>; Leif Lindholm
> > <leif@nuviainc.com>; Wang, Nickle (HPS SW) <nickle.wang@hpe.com>;
> > O'Hanley, Peter (EXL) <peter.ohanley@hpe.com>; Samer El-Haj-Mahmoud
> > <Samer.El-Haj-Mahmoud@arm.com>
> > Subject: RE: [edk2-devel] [PATCH v5 1/6] RedfishPkg/Ucs2Utf8lib: UCS2
> > to
> > UFT8 manipulation library
> >
> > Does this really need to be in RedfishPkg? Both UCS-S and UTF8 are
> > standard and common formats, so It seems like a useful string
> > manipulation library that may have other use cases? Maybe move it to
> MdeModulePkg?
> >
> > > -----Original Message-----
> > > From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of
> Abner
> > > Chang via groups.io
> > > Sent: Monday, December 7, 2020 9:11 PM
> > > To: devel@edk2.groups.io
> > > Cc: Liming Gao <gaoliming@byosoft.com.cn>; Leif Lindholm
> > > <leif@nuviainc.com>; Nickle Wang <nickle.wang@hpe.com>; Peter
> > O'Hanley
> > > <peter.ohanley@hpe.com>
> > > Subject: [edk2-devel] [PATCH v5 1/6] RedfishPkg/Ucs2Utf8lib: UCS2 to
> > > UFT8 manipulation library
> > >
> > > This library provides UCS2 to UFT8 or vise versa functions to
> > > manipulate
> > > UCS2/UTF8 strings. This library is currently used by edk2 port of
> > > open source jansson library.
> > >
> > > Signed-off-by: Abner Chang <abner.chang@hpe.com>
> > >
> > > Cc: Liming Gao <gaoliming@byosoft.com.cn>
> > > Cc: Leif Lindholm <leif@nuviainc.com>
> > > Cc: Nickle Wang <nickle.wang@hpe.com>
> > > Cc: Peter O'Hanley <peter.ohanley@hpe.com>
> > > ---
> > >  RedfishPkg/Include/Library/BaseUcs2Utf8Lib.h  |  69 +++
> > > .../Library/BaseUcs2Utf8Lib/BaseUcs2Utf8Lib.c | 417
> > ++++++++++++++++++
> > >  .../BaseUcs2Utf8Lib/BaseUcs2Utf8Lib.inf       |  31 ++
> > >  RedfishPkg/RedfishLibs.dsc.inc                |   1 +
> > >  RedfishPkg/RedfishPkg.dec                     |   4 +
> > >  RedfishPkg/RedfishPkg.dsc                     |   1 +
> > >  6 files changed, 523 insertions(+)
> > >  create mode 100644 RedfishPkg/Include/Library/BaseUcs2Utf8Lib.h
> > >  create mode 100644
> > > RedfishPkg/Library/BaseUcs2Utf8Lib/BaseUcs2Utf8Lib.c
> > >  create mode 100644
> > > RedfishPkg/Library/BaseUcs2Utf8Lib/BaseUcs2Utf8Lib.inf
> > >
> > > diff --git a/RedfishPkg/Include/Library/BaseUcs2Utf8Lib.h
> > > b/RedfishPkg/Include/Library/BaseUcs2Utf8Lib.h
> > > new file mode 100644
> > > index 0000000000..51ae924929
> > > --- /dev/null
> > > +++ b/RedfishPkg/Include/Library/BaseUcs2Utf8Lib.h
> > > @@ -0,0 +1,69 @@
> > > +/** @file
> > > +  UCS2 to UTF8 manipulation library header file.
> > > +
> > > +  Copyright (c) 2019, Intel Corporation. All rights reserved.<BR>
> > > +  (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
> > > +
> > > +    SPDX-License-Identifier: BSD-2-Clause-Patent
> > > +
> > > +**/
> > > +
> > > +#ifndef BASE_UCS2UTF8_LIB_H_
> > > +#define BASE_UCS2UTF8_LIB_H_
> > > +
> > > +#include <Base.h>
> > > +#include <Uefi.h>
> > > +#include <Library/BaseLib.h>
> > > +#include <Library/BaseMemoryLib.h>
> > > +#include <Library/DebugLib.h>
> > > +#include <Library/PrintLib.h>
> > > +#include <Library/MemoryAllocationLib.h>
> > > +
> > > +///
> > > +///  L"\u0000"
> > > +///
> > > +#define UNICODE_FORMAT_LEN         6
> > > +#define UNICODE_FORMAT_CHAR_LEN    2
> > > +#define UNICODE_FORMAT_CHAR_SIZE   3
> > > +
> > > +#define UTF8_BUFFER_FOR_UCS2_MAX_SIZE   3
> > > +
> > > +/**
> > > +  Convert a UCS2 string to a UTF8 encoded string.
> > > +
> > > +  @param[in]    Ucs2Str                The provided UCS2 string.
> > > +  @param[out]   Utf8StrAddr            The converted UTF8 string address.
> > Caller
> > > +                                       is responsible for Free this string.
> > > +
> > > +  @retval       EFI_INVALID_PARAMETER  One or more parameters are
> > > invalid.
> > > +  @retval       EFI_OUT_OF_RESOURCES   System runs out of resources.
> > > +  @retval       EFI_SUCCESS            The UTF8 encoded string has been
> > > converted.
> > > +
> > > +**/
> > > +EFI_STATUS
> > > +UCS2StrToUTF8 (
> > > +  IN  CHAR16     *Ucs2Str,
> > > +  OUT CHAR8      **Utf8StrAddr
> > > +  );
> > > +
> > > +/**
> > > +  Convert a UTF8 encoded string to a UCS2 string.
> > > +
> > > +  @param[in]    Utf8Str                The provided UTF8 encoded string.
> > > +  @param[out]   Ucs2StrAddr            The converted UCS2 string address.
> > > Caller
> > > +                                       is responsible for Free this string.
> > > +
> > > +  @retval       EFI_INVALID_PARAMETER  The UTF8 encoded string is not
> > valid
> > > to
> > > +                                       convert to UCS2 string.
> > > +                                       One or more parameters are invalid.
> > > +  @retval       EFI_OUT_OF_RESOURCES   System runs out of resources.
> > > +  @retval       EFI_SUCCESS            The UCS2 string has been converted.
> > > +
> > > +**/
> > > +EFI_STATUS
> > > +UTF8StrToUCS2 (
> > > +  IN  CHAR8      *Utf8Str,
> > > +  OUT CHAR16     **Ucs2StrAddr
> > > +  );
> > > +
> > > +#endif
> > > diff --git a/RedfishPkg/Library/BaseUcs2Utf8Lib/BaseUcs2Utf8Lib.c
> > > b/RedfishPkg/Library/BaseUcs2Utf8Lib/BaseUcs2Utf8Lib.c
> > > new file mode 100644
> > > index 0000000000..6cff109a5c
> > > --- /dev/null
> > > +++ b/RedfishPkg/Library/BaseUcs2Utf8Lib/BaseUcs2Utf8Lib.c
> > > @@ -0,0 +1,417 @@
> > > +/** @file
> > > +  UCS2 to UTF8 manipulation library.
> > > +
> > > +  Copyright (c) 2018 - 2019, Intel Corporation. All rights
> > > + reserved.<BR>
> > > +  (C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR>
> > > +
> > > +    SPDX-License-Identifier: BSD-2-Clause-Patent
> > > +
> > > +**/
> > > +
> > > +#include <Library/BaseUcs2Utf8Lib.h>
> > > +
> > > +/**
> > > +  Since each UCS2 character can be represented by 1-3 UTF8 encoded
> > > +characters,
> > > +  this function is used to retrieve the UTF8 encoding size for a
> > > +UCS2
> > > character.
> > > +
> > > +  @param[in]   Utf8Buffer       The buffer for UTF8 encoded data.
> > > +
> > > +  @retval      Return the size of UTF8 encoding string or 0 if it is not for
> > > +               UCS2 format.
> > > +
> > > +**/
> > > +UINT8
> > > +GetUTF8SizeForUCS2 (
> > > +  IN    CHAR8      *Utf8Buffer
> > > +  )
> > > +{
> > > +  CHAR8    TempChar;
> > > +  UINT8    Utf8Size;
> > > +
> > > +  ASSERT (Utf8Buffer != NULL);
> > > +
> > > +  TempChar = *Utf8Buffer;
> > > +  if ((TempChar & 0xF0) == 0xF0) {
> > > +
> > > +    //
> > > +    // This format is not for UCS2.
> > > +    //
> > > +    return 0;
> > > +  }
> > > +
> > > +  Utf8Size = 1;
> > > +  if ((TempChar & 0x80) == 0x80) {
> > > +    if ((TempChar & 0xC0) == 0xC0) {
> > > +
> > > +      Utf8Size ++;
> > > +      if ((TempChar & 0xE0) == 0xE0) {
> > > +
> > > +        Utf8Size ++;
> > > +      }
> > > +    }
> > > +  }
> > > +
> > > +  return Utf8Size;
> > > +}
> > > +
> > > +/**
> > > +  Since each UCS2 character can be represented by the format:
> > > +\uXXXX, this function
> > > +  is used to retrieve the UCS2 character from a Unicode format.
> > > +  Call MUST make sure there are at least 6 Bytes in the input UTF8
> buffer.
> > > +
> > > +  @param[in]    Utf8Buffer             The buffer for UTF8 encoded data.
> > > +  @param[out]   Ucs2Char               The converted UCS2 character.
> > > +
> > > +  @retval       EFI_INVALID_PARAMETER  Non-Ascii characters found in
> the
> > > hexadecimal
> > > +                                       digits string, and can't be converted to a UCS2
> > > +                                       character.
> > > +  @retval       EFI_SUCCESS            The UCS2 character has been retrieved.
> > > +
> > > +**/
> > > +EFI_STATUS
> > > +GetUCS2CharByFormat (
> > > +  IN    CHAR8      *Utf8Buffer,
> > > +  OUT   CHAR16     *Ucs2Char
> > > +  )
> > > +{
> > > +  UINT8     Num1;
> > > +  UINT8     Num2;
> > > +  UINT8     Index;
> > > +  CHAR8     Ucs2CharFormat[UNICODE_FORMAT_CHAR_SIZE];  /// two
> > > Hexadecimal digits Ascii string, like "3F"
> > > +
> > > +  for (Index = 0; Index < 4; Index ++) {
> > > +    if ((*(Utf8Buffer + 2 + Index) & 0x80) != 0x00) {
> > > +      return EFI_INVALID_PARAMETER;
> > > +    }
> > > +  }
> > > +
> > > +  ZeroMem (Ucs2CharFormat, UNICODE_FORMAT_CHAR_SIZE);
> > > +
> > > +  //
> > > +  // Get the First Number, Offset is 2  //  CopyMem
> > > + (Ucs2CharFormat, Utf8Buffer + 2,
> > > UNICODE_FORMAT_CHAR_LEN);
> > > +  Num1 = (UINT8) AsciiStrHexToUintn (Ucs2CharFormat);
> > > +
> > > +  //
> > > +  // Get the Second Number, Offset is 4  //  CopyMem
> > > + (Ucs2CharFormat, Utf8Buffer + 4, UNICODE_FORMAT_CHAR_LEN);
> > > +  Num2 = (UINT8) AsciiStrHexToUintn (Ucs2CharFormat);
> > > +
> > > +  //
> > > +  // Ucs2Char is Little-Endian
> > > +  //
> > > +  *((CHAR8 *) Ucs2Char)        = Num2;
> > > +  *(((CHAR8 *) Ucs2Char) + 1) = Num1;
> > > +
> > > +  return EFI_SUCCESS;
> > > +}
> > > +
> > > +/**
> > > +  Convert a UCS2 character to UTF8 encoding string.
> > > +
> > > +  @param[in]    Ucs2Char               The provided UCS2 character.
> > > +  @param[out]   Utf8Buffer             The converted UTF8 encoded data.
> > > +
> > > +  @retval      Return the size of UTF8 encoding data for this UCS2
> character.
> > > +
> > > +**/
> > > +UINT8
> > > +UCS2CharToUTF8 (
> > > +  IN  CHAR16     Ucs2Char,
> > > +  OUT CHAR8      *Utf8Buffer
> > > +  )
> > > +{
> > > +  UINT16    Ucs2Number;
> > > +
> > > +  ASSERT (Utf8Buffer != NULL);
> > > +
> > > +  Ucs2Number = (UINT16) Ucs2Char;
> > > +  if (Ucs2Number <= 0x007F) {
> > > +
> > > +    //
> > > +    // UTF8 format: 0xxxxxxx
> > > +    //
> > > +    *Utf8Buffer = Ucs2Char & 0x7F;
> > > +    return 1;
> > > +
> > > +  } else if (Ucs2Number >= 0x0080 && Ucs2Number <= 0x07FF) {
> > > +
> > > +    //
> > > +    // UTF8 format: 110xxxxx 10xxxxxx
> > > +    //
> > > +    *(Utf8Buffer + 1) = (Ucs2Char & 0x3F) | 0x80;
> > > +    *Utf8Buffer       = ((Ucs2Char >> 6) & 0x1F) | 0xC0;
> > > +    return 2;
> > > +
> > > +  } else {  /// Ucs2Number >= 0x0800 && Ucs2Number <= 0xFFFF
> > > +
> > > +    //
> > > +    // UTF8 format: 1110xxxx 10xxxxxx 10xxxxxx
> > > +    //
> > > +    *(Utf8Buffer + 2) = (Ucs2Char & 0x3F) | 0x80;
> > > +    *(Utf8Buffer + 1) = ((Ucs2Char >> 6) & 0x3F) | 0x80;
> > > +    *Utf8Buffer       = ((Ucs2Char >> 12) & 0x0F) | 0xE0;
> > > +    return 3;
> > > +  }
> > > +}
> > > +
> > > +/**
> > > +  Convert a UTF8 encoded data to a UCS2 character.
> > > +
> > > +  @param[in]    Utf8Buffer             The provided UTF8 encoded data.
> > > +  @param[out]   Ucs2Char               The converted UCS2 character.
> > > +
> > > +  @retval       EFI_INVALID_PARAMETER  The UTF8 encoded string is not
> > valid
> > > or
> > > +                                       not for UCS2 character.
> > > +  @retval       EFI_SUCCESS            The converted UCS2 character.
> > > +
> > > +**/
> > > +EFI_STATUS
> > > +UTF8ToUCS2Char (
> > > +  IN   CHAR8      *Utf8Buffer,
> > > +  OUT  CHAR16     *Ucs2Char
> > > +  )
> > > +{
> > > +  UINT8    Utf8Size;
> > > +  CHAR8    *Ucs2Buffer;
> > > +  CHAR8    TempChar1;
> > > +  CHAR8    TempChar2;
> > > +  CHAR8    TempChar3;
> > > +
> > > +  ASSERT (Utf8Buffer != NULL && Ucs2Char != NULL);  ZeroMem
> > > + (Ucs2Char, sizeof (CHAR16));  Ucs2Buffer = (CHAR8 *) Ucs2Char;
> > > +
> > > +  Utf8Size = GetUTF8SizeForUCS2 (Utf8Buffer);  switch (Utf8Size) {
> > > +
> > > +    case 1:
> > > +
> > > +      //
> > > +      // UTF8 format: 0xxxxxxx
> > > +      //
> > > +      TempChar1 = *Utf8Buffer;
> > > +      if ((TempChar1 & 0x80) != 0x00) {
> > > +        return EFI_INVALID_PARAMETER;
> > > +      }
> > > +
> > > +      *Ucs2Buffer       = TempChar1;
> > > +      *(Ucs2Buffer + 1) = 0;
> > > +      break;
> > > +
> > > +    case 2:
> > > +
> > > +      //
> > > +      // UTF8 format: 110xxxxx 10xxxxxx
> > > +      //
> > > +      TempChar1 = *Utf8Buffer;
> > > +      if ((TempChar1 & 0xE0) != 0xC0) {
> > > +        return EFI_INVALID_PARAMETER;
> > > +      }
> > > +
> > > +      TempChar2 = *(Utf8Buffer + 1);
> > > +      if ((TempChar2 & 0xC0) != 0x80) {
> > > +        return EFI_INVALID_PARAMETER;
> > > +      }
> > > +
> > > +      *Ucs2Buffer       = (TempChar1 << 6) + (TempChar2 & 0x3F);
> > > +      *(Ucs2Buffer + 1) = (TempChar1 >> 2) & 0x07;
> > > +      break;
> > > +
> > > +    case 3:
> > > +
> > > +      //
> > > +      // UTF8 format: 1110xxxx 10xxxxxx 10xxxxxx
> > > +      //
> > > +      TempChar1 = *Utf8Buffer;
> > > +      if ((TempChar1 & 0xF0) != 0xE0) {
> > > +        return EFI_INVALID_PARAMETER;
> > > +      }
> > > +
> > > +      TempChar2 = *(Utf8Buffer + 1);
> > > +      if ((TempChar2 & 0xC0) != 0x80) {
> > > +        return EFI_INVALID_PARAMETER;
> > > +      }
> > > +
> > > +      TempChar3 = *(Utf8Buffer + 2);
> > > +      if ((TempChar3 & 0xC0) != 0x80) {
> > > +        return EFI_INVALID_PARAMETER;
> > > +      }
> > > +
> > > +      *Ucs2Buffer       = (TempChar2 << 6) + (TempChar3 & 0x3F);
> > > +      *(Ucs2Buffer + 1) = (TempChar1 << 4) + ((TempChar2 >> 2) &
> > > + 0x0F);
> > > +
> > > +      break;
> > > +
> > > +    default:
> > > +
> > > +      return EFI_INVALID_PARAMETER;  }
> > > +
> > > +  return EFI_SUCCESS;
> > > +}
> > > +
> > > +/**
> > > +  Convert a UCS2 string to a UTF8 encoded string.
> > > +
> > > +  @param[in]    Ucs2Str                The provided UCS2 string.
> > > +  @param[out]   Utf8StrAddr            The converted UTF8 string address.
> > Caller
> > > +                                       is responsible for Free this string.
> > > +
> > > +  @retval       EFI_INVALID_PARAMETER  One or more parameters are
> > > invalid.
> > > +  @retval       EFI_OUT_OF_RESOURCES   System runs out of resources.
> > > +  @retval       EFI_SUCCESS            The UTF8 encoded string has been
> > > converted.
> > > +
> > > +**/
> > > +EFI_STATUS
> > > +UCS2StrToUTF8 (
> > > +  IN  CHAR16     *Ucs2Str,
> > > +  OUT CHAR8      **Utf8StrAddr
> > > +  )
> > > +{
> > > +  UINTN    Ucs2StrIndex;
> > > +  UINTN    Ucs2StrLength;
> > > +  CHAR8    *Utf8Str;
> > > +  UINTN    Utf8StrLength;
> > > +  UINTN    Utf8StrIndex;
> > > +  CHAR8    Utf8Buffer[UTF8_BUFFER_FOR_UCS2_MAX_SIZE];
> > > +  UINT8    Utf8BufferSize;
> > > +
> > > +  if (Ucs2Str == NULL || Utf8StrAddr == NULL) {
> > > +    return EFI_INVALID_PARAMETER;
> > > +  }
> > > +
> > > +  Ucs2StrLength = StrLen (Ucs2Str);  Utf8StrLength = 0;
> > > +
> > > +  for (Ucs2StrIndex = 0; Ucs2StrIndex < Ucs2StrLength; Ucs2StrIndex
> > > + ++) {
> > > +
> > > +    ZeroMem (Utf8Buffer, sizeof (Utf8Buffer));
> > > +    Utf8BufferSize = UCS2CharToUTF8 (Ucs2Str[Ucs2StrIndex],
> Utf8Buffer);
> > > +    Utf8StrLength += Utf8BufferSize;  }
> > > +
> > > +  Utf8Str = AllocateZeroPool (Utf8StrLength + 1);  if (Utf8Str ==
> > > + NULL) {
> > > +    return EFI_OUT_OF_RESOURCES;
> > > +  }
> > > +
> > > +  Utf8StrIndex = 0;
> > > +  for (Ucs2StrIndex = 0; Ucs2StrIndex < Ucs2StrLength; Ucs2StrIndex
> > > + ++) {
> > > +
> > > +    ZeroMem (Utf8Buffer, sizeof (Utf8Buffer));
> > > +    Utf8BufferSize = UCS2CharToUTF8 (Ucs2Str[Ucs2StrIndex],
> > > + Utf8Buffer);
> > > +
> > > +    CopyMem (Utf8Str + Utf8StrIndex, Utf8Buffer, Utf8BufferSize);
> > > +    Utf8StrIndex += Utf8BufferSize;  }
> > > +
> > > +  Utf8Str[Utf8StrIndex] = '\0';
> > > +  *Utf8StrAddr = Utf8Str;
> > > +
> > > +  return EFI_SUCCESS;
> > > +}
> > > +
> > > +/**
> > > +  Convert a UTF8 encoded string to a UCS2 string.
> > > +
> > > +  @param[in]    Utf8Str                The provided UTF8 encoded string.
> > > +  @param[out]   Ucs2StrAddr            The converted UCS2 string address.
> > > Caller
> > > +                                       is responsible for Free this string.
> > > +
> > > +  @retval       EFI_INVALID_PARAMETER  The UTF8 encoded string is not
> > valid
> > > to
> > > +                                       convert to UCS2 string.
> > > +                                       One or more parameters are invalid.
> > > +  @retval       EFI_OUT_OF_RESOURCES   System runs out of resources.
> > > +  @retval       EFI_SUCCESS            The UCS2 string has been converted.
> > > +
> > > +**/
> > > +EFI_STATUS
> > > +UTF8StrToUCS2 (
> > > +  IN  CHAR8      *Utf8Str,
> > > +  OUT CHAR16     **Ucs2StrAddr
> > > +  )
> > > +{
> > > +  EFI_STATUS    Status;
> > > +  UINTN         Utf8StrIndex;
> > > +  UINTN         Utf8StrLength;
> > > +  UINTN         Ucs2StrIndex;
> > > +  UINT8         Utf8BufferSize;
> > > +  CHAR16        *Ucs2StrTemp;
> > > +
> > > +  if (Utf8Str == NULL || Ucs2StrAddr == NULL) {
> > > +    return EFI_INVALID_PARAMETER;
> > > +  }
> > > +
> > > +  //
> > > +  // It is not an Ascii string, calculate string length.
> > > +  //
> > > +  Utf8StrLength = 0;
> > > +  while (*(Utf8Str + Utf8StrLength) != '\0') {
> > > +    Utf8StrLength ++;
> > > +  }
> > > +
> > > +  //
> > > +  // UCS2 string shall not be longer than the UTF8 string.
> > > +  //
> > > +  Ucs2StrTemp = AllocateZeroPool ((Utf8StrLength + 1) * sizeof
> > > + (CHAR16));  if (Ucs2StrTemp == NULL) {
> > > +    return EFI_OUT_OF_RESOURCES;
> > > +  }
> > > +
> > > +  Utf8StrIndex = 0;
> > > +  Ucs2StrIndex = 0;
> > > +  while (Utf8Str[Utf8StrIndex] != '\0') {
> > > +
> > > +    if (CompareMem (Utf8Str + Utf8StrIndex, "\\u", 2) == 0 &&
> > > +      Utf8StrLength - Utf8StrIndex >= UNICODE_FORMAT_LEN) {
> > > +
> > > +      Status = GetUCS2CharByFormat (Utf8Str + Utf8StrIndex,
> > > + Ucs2StrTemp +
> > > Ucs2StrIndex);
> > > +      if (!EFI_ERROR (Status)) {
> > > +
> > > +        Utf8StrIndex += UNICODE_FORMAT_LEN;
> > > +        Ucs2StrIndex ++;
> > > +      } else {
> > > +
> > > +        StrCpyS (Ucs2StrTemp + Ucs2StrIndex, 3, L"\\u");
> > > +
> > > +        Ucs2StrIndex += 2;
> > > +        Utf8StrIndex += 2;
> > > +      }
> > > +    } else {
> > > +
> > > +      Utf8BufferSize = GetUTF8SizeForUCS2 (Utf8Str + Utf8StrIndex);
> > > +      if (Utf8BufferSize == 0 || Utf8StrLength - Utf8StrIndex <
> > > + Utf8BufferSize) {
> > > +
> > > +        FreePool (Ucs2StrTemp);
> > > +        return EFI_INVALID_PARAMETER;
> > > +      }
> > > +
> > > +      Status = UTF8ToUCS2Char (Utf8Str + Utf8StrIndex, Ucs2StrTemp
> > > + +
> > > Ucs2StrIndex);
> > > +      if (EFI_ERROR (Status)) {
> > > +
> > > +        FreePool (Ucs2StrTemp);
> > > +        return EFI_INVALID_PARAMETER;
> > > +      }
> > > +
> > > +      Ucs2StrIndex ++;
> > > +      Utf8StrIndex += Utf8BufferSize;
> > > +    }
> > > +  }
> > > +
> > > +  *Ucs2StrAddr = AllocateZeroPool ((Ucs2StrIndex + 1) * sizeof
> > > + (CHAR16));  if (*Ucs2StrAddr == NULL) {
> > > +
> > > +    FreePool (Ucs2StrTemp);
> > > +    return EFI_OUT_OF_RESOURCES;
> > > +  }
> > > +
> > > +  StrCpyS (*Ucs2StrAddr, Ucs2StrIndex + 1, Ucs2StrTemp);
> > > + *(*Ucs2StrAddr + Ucs2StrIndex) = L'\0';  FreePool (Ucs2StrTemp);
> > > +
> > > +  return EFI_SUCCESS;
> > > +}
> > > +
> > > diff --git a/RedfishPkg/Library/BaseUcs2Utf8Lib/BaseUcs2Utf8Lib.inf
> > > b/RedfishPkg/Library/BaseUcs2Utf8Lib/BaseUcs2Utf8Lib.inf
> > > new file mode 100644
> > > index 0000000000..ccd02ee320
> > > --- /dev/null
> > > +++ b/RedfishPkg/Library/BaseUcs2Utf8Lib/BaseUcs2Utf8Lib.inf
> > > @@ -0,0 +1,31 @@
> > > +## @file
> > > +# UCS2 to UTF8 manipulation library.
> > > +#
> > > +# Copyright (c) 2019, Intel Corporation. All rights reserved.<BR> #
> > > +(C) Copyright 2020 Hewlett Packard Enterprise Development LP<BR> #
> > > +#    SPDX-License-Identifier: BSD-2-Clause-Patent
> > > +#
> > > +##
> > > +
> > > +[Defines]
> > > +  INF_VERSION                    = 0x0001001b
> > > +  BASE_NAME                      = BaseUcs2Utf8Lib
> > > +  FILE_GUID                      = 536646C3-46D0-4B12-ABC4-CDE1A33B5256
> > > +  MODULE_TYPE                    = BASE
> > > +  VERSION_STRING                 = 1.0
> > > +  LIBRARY_CLASS                  = Ucs2Utf8Lib
> > > +
> > > +#
> > > +#  VALID_ARCHITECTURES           = IA32 X64 ARM AARCH64 RISCV64
> > > +#
> > > +
> > > +[Sources.common]
> > > +  BaseUcs2Utf8Lib.c
> > > +
> > > +[Packages]
> > > +  MdePkg/MdePkg.dec
> > > +  MdeModulePkg/MdeModulePkg.dec
> > > +  RedfishPkg/RedfishPkg.dec
> > > +
> > > +
> > > diff --git a/RedfishPkg/RedfishLibs.dsc.inc
> > > b/RedfishPkg/RedfishLibs.dsc.inc index e780b5c270..d4c08e18ac 100644
> > > --- a/RedfishPkg/RedfishLibs.dsc.inc
> > > +++ b/RedfishPkg/RedfishLibs.dsc.inc
> > > @@ -11,5 +11,6 @@
> > >  #
> > >  ##
> > >  !if $(REDFISH_ENABLE) == TRUE
> > > +
> > > + Ucs2Utf8Lib|RedfishPkg/Library/BaseUcs2Utf8Lib/BaseUcs2Utf8Lib.inf
> > >  !endif
> > >
> > > diff --git a/RedfishPkg/RedfishPkg.dec b/RedfishPkg/RedfishPkg.dec
> > > index b38e9b4789..aecc1f4a3a 100644
> > > --- a/RedfishPkg/RedfishPkg.dec
> > > +++ b/RedfishPkg/RedfishPkg.dec
> > > @@ -20,6 +20,10 @@
> > >    ##  @libraryclass Platform Redfish Host Interface Library
> > >    #   Platform implementation-specific Redfish Host Interface.
> > >
> > > RedfishPlatformHostInterfaceLib|Include/Library/RedfishHostInterface
> > > RedfishPlatformHostInterfaceLib|Li
> > > RedfishPlatformHostInterfaceLib|b.h
> > > +  ##  @libraryclass  This library provides UCS2 to UTF8 manipulation
> > > +  #   functions.
> > > +  #
> > > +  Ucs2Utf8Lib|Include/Library/BaseUcs2Utf8Lib.h
> > >
> > >  [Protocols]
> > >    ## Include/Protocol/RedfishDiscover.h
> > > diff --git a/RedfishPkg/RedfishPkg.dsc b/RedfishPkg/RedfishPkg.dsc
> > > index
> > > 94e7127bc6..d198a94b73 100644
> > > --- a/RedfishPkg/RedfishPkg.dsc
> > > +++ b/RedfishPkg/RedfishPkg.dsc
> > > @@ -43,5 +43,6 @@
> > >
> > >  [Components]
> > >
> > > RedfishPkg/Library/PlatformHostInterfaceLibNull/PlatformHostInterfac
> > > eL
> > > ibN
> > > ull.inf
> > > +  RedfishPkg/Library/BaseUcs2Utf8Lib/BaseUcs2Utf8Lib.inf
> > >
> > >    !include RedfishPkg/Redfish.dsc.inc
> > > --
> > > 2.17.1
> > >
> > >
> > >
> > > 
> > >
> >
> > IMPORTANT NOTICE: The contents of this email and any attachments are
> > confidential and may also be privileged. If you are not the intended
> > recipient, please notify the sender immediately and do not disclose
> > the contents to any other person, use it for any purpose, or store or
> > copy the information in any medium. Thank you.
IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.

  reply	other threads:[~2020-12-10 16:43 UTC|newest]

Thread overview: 28+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-12-08  2:10 [PATCH v5 0/6] jansson edk2 port Abner Chang
2020-12-08  2:10 ` [PATCH v5 1/6] RedfishPkg/Ucs2Utf8lib: UCS2 to UFT8 manipulation library Abner Chang
2020-12-10  2:48   ` Nickle Wang
2020-12-10 13:49   ` [edk2-devel] " Samer El-Haj-Mahmoud
2020-12-10 14:27     ` Abner Chang
2020-12-10 16:43       ` Samer El-Haj-Mahmoud [this message]
2020-12-11  0:37         ` Abner Chang
2020-12-08  2:10 ` [PATCH v5 2/6] edk2: jansson submodule for edk2 JSON library Abner Chang
2020-12-10  2:50   ` Nickle Wang
2020-12-08  2:10 ` [PATCH v5 3/6] RedfishPkg/CrtLib: C runtime library Abner Chang
2020-12-10  2:54   ` Nickle Wang
2020-12-08  2:10 ` [PATCH v5 4/6] RedfishPkg/library: EDK2 port of jansson library Abner Chang
2020-12-10  2:58   ` Nickle Wang
2020-12-08  2:10 ` [PATCH v5 5/6] RedfishPkg: Add EDK2 port of jansson library to build Abner Chang
2020-12-10  2:59   ` Nickle Wang
2020-12-08  2:10 ` [PATCH v5 6/6] .pytool: Add required submodule for JsonLib Abner Chang
2020-12-08  6:39 ` 回复: [edk2-devel] [PATCH v5 0/6] jansson edk2 port gaoliming
2020-12-10  2:13   ` Abner Chang
2020-12-10  2:33     ` Michael D Kinney
2020-12-10  4:02       ` Abner Chang
2020-12-11 19:22         ` Michael D Kinney
2020-12-13  4:01           ` Abner Chang
2020-12-14  1:29             ` 回复: " gaoliming
2020-12-14  1:58               ` Abner Chang
2020-12-16  2:08                 ` Abner Chang
2020-12-16  2:57                   ` Michael D Kinney
2020-12-16 15:04                     ` Abner Chang
2020-12-14 16:10           ` Abner Chang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=DB7PR08MB326050AB9AF2710E0F02066190CB0@DB7PR08MB3260.eurprd08.prod.outlook.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox