/** @file\r
Parser for IFR binary encoding.\r
\r
-Copyright (c) 2008, Intel Corporation\r
-All rights reserved. This program and the accompanying materials\r
+Copyright (c) 2008 - 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
EFI_GUID mFrameworkHiiCompatibilityGuid = EFI_IFR_FRAMEWORK_GUID;\r
extern EFI_GUID mTianoHiiIfrGuid;\r
\r
+/**\r
+ Find the question's OneOfOptionMap list in FormSet \r
+ based on the input question Id. \r
+ \r
+ @param FormSet FormSet context.\r
+ @param QuestionId Unique ID to specicy the question in FormSet.\r
+ \r
+ @return the found OneOfOptionMap list. If not found, NULL will return.\r
+**/\r
LIST_ENTRY *\r
GetOneOfOptionMapEntryListHead (\r
IN CONST FORM_BROWSER_FORMSET *FormSet,\r
return NULL;\r
}\r
\r
+/**\r
+ Free OneOfOption map list.\r
+ \r
+ @param OneOfOptionMapListHead Pointer to list header of OneOfOptionMap list.\r
+\r
+**/\r
VOID\r
DestoryOneOfOptionMap (\r
IN LIST_ENTRY *OneOfOptionMapListHead\r
FORMSET_STORAGE *Storage;\r
\r
Storage = AllocateZeroPool (sizeof (FORMSET_STORAGE));\r
+ ASSERT (Storage != NULL);\r
Storage->Signature = FORMSET_STORAGE_SIGNATURE;\r
InsertTailList (&FormSet->StorageListHead, &Storage->Link);\r
\r
//\r
// If scope bit set, push onto scope stack\r
//\r
- if (Scope) {\r
+ if (Scope != 0) {\r
PushScope (Operand);\r
}\r
\r
// Create a new Form for this FormSet\r
//\r
CurrentForm = AllocateZeroPool (sizeof (FORM_BROWSER_FORM));\r
+ ASSERT (CurrentForm != NULL);\r
CurrentForm->Signature = FORM_BROWSER_FORM_SIGNATURE;\r
\r
InitializeListHead (&CurrentForm->StatementListHead);\r
// Create a new Form Map for this FormSet\r
//\r
CurrentForm = AllocateZeroPool (sizeof (FORM_BROWSER_FORM));\r
+ ASSERT (CurrentForm != NULL);\r
CurrentForm->Signature = FORM_BROWSER_FORM_SIGNATURE;\r
\r
InitializeListHead (&CurrentForm->StatementListHead);\r
//\r
case EFI_IFR_DEFAULTSTORE_OP:\r
DefaultStore = AllocateZeroPool (sizeof (FORMSET_DEFAULTSTORE));\r
+ ASSERT (DefaultStore != NULL);\r
DefaultStore->Signature = FORMSET_DEFAULTSTORE_SIGNATURE;\r
\r
CopyMem (&DefaultStore->DefaultId, &((EFI_IFR_DEFAULTSTORE *) OpCodeData)->DefaultId, sizeof (UINT16));\r
//\r
case EFI_IFR_SUBTITLE_OP:\r
CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
+ ASSERT (CurrentStatement != NULL);\r
CurrentStatement->Flags = ((EFI_IFR_SUBTITLE *) OpCodeData)->Flags;\r
\r
- if (Scope) {\r
+ if (Scope != 0) {\r
mInScopeSubtitle = TRUE;\r
}\r
break;\r
\r
case EFI_IFR_TEXT_OP:\r
CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
+ ASSERT (CurrentStatement != NULL);\r
\r
CopyMem (&CurrentStatement->TextTwo, &((EFI_IFR_TEXT *) OpCodeData)->TextTwo, sizeof (EFI_STRING_ID));\r
break;\r
//\r
case EFI_IFR_ACTION_OP:\r
CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
+ ASSERT (CurrentStatement != NULL);\r
\r
if (OpCodeLength == sizeof (EFI_IFR_ACTION_1)) {\r
//\r
\r
case EFI_IFR_RESET_BUTTON_OP:\r
CurrentStatement = CreateStatement (OpCodeData, FormSet, CurrentForm);\r
+ ASSERT (CurrentStatement != NULL);\r
CopyMem (&CurrentStatement->DefaultId, &((EFI_IFR_RESET_BUTTON *) OpCodeData)->DefaultId, sizeof (EFI_DEFAULT_ID));\r
break;\r
\r
case EFI_IFR_REF_OP:\r
CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
+ ASSERT (CurrentStatement != NULL);\r
\r
CopyMem (&CurrentStatement->RefFormId, &((EFI_IFR_REF *) OpCodeData)->FormId, sizeof (EFI_FORM_ID));\r
if (OpCodeLength >= sizeof (EFI_IFR_REF2)) {\r
case EFI_IFR_ONE_OF_OP:\r
case EFI_IFR_NUMERIC_OP:\r
CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
+ ASSERT (CurrentStatement != NULL);\r
\r
CurrentStatement->Flags = ((EFI_IFR_ONE_OF *) OpCodeData)->Flags;\r
Value = &CurrentStatement->HiiValue;\r
CurrentStatement->Minimum = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.MinValue;\r
CurrentStatement->Maximum = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.MaxValue;\r
CurrentStatement->Step = ((EFI_IFR_NUMERIC *) OpCodeData)->data.u8.Step;\r
- CurrentStatement->StorageWidth = sizeof (UINT8);\r
+ CurrentStatement->StorageWidth = (UINT16) sizeof (UINT8);\r
Value->Type = EFI_IFR_TYPE_NUM_SIZE_8;\r
break;\r
\r
CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.MinValue, sizeof (UINT16));\r
CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.MaxValue, sizeof (UINT16));\r
CopyMem (&CurrentStatement->Step, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u16.Step, sizeof (UINT16));\r
- CurrentStatement->StorageWidth = sizeof (UINT16);\r
+ CurrentStatement->StorageWidth = (UINT16) sizeof (UINT16);\r
Value->Type = EFI_IFR_TYPE_NUM_SIZE_16;\r
break;\r
\r
CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.MinValue, sizeof (UINT32));\r
CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.MaxValue, sizeof (UINT32));\r
CopyMem (&CurrentStatement->Step, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u32.Step, sizeof (UINT32));\r
- CurrentStatement->StorageWidth = sizeof (UINT32);\r
+ CurrentStatement->StorageWidth = (UINT16) sizeof (UINT32);\r
Value->Type = EFI_IFR_TYPE_NUM_SIZE_32;\r
break;\r
\r
CopyMem (&CurrentStatement->Minimum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.MinValue, sizeof (UINT64));\r
CopyMem (&CurrentStatement->Maximum, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.MaxValue, sizeof (UINT64));\r
CopyMem (&CurrentStatement->Step, &((EFI_IFR_NUMERIC *) OpCodeData)->data.u64.Step, sizeof (UINT64));\r
- CurrentStatement->StorageWidth = sizeof (UINT64);\r
+ CurrentStatement->StorageWidth = (UINT16) sizeof (UINT64);\r
Value->Type = EFI_IFR_TYPE_NUM_SIZE_64;\r
break;\r
\r
\r
case EFI_IFR_ORDERED_LIST_OP:\r
CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
+ ASSERT (CurrentStatement != NULL);\r
\r
CurrentStatement->Flags = ((EFI_IFR_ORDERED_LIST *) OpCodeData)->Flags;\r
CurrentStatement->MaxContainers = ((EFI_IFR_ORDERED_LIST *) OpCodeData)->MaxContainers;\r
\r
case EFI_IFR_CHECKBOX_OP:\r
CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
+ ASSERT (CurrentStatement != NULL);\r
\r
CurrentStatement->Flags = ((EFI_IFR_CHECKBOX *) OpCodeData)->Flags;\r
- CurrentStatement->StorageWidth = sizeof (BOOLEAN);\r
+ CurrentStatement->StorageWidth = (UINT16) sizeof (BOOLEAN);\r
CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_BOOLEAN;\r
\r
break;\r
\r
case EFI_IFR_STRING_OP:\r
CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
+ ASSERT (CurrentStatement != NULL);\r
\r
//\r
// MinSize is the minimum number of characters that can be accepted for this opcode,\r
\r
case EFI_IFR_PASSWORD_OP:\r
CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
+ ASSERT (CurrentStatement != NULL);\r
\r
//\r
// MinSize is the minimum number of characters that can be accepted for this opcode,\r
\r
case EFI_IFR_DATE_OP:\r
CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
+ ASSERT (CurrentStatement != NULL);\r
\r
CurrentStatement->Flags = ((EFI_IFR_DATE *) OpCodeData)->Flags;\r
CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_DATE;\r
\r
case EFI_IFR_TIME_OP:\r
CurrentStatement = CreateQuestion (OpCodeData, FormSet, CurrentForm);\r
+ ASSERT (CurrentStatement != NULL);\r
\r
CurrentStatement->Flags = ((EFI_IFR_TIME *) OpCodeData)->Flags;\r
CurrentStatement->HiiValue.Type = EFI_IFR_TYPE_TIME;\r
// A Question may have more than one Default value which have different default types.\r
//\r
CurrentDefault = AllocateZeroPool (sizeof (QUESTION_DEFAULT));\r
+ ASSERT (CurrentDefault != NULL);\r
CurrentDefault->Signature = QUESTION_DEFAULT_SIGNATURE;\r
\r
CurrentDefault->Value.Type = ((EFI_IFR_DEFAULT *) OpCodeData)->Type;\r
// It create a selection for use in current Question.\r
//\r
CurrentOption = AllocateZeroPool (sizeof (QUESTION_OPTION));\r
+ ASSERT (CurrentOption != NULL);\r
CurrentOption->Signature = QUESTION_OPTION_SIGNATURE;\r
\r
CurrentOption->Flags = ((EFI_IFR_ONE_OF_OPTION *) OpCodeData)->Flags;\r
break;\r
\r
default:\r
+ //\r
+ // Make sure CurrentStatement is not NULL.\r
+ // If it is NULL, 1) ParseOpCodes functions may parse the IFR wrongly. Or 2) the IFR\r
+ // file is wrongly generated by tools such as VFR Compiler.\r
+ //\r
+ ASSERT (CurrentStatement != NULL);\r
ImageId = &CurrentStatement->ImageId;\r
break;\r
}\r
-\r
+ \r
+ ASSERT (ImageId != NULL);\r
CopyMem (ImageId, &((EFI_IFR_IMAGE *) OpCodeData)->Id, sizeof (EFI_IMAGE_ID));\r
break;\r
\r
// Refresh\r
//\r
case EFI_IFR_REFRESH_OP:\r
+ ASSERT (CurrentStatement != NULL);\r
CurrentStatement->RefreshInterval = ((EFI_IFR_REFRESH *) OpCodeData)->RefreshInterval;\r
break;\r
\r