X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=EdkCompatibilityPkg%2FSample%2FTools%2FSource%2FHiiPack%2FStringParse.c;fp=EdkCompatibilityPkg%2FSample%2FTools%2FSource%2FHiiPack%2FStringParse.c;h=8dd26e1529c32d4124343c484ff74fd437218ebb;hp=0000000000000000000000000000000000000000;hb=3e99020dbf0a159e34b84e7ae9125f2e368d5390;hpb=68bb5ce77e51cf35791e46f2202e36da97e5e6be 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.
+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 +#include +#include + +#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; +}