| 233 | } |
| 234 | |
| 235 | VOID |
| 236 | ParseLoadOptions ( |
| 237 | OUT XStringW* ConfNamePtr, |
| 238 | OUT TagDict** Dict |
| 239 | ) |
| 240 | { |
| 241 | CHAR8 *End; |
| 242 | CHAR8 *Start; |
| 243 | UINTN TailSize; |
| 244 | UINTN i; |
| 245 | CONST CHAR8 *PlistStrings[] = |
| 246 | { |
| 247 | "<?xml", |
| 248 | "<!DOCTYPE plist", |
| 249 | "<plist", |
| 250 | "<dict>", |
| 251 | "\0" |
| 252 | }; |
| 253 | |
| 254 | UINTN PlistStringsLen; |
| 255 | CHAR8 *AsciiConf; |
| 256 | |
| 257 | AsciiConf = NULL; |
| 258 | *Dict = NULL; |
| 259 | |
| 260 | XStringW& ConfName = *ConfNamePtr; |
| 261 | |
| 262 | Start = (CHAR8*)SelfLoadedImage->LoadOptions; |
| 263 | End = (CHAR8*)((CHAR8*)SelfLoadedImage->LoadOptions + SelfLoadedImage->LoadOptionsSize); |
| 264 | while ((Start < End) && ((*Start == ' ') || (*Start == '\\') || (*Start == '/'))) |
| 265 | { |
| 266 | ++Start; |
| 267 | } |
| 268 | |
| 269 | TailSize = End - Start; |
| 270 | //DBG("TailSize = %d\n", TailSize); |
| 271 | |
| 272 | if ((TailSize) <= 0) { |
| 273 | return; |
| 274 | } |
| 275 | |
| 276 | for (i = 0; PlistStrings[i][0] != '\0'; i++) { |
| 277 | PlistStringsLen = AsciiStrLen(PlistStrings[i]); |
| 278 | //DBG("PlistStrings[%d] = %s\n", i, PlistStrings[i]); |
| 279 | if (PlistStringsLen < TailSize) { |
| 280 | if (AsciiStriNCmp(PlistStrings[i], Start, PlistStringsLen)) { |
| 281 | DBG(" - found plist string = %s, parse XML in LoadOptions\n", PlistStrings[i]); |
| 282 | if (ParseXML(Start, Dict, TailSize) != EFI_SUCCESS) { |
| 283 | *Dict = NULL; |
| 284 | DBG(" - [!] xml in load options is bad\n"); |
| 285 | return; |
| 286 | } |
| 287 | return; |
| 288 | } |
| 289 | } |
| 290 | } |
| 291 | |
| 292 | while ((End > Start) && ((*End == ' ') || (*End == '\\') || (*End == '/'))) { |
no test coverage detected