1 /*++ 2 3 Copyright (c) 2004 - 2010, Intel Corporation. All rights reserved.<BR> 4 This program and the accompanying materials 5 are licensed and made available under the terms and conditions of the BSD License 6 which accompanies this distribution. The full text of the license may be found at 7 http://opensource.org/licenses/bsd-license.php 8 9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 11 12 Module Name: 13 14 StringParse.c 15 16 Abstract: 17 18 Routines for parsing HII string packs 19 20 --*/ 21 22 #include <stdio.h> 23 #include <string.h> 24 #include <stdlib.h> 25 26 #include "Tiano.h" 27 #include "EfiUtilityMsgs.h" 28 #include "EfiInternalFormRepresentation.h" 29 #include "Hii.h" 30 #include "StringParse.h" 31 #include "HiiPack.h" 32 33 typedef struct _STRING_PACK_RECORD { 34 struct _STRING_PACK_RECORD *Next; 35 int Handle; 36 EFI_GUID PackageGuid; 37 EFI_GUID FormsetGuid; 38 EFI_HII_STRING_PACK *StringPack; 39 int StringPackSize; 40 int NumStringPacks; 41 } STRING_PACK_RECORD; 42 43 static STRING_PACK_RECORD *mStringPacks = NULL; 44 45 STATUS 46 StringGetPack ( 47 int Handle, // matches handle passed in with StringParsePack() 48 EFI_HII_STRING_PACK **StringPack, // returned pointer to string pack 49 int *StringPackSize, // sizeof buffer pointed to by StringPack 50 int *NumStringPacks, // in the array pointed to by StringPack 51 EFI_GUID *FormsetGuid, 52 EFI_GUID *PackageGuid 53 ) 54 /*++ 55 56 Routine Description: 57 58 Get a string pack given to us previously 59 60 Arguments: 61 Handle - handle of string pack to get 62 StringPack - outgoing pointer to string pack on the given handle 63 StringPackSize - outgoing size of string pack pointed to by StringPack 64 NumStringPacks - outgoing number of string packs in StringPack[] array 65 FormsetGuid - outgoing GUID passed in with the string pack when it was parsed 66 PackageGuid - outgoing GUID passed in with the string pack when it was parsed 67 68 Returns: 69 70 STATUS_SUCCESS - string pack with matching handle was found 71 STATUS_ERROR - otherwise 72 73 --*/ 74 { 75 STRING_PACK_RECORD *Rec; 76 77 for (Rec = mStringPacks; Rec != NULL; Rec = Rec->Next) { 78 if (Rec->Handle == Handle) { 79 *StringPack = Rec->StringPack; 80 *StringPackSize = Rec->StringPackSize; 81 *NumStringPacks = Rec->NumStringPacks; 82 return STATUS_SUCCESS; 83 } 84 } 85 86 return STATUS_ERROR; 87 } 88 89 STATUS 90 StringParsePack ( 91 int Handle, 92 EFI_HII_STRING_PACK *StringPack, 93 EFI_GUID *FormsetGuid, 94 EFI_GUID *PackageGuid 95 ) 96 /*++ 97 98 Routine Description: 99 100 Parse a string pack, saving the information for later retrieval by the caller 101 102 Arguments: 103 Handle - handle of string pack 104 StringPack - pointer to string pack array to parse 105 FormsetGuid - GUID of the string pack 106 PackageGuid - package GUID from the HII data table from which this string pack orginated 107 108 Returns: 109 110 STATUS_SUCCESS - Stringpack processed successfully 111 STATUS_ERROR - otherwise 112 113 --*/ 114 { 115 STRING_PACK_RECORD *Rec; 116 117 STRING_PACK_RECORD *TempRec; 118 int PackSize; 119 EFI_HII_STRING_PACK *TempPack; 120 // 121 // Allocate a new string pack record 122 // 123 Rec = (STRING_PACK_RECORD *) malloc (sizeof (STRING_PACK_RECORD)); 124 if (Rec == NULL) { 125 Error (NULL, 0, 0, "memory allocation failure", NULL); 126 return STATUS_ERROR; 127 } 128 129 memset (Rec, 0, sizeof (STRING_PACK_RECORD)); 130 Rec->Handle = Handle; 131 if (PackageGuid != NULL) { 132 memcpy (&Rec->PackageGuid, PackageGuid, sizeof (EFI_GUID)); 133 } 134 135 if (FormsetGuid != NULL) { 136 memcpy (&Rec->FormsetGuid, FormsetGuid, sizeof (EFI_GUID)); 137 } 138 // 139 // Walk the string packs to find the terminator 140 // 141 TempPack = StringPack; 142 PackSize = 0; 143 while (TempPack->Header.Length > 0) { 144 if (TempPack->Header.Type != EFI_HII_STRING) { 145 Error (NULL, 0, 0, "found a non-string pack in the string pack array", NULL); 146 free (Rec); 147 return STATUS_ERROR; 148 } 149 150 PackSize += TempPack->Header.Length; 151 Rec->NumStringPacks++; 152 TempPack = (EFI_HII_STRING_PACK *) ((char *) TempPack + TempPack->Header.Length); 153 } 154 // 155 // Add space for the terminator 156 // 157 PackSize += sizeof (EFI_HII_STRING_PACK); 158 Rec->StringPackSize = PackSize; 159 // 160 // Make a copy of the incoming string pack 161 // 162 Rec->StringPack = (EFI_HII_STRING_PACK *) malloc (PackSize); 163 if (Rec->StringPack == NULL) { 164 Error (NULL, 0, 0, "memory allocation failure", NULL); 165 free (Rec); 166 return STATUS_ERROR; 167 } 168 169 memcpy ((void *) Rec->StringPack, StringPack, PackSize); 170 // 171 // Add this record to our list 172 // 173 if (mStringPacks == NULL) { 174 mStringPacks = Rec; 175 } else { 176 for (TempRec = mStringPacks; TempRec->Next != NULL; TempRec = TempRec->Next) 177 ; 178 TempRec->Next = Rec; 179 } 180 free (Rec->StringPack); 181 free (Rec); 182 return STATUS_SUCCESS; 183 } 184 185 STATUS 186 StringInit ( 187 VOID 188 ) 189 /*++ 190 191 Routine Description: 192 193 GC_TODO: Add function description 194 195 Arguments: 196 197 None 198 199 Returns: 200 201 GC_TODO: add return values 202 203 --*/ 204 { 205 StringEnd (); 206 return STATUS_SUCCESS; 207 } 208 209 STATUS 210 StringEnd ( 211 VOID 212 ) 213 /*++ 214 215 Routine Description: 216 217 GC_TODO: Add function description 218 219 Arguments: 220 221 None 222 223 Returns: 224 225 GC_TODO: add return values 226 227 --*/ 228 { 229 STRING_PACK_RECORD *Next; 230 // 231 // Free up all the memory we've allocated 232 // 233 while (mStringPacks != NULL) { 234 if (mStringPacks->StringPack != NULL) { 235 free (mStringPacks->StringPack); 236 } 237 238 Next = mStringPacks->Next; 239 free (mStringPacks); 240 mStringPacks = Next; 241 } 242 243 return STATUS_SUCCESS; 244 } 245