mirror of https://github.com/acidanthera/audk.git
245 lines
5.9 KiB
C
245 lines
5.9 KiB
C
|
/*++
|
||
|
|
||
|
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;
|
||
|
}
|