summaryrefslogtreecommitdiffstats
path: root/EdkCompatibilityPkg/Sample/Tools/Source/HiiPack/StringParse.c
diff options
context:
space:
mode:
Diffstat (limited to 'EdkCompatibilityPkg/Sample/Tools/Source/HiiPack/StringParse.c')
-rw-r--r--EdkCompatibilityPkg/Sample/Tools/Source/HiiPack/StringParse.c244
1 files changed, 244 insertions, 0 deletions
diff --git a/EdkCompatibilityPkg/Sample/Tools/Source/HiiPack/StringParse.c b/EdkCompatibilityPkg/Sample/Tools/Source/HiiPack/StringParse.c
new file mode 100644
index 0000000000..8dd26e1529
--- /dev/null
+++ b/EdkCompatibilityPkg/Sample/Tools/Source/HiiPack/StringParse.c
@@ -0,0 +1,244 @@
+/*++
+
+Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR>
+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:
+
+ StringParse.c
+
+Abstract:
+
+ Routines for parsing HII string packs
+
+--*/
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "Tiano.h"
+#include "EfiUtilityMsgs.h"
+#include "EfiInternalFormRepresentation.h"
+#include "Hii.h"
+#include "StringParse.h"
+#include "HiiPack.h"
+
+typedef struct _STRING_PACK_RECORD {
+ struct _STRING_PACK_RECORD *Next;
+ int Handle;
+ EFI_GUID PackageGuid;
+ EFI_GUID FormsetGuid;
+ EFI_HII_STRING_PACK *StringPack;
+ int StringPackSize;
+ int NumStringPacks;
+} STRING_PACK_RECORD;
+
+static STRING_PACK_RECORD *mStringPacks = NULL;
+
+STATUS
+StringGetPack (
+ int Handle, // matches handle passed in with StringParsePack()
+ EFI_HII_STRING_PACK **StringPack, // returned pointer to string pack
+ int *StringPackSize, // sizeof buffer pointed to by StringPack
+ int *NumStringPacks, // in the array pointed to by StringPack
+ EFI_GUID *FormsetGuid,
+ EFI_GUID *PackageGuid
+ )
+/*++
+
+Routine Description:
+
+ Get a string pack given to us previously
+
+Arguments:
+ Handle - handle of string pack to get
+ StringPack - outgoing pointer to string pack on the given handle
+ StringPackSize - outgoing size of string pack pointed to by StringPack
+ NumStringPacks - outgoing number of string packs in StringPack[] array
+ FormsetGuid - outgoing GUID passed in with the string pack when it was parsed
+ PackageGuid - outgoing GUID passed in with the string pack when it was parsed
+
+Returns:
+
+ STATUS_SUCCESS - string pack with matching handle was found
+ STATUS_ERROR - otherwise
+
+--*/
+{
+ STRING_PACK_RECORD *Rec;
+
+ for (Rec = mStringPacks; Rec != NULL; Rec = Rec->Next) {
+ if (Rec->Handle == Handle) {
+ *StringPack = Rec->StringPack;
+ *StringPackSize = Rec->StringPackSize;
+ *NumStringPacks = Rec->NumStringPacks;
+ return STATUS_SUCCESS;
+ }
+ }
+
+ return STATUS_ERROR;
+}
+
+STATUS
+StringParsePack (
+ int Handle,
+ EFI_HII_STRING_PACK *StringPack,
+ EFI_GUID *FormsetGuid,
+ EFI_GUID *PackageGuid
+ )
+/*++
+
+Routine Description:
+
+ Parse a string pack, saving the information for later retrieval by the caller
+
+Arguments:
+ Handle - handle of string pack
+ StringPack - pointer to string pack array to parse
+ FormsetGuid - GUID of the string pack
+ PackageGuid - package GUID from the HII data table from which this string pack orginated
+
+Returns:
+
+ STATUS_SUCCESS - Stringpack processed successfully
+ STATUS_ERROR - otherwise
+
+--*/
+{
+ STRING_PACK_RECORD *Rec;
+
+ STRING_PACK_RECORD *TempRec;
+ int PackSize;
+ EFI_HII_STRING_PACK *TempPack;
+ //
+ // Allocate a new string pack record
+ //
+ Rec = (STRING_PACK_RECORD *) malloc (sizeof (STRING_PACK_RECORD));
+ if (Rec == NULL) {
+ Error (NULL, 0, 0, "memory allocation failure", NULL);
+ return STATUS_ERROR;
+ }
+
+ memset (Rec, 0, sizeof (STRING_PACK_RECORD));
+ Rec->Handle = Handle;
+ if (PackageGuid != NULL) {
+ memcpy (&Rec->PackageGuid, PackageGuid, sizeof (EFI_GUID));
+ }
+
+ if (FormsetGuid != NULL) {
+ memcpy (&Rec->FormsetGuid, FormsetGuid, sizeof (EFI_GUID));
+ }
+ //
+ // Walk the string packs to find the terminator
+ //
+ TempPack = StringPack;
+ PackSize = 0;
+ while (TempPack->Header.Length > 0) {
+ if (TempPack->Header.Type != EFI_HII_STRING) {
+ Error (NULL, 0, 0, "found a non-string pack in the string pack array", NULL);
+ free (Rec);
+ return STATUS_ERROR;
+ }
+
+ PackSize += TempPack->Header.Length;
+ Rec->NumStringPacks++;
+ TempPack = (EFI_HII_STRING_PACK *) ((char *) TempPack + TempPack->Header.Length);
+ }
+ //
+ // Add space for the terminator
+ //
+ PackSize += sizeof (EFI_HII_STRING_PACK);
+ Rec->StringPackSize = PackSize;
+ //
+ // Make a copy of the incoming string pack
+ //
+ Rec->StringPack = (EFI_HII_STRING_PACK *) malloc (PackSize);
+ if (Rec->StringPack == NULL) {
+ Error (NULL, 0, 0, "memory allocation failure", NULL);
+ free (Rec);
+ return STATUS_ERROR;
+ }
+
+ memcpy ((void *) Rec->StringPack, StringPack, PackSize);
+ //
+ // Add this record to our list
+ //
+ if (mStringPacks == NULL) {
+ mStringPacks = Rec;
+ } else {
+ for (TempRec = mStringPacks; TempRec->Next != NULL; TempRec = TempRec->Next)
+ ;
+ TempRec->Next = Rec;
+ }
+ free (Rec->StringPack);
+ free (Rec);
+ return STATUS_SUCCESS;
+}
+
+STATUS
+StringInit (
+ VOID
+ )
+/*++
+
+Routine Description:
+
+ GC_TODO: Add function description
+
+Arguments:
+
+ None
+
+Returns:
+
+ GC_TODO: add return values
+
+--*/
+{
+ StringEnd ();
+ return STATUS_SUCCESS;
+}
+
+STATUS
+StringEnd (
+ VOID
+ )
+/*++
+
+Routine Description:
+
+ GC_TODO: Add function description
+
+Arguments:
+
+ None
+
+Returns:
+
+ GC_TODO: add return values
+
+--*/
+{
+ STRING_PACK_RECORD *Next;
+ //
+ // Free up all the memory we've allocated
+ //
+ while (mStringPacks != NULL) {
+ if (mStringPacks->StringPack != NULL) {
+ free (mStringPacks->StringPack);
+ }
+
+ Next = mStringPacks->Next;
+ free (mStringPacks);
+ mStringPacks = Next;
+ }
+
+ return STATUS_SUCCESS;
+}