]> git.proxmox.com Git - mirror_edk2.git/blobdiff - EdkCompatibilityPkg/Sample/Tools/Source/HiiPack/StringParse.c
Sync all bug fixes between EDK1.04 and EDK1.06 into EdkCompatibilityPkg.
[mirror_edk2.git] / EdkCompatibilityPkg / Sample / Tools / Source / HiiPack / StringParse.c
diff --git a/EdkCompatibilityPkg/Sample/Tools/Source/HiiPack/StringParse.c b/EdkCompatibilityPkg/Sample/Tools/Source/HiiPack/StringParse.c
new file mode 100644 (file)
index 0000000..8dd26e1
--- /dev/null
@@ -0,0 +1,244 @@
+/*++\r
+\r
+Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>\r
+This program and the accompanying materials\r
+are licensed and made available under the terms and conditions of the BSD License\r
+which accompanies this distribution.  The full text of the license may be found at\r
+http://opensource.org/licenses/bsd-license.php\r
+\r
+THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
+WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+\r
+Module Name:\r
+\r
+  StringParse.c  \r
+\r
+Abstract:\r
+\r
+  Routines for parsing HII string packs\r
+\r
+--*/\r
+\r
+#include <stdio.h>\r
+#include <string.h>\r
+#include <stdlib.h>\r
+\r
+#include "Tiano.h"\r
+#include "EfiUtilityMsgs.h"\r
+#include "EfiInternalFormRepresentation.h"\r
+#include "Hii.h"\r
+#include "StringParse.h"\r
+#include "HiiPack.h"\r
+\r
+typedef struct _STRING_PACK_RECORD {\r
+  struct _STRING_PACK_RECORD  *Next;\r
+  int                         Handle;\r
+  EFI_GUID                    PackageGuid;\r
+  EFI_GUID                    FormsetGuid;\r
+  EFI_HII_STRING_PACK         *StringPack;\r
+  int                         StringPackSize;\r
+  int                         NumStringPacks;\r
+} STRING_PACK_RECORD;\r
+\r
+static STRING_PACK_RECORD *mStringPacks = NULL;\r
+\r
+STATUS\r
+StringGetPack (\r
+  int                 Handle,           // matches handle passed in with StringParsePack()\r
+  EFI_HII_STRING_PACK **StringPack,     // returned pointer to string pack\r
+  int                 *StringPackSize,  // sizeof buffer pointed to by StringPack\r
+  int                 *NumStringPacks,  // in the array pointed to by StringPack\r
+  EFI_GUID            *FormsetGuid,\r
+  EFI_GUID            *PackageGuid\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Get a string pack given to us previously\r
+  \r
+Arguments:\r
+  Handle            - handle of string pack to get\r
+  StringPack        - outgoing pointer to string pack on the given handle\r
+  StringPackSize    - outgoing size of string pack pointed to by StringPack\r
+  NumStringPacks    - outgoing number of string packs in StringPack[] array\r
+  FormsetGuid       - outgoing GUID passed in with the string pack when it was parsed\r
+  PackageGuid       - outgoing GUID passed in with the string pack when it was parsed\r
+\r
+Returns:\r
+\r
+  STATUS_SUCCESS  - string pack with matching handle was found\r
+  STATUS_ERROR    - otherwise\r
+  \r
+--*/\r
+{\r
+  STRING_PACK_RECORD  *Rec;\r
+\r
+  for (Rec = mStringPacks; Rec != NULL; Rec = Rec->Next) {\r
+    if (Rec->Handle == Handle) {\r
+      *StringPack     = Rec->StringPack;\r
+      *StringPackSize = Rec->StringPackSize;\r
+      *NumStringPacks = Rec->NumStringPacks;\r
+      return STATUS_SUCCESS;\r
+    }\r
+  }\r
+\r
+  return STATUS_ERROR;\r
+}\r
+\r
+STATUS\r
+StringParsePack (\r
+  int                   Handle,\r
+  EFI_HII_STRING_PACK   *StringPack,\r
+  EFI_GUID              *FormsetGuid,\r
+  EFI_GUID              *PackageGuid\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Parse a string pack, saving the information for later retrieval by the caller\r
+  \r
+Arguments:\r
+  Handle            - handle of string pack\r
+  StringPack        - pointer to string pack array to parse\r
+  FormsetGuid       - GUID of the string pack\r
+  PackageGuid       - package GUID from the HII data table from which this string pack orginated\r
+\r
+Returns:\r
+\r
+  STATUS_SUCCESS  - Stringpack processed successfully\r
+  STATUS_ERROR    - otherwise\r
+  \r
+--*/\r
+{\r
+  STRING_PACK_RECORD  *Rec;\r
+\r
+  STRING_PACK_RECORD  *TempRec;\r
+  int                 PackSize;\r
+  EFI_HII_STRING_PACK *TempPack;\r
+  //\r
+  // Allocate a new string pack record\r
+  //\r
+  Rec = (STRING_PACK_RECORD *) malloc (sizeof (STRING_PACK_RECORD));\r
+  if (Rec == NULL) {\r
+    Error (NULL, 0, 0, "memory allocation failure", NULL);\r
+    return STATUS_ERROR;\r
+  }\r
+\r
+  memset (Rec, 0, sizeof (STRING_PACK_RECORD));\r
+  Rec->Handle = Handle;\r
+  if (PackageGuid != NULL) {\r
+    memcpy (&Rec->PackageGuid, PackageGuid, sizeof (EFI_GUID));\r
+  }\r
+\r
+  if (FormsetGuid != NULL) {\r
+    memcpy (&Rec->FormsetGuid, FormsetGuid, sizeof (EFI_GUID));\r
+  }\r
+  //\r
+  // Walk the string packs to find the terminator\r
+  //\r
+  TempPack  = StringPack;\r
+  PackSize  = 0;\r
+  while (TempPack->Header.Length > 0) {\r
+    if (TempPack->Header.Type != EFI_HII_STRING) {\r
+      Error (NULL, 0, 0, "found a non-string pack in the string pack array", NULL);\r
+      free (Rec);\r
+      return STATUS_ERROR;\r
+    }\r
+\r
+    PackSize += TempPack->Header.Length;\r
+    Rec->NumStringPacks++;\r
+    TempPack = (EFI_HII_STRING_PACK *) ((char *) TempPack + TempPack->Header.Length);\r
+  }\r
+  //\r
+  // Add space for the terminator\r
+  //\r
+  PackSize += sizeof (EFI_HII_STRING_PACK);\r
+  Rec->StringPackSize = PackSize;\r
+  //\r
+  // Make a copy of the incoming string pack\r
+  //\r
+  Rec->StringPack = (EFI_HII_STRING_PACK *) malloc (PackSize);\r
+  if (Rec->StringPack == NULL) {\r
+    Error (NULL, 0, 0, "memory allocation failure", NULL);\r
+    free (Rec);\r
+    return STATUS_ERROR;\r
+  }\r
+\r
+  memcpy ((void *) Rec->StringPack, StringPack, PackSize);\r
+  //\r
+  // Add this record to our list\r
+  //\r
+  if (mStringPacks == NULL) {\r
+    mStringPacks = Rec;\r
+  } else {\r
+    for (TempRec = mStringPacks; TempRec->Next != NULL; TempRec = TempRec->Next)\r
+      ;\r
+    TempRec->Next = Rec;\r
+  }\r
+  free (Rec->StringPack);\r
+  free (Rec);\r
+  return STATUS_SUCCESS;\r
+}\r
+\r
+STATUS\r
+StringInit (\r
+  VOID\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  GC_TODO: Add function description\r
+\r
+Arguments:\r
+\r
+  None\r
+\r
+Returns:\r
+\r
+  GC_TODO: add return values\r
+\r
+--*/\r
+{\r
+  StringEnd ();\r
+  return STATUS_SUCCESS;\r
+}\r
+\r
+STATUS\r
+StringEnd (\r
+  VOID\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  GC_TODO: Add function description\r
+\r
+Arguments:\r
+\r
+  None\r
+\r
+Returns:\r
+\r
+  GC_TODO: add return values\r
+\r
+--*/\r
+{\r
+  STRING_PACK_RECORD  *Next;\r
+  //\r
+  // Free up all the memory we've allocated\r
+  //\r
+  while (mStringPacks != NULL) {\r
+    if (mStringPacks->StringPack != NULL) {\r
+      free (mStringPacks->StringPack);\r
+    }\r
+\r
+    Next = mStringPacks->Next;\r
+    free (mStringPacks);\r
+    mStringPacks = Next;\r
+  }\r
+\r
+  return STATUS_SUCCESS;\r
+}\r