From d3da5e1a2175159163114ce78f0109b96e7cd08e Mon Sep 17 00:00:00 2001 From: SergeySlice Date: Wed, 22 Apr 2020 20:52:21 +0300 Subject: [PATCH] parsing float values in plists Signed-off-by: SergeySlice --- rEFIt_UEFI/Platform/Settings.cpp | 5 ++ rEFIt_UEFI/Platform/Settings.h | 3 +- rEFIt_UEFI/Platform/plist.cpp | 123 ++++++++++++++++++++----------- rEFIt_UEFI/Platform/plist.h | 33 +++++++++ rEFIt_UEFI/refit/menu.cpp | 4 +- 5 files changed, 122 insertions(+), 46 deletions(-) diff --git a/rEFIt_UEFI/Platform/Settings.cpp b/rEFIt_UEFI/Platform/Settings.cpp index 8723a1f68e..5fe8d3f352 100644 --- a/rEFIt_UEFI/Platform/Settings.cpp +++ b/rEFIt_UEFI/Platform/Settings.cpp @@ -2653,6 +2653,11 @@ GetEarlyUserSettings ( if (IsPropertyTrue (Prop)) { gSettings.NoCaches = TRUE; } + //test float + Prop = GetProperty (DictPointer, "BlueValue"); + float tmpF = GetPropertyFloat(Prop, 1.2f); + DBG(" get BlueValue=%f\n", tmpF); + } // KernelAndKextPatches diff --git a/rEFIt_UEFI/Platform/Settings.h b/rEFIt_UEFI/Platform/Settings.h index 19a7098a89..f7afeac77a 100644 --- a/rEFIt_UEFI/Platform/Settings.h +++ b/rEFIt_UEFI/Platform/Settings.h @@ -166,7 +166,8 @@ typedef enum { kTagTypeDate, kTagTypeFalse, kTagTypeTrue, - kTagTypeArray + kTagTypeArray, + kTagTypeFloat } TAG_TYPE; typedef struct DEV_PROPERTY DEV_PROPERTY; //yyyy diff --git a/rEFIt_UEFI/Platform/plist.cpp b/rEFIt_UEFI/Platform/plist.cpp index 7d90ed09d5..d8149cc2e5 100755 --- a/rEFIt_UEFI/Platform/plist.cpp +++ b/rEFIt_UEFI/Platform/plist.cpp @@ -30,6 +30,8 @@ //Slice - rewrite for UEFI with more functions like Copyright (c) 2003 Apple Computer #include "Platform.h" #include "b64cdecode.h" +#include "plist.h" +#include "../libeg/FloatLib.h" #ifndef DEBUG_ALL #define DEBUG_PLIST 0 @@ -45,44 +47,19 @@ -/* XML Tags */ -#define kXMLTagPList "plist" -#define kXMLTagDict "dict" -#define kXMLTagKey "key" -#define kXMLTagString "string" -#define kXMLTagInteger "integer" -#define kXMLTagData "data" -#define kXMLTagDate "date" -#define kXMLTagFalse "false/" -#define kXMLTagTrue "true/" -#define kXMLTagArray "array" -#define kXMLTagReference "reference" -#define kXMLTagID "ID=" -#define kXMLTagIDREF "IDREF=" - - -struct Symbol { - UINTN refCount; - struct Symbol *next; - CHAR8 string[1]; -}; - -typedef struct Symbol Symbol, *SymbolPtr; - - - SymbolPtr gSymbolsHead = NULL; TagPtr gTagsFree = NULL; CHAR8* buffer_start = NULL; // Forward declarations EFI_STATUS ParseTagList( CHAR8* buffer, TagPtr * tag, UINT32 type, UINT32 empty, UINT32* lenPtr); -EFI_STATUS ParseTagKey( char * buffer, TagPtr * tag,UINT32* lenPtr); -EFI_STATUS ParseTagString(CHAR8* buffer, TagPtr * tag,UINT32* lenPtr); -EFI_STATUS ParseTagInteger(CHAR8* buffer, TagPtr * tag,UINT32* lenPtr); -EFI_STATUS ParseTagData(CHAR8* buffer, TagPtr * tag,UINT32* lenPtr); -EFI_STATUS ParseTagDate(CHAR8* buffer, TagPtr * tag,UINT32* lenPtr); -EFI_STATUS ParseTagBoolean(CHAR8* buffer, TagPtr * tag, UINT32 type,UINT32* lenPtr); +EFI_STATUS ParseTagKey( char * buffer, TagPtr * tag, UINT32* lenPtr); +EFI_STATUS ParseTagString(CHAR8* buffer, TagPtr * tag, UINT32* lenPtr); +EFI_STATUS ParseTagInteger(CHAR8* buffer, TagPtr * tag, UINT32* lenPtr); +EFI_STATUS ParseTagFloat(CHAR8* buffer, TagPtr * tag, UINT32* lenPtr); +EFI_STATUS ParseTagData(CHAR8* buffer, TagPtr * tag, UINT32* lenPtr); +EFI_STATUS ParseTagDate(CHAR8* buffer, TagPtr * tag, UINT32* lenPtr); +EFI_STATUS ParseTagBoolean(CHAR8* buffer, TagPtr * tag, UINT32 type, UINT32* lenPtr); //defined in Platform.h //EFI_STATUS GetElement( TagPtr dict, INTN id, TagPtr *dict1); //INTN GetTagCount( TagPtr dict ); @@ -135,22 +112,17 @@ XMLDecode(CHAR8* src) s = src; while (s <= src+len) /* Make sure the terminator is also copied */ { - if ( *s == '&' ) - { + if ( *s == '&' ) { BOOLEAN entFound = FALSE; UINTN i; - s++; - for ( i = 0; i < sizeof(ents)/sizeof(ents[0]); i++) - { - if ( AsciiStrnCmp(s, ents[i].name, ents[i].nameLen) == 0 ) - { + for (i = 0; i < sizeof(ents)/sizeof(ents[0]); i++) { + if ( AsciiStrnCmp(s, ents[i].name, ents[i].nameLen) == 0 ) { entFound = TRUE; break; } } - if ( entFound ) - { + if ( entFound ) { *o++ = ents[i].value; s += ents[i].nameLen; continue; @@ -414,7 +386,15 @@ EFI_STATUS XMLParseNextTag(CHAR8* buffer, TagPtr* tag, UINT32* lenPtr) { Status = ParseTagInteger(buffer + pos, tag, &length); } - + /***** float ****/ + else if (!AsciiStrCmp(tagName, kXMLTagFloat)) + { + Status = ParseTagFloat(buffer + pos, tag, &length); + } + else if (!AsciiStrnCmp(tagName, kXMLTagFloat " ", 8)) + { + Status = ParseTagFloat(buffer + pos, tag, &length); + } /***** data ****/ else if (!AsciiStrCmp(tagName, kXMLTagData)) { @@ -637,7 +617,7 @@ EFI_STATUS ParseTagString(CHAR8* buffer, TagPtr * tag,UINT32* lenPtr) //========================================================================== // ParseTagInteger -EFI_STATUS ParseTagInteger(CHAR8* buffer, TagPtr * tag,UINT32* lenPtr) +EFI_STATUS ParseTagInteger(CHAR8* buffer, TagPtr * tag, UINT32* lenPtr) { EFI_STATUS Status; UINT32 length = 0; @@ -647,7 +627,7 @@ EFI_STATUS ParseTagInteger(CHAR8* buffer, TagPtr * tag,UINT32* lenPtr) CHAR8* val = buffer; TagPtr tmpTag; - Status = FixDataMatchingTag(buffer, kXMLTagInteger,&length); + Status = FixDataMatchingTag(buffer, kXMLTagInteger, &length); if (EFI_ERROR(Status)) { return Status; } @@ -726,6 +706,43 @@ EFI_STATUS ParseTagInteger(CHAR8* buffer, TagPtr * tag,UINT32* lenPtr) return EFI_SUCCESS; } +//========================================================================== +// ParseTagFloat + +EFI_STATUS ParseTagFloat(CHAR8* buffer, TagPtr * tag, UINT32* lenPtr) +{ + EFI_STATUS Status; + UINT32 length = 0; //unused? +// BOOLEAN negative = FALSE; +// CHAR8* val = buffer; + TagPtr tmpTag; + FlMix fVar; + fVar.B.fNum = 0.f; + fVar.B.pad = 0; + + Status = FixDataMatchingTag(buffer, kXMLTagFloat, &length); + if (EFI_ERROR(Status)) { + return Status; + } + + tmpTag = NewTag(); + if (tmpTag == NULL) { + return EFI_OUT_OF_RESOURCES; + } +//---- + AsciiStrToFloat(buffer, NULL, &fVar.B.fNum); +//---- + tmpTag->type = kTagTypeFloat; + tmpTag->string = fVar.string; + tmpTag->tag = NULL; + tmpTag->offset = (UINT32)(buffer_start ? buffer - buffer_start: 0); + tmpTag->tagNext = NULL; + + *tag = tmpTag; + *lenPtr = length; + return EFI_SUCCESS; +} + //========================================================================== // ParseTagData @@ -1140,3 +1157,21 @@ GetPropertyInteger ( } return Default; } + +float GetPropertyFloat (TagPtr Prop, float Default) +{ + if (Prop == NULL) { + return Default; + } + if (Prop->type == kTagTypeFloat) { + FlMix fVar; + fVar.string = Prop->string; + return fVar.B.fNum; //this is union char* or float + } else if ((Prop->type == kTagTypeString) && Prop->string) { + float fVar = 0.f; + if(!AsciiStrToFloat(Prop->string, NULL, &fVar)) //if success then return 0 + return fVar; + } + + return Default; +} diff --git a/rEFIt_UEFI/Platform/plist.h b/rEFIt_UEFI/Platform/plist.h index 95eea40ac6..f25740f7a4 100644 --- a/rEFIt_UEFI/Platform/plist.h +++ b/rEFIt_UEFI/Platform/plist.h @@ -9,6 +9,30 @@ #define PLATFORM_PLIST_H_ +/* XML Tags */ +#define kXMLTagPList "plist" +#define kXMLTagDict "dict" +#define kXMLTagKey "key" +#define kXMLTagString "string" +#define kXMLTagInteger "integer" +#define kXMLTagData "data" +#define kXMLTagDate "date" +#define kXMLTagFalse "false/" +#define kXMLTagTrue "true/" +#define kXMLTagArray "array" +#define kXMLTagReference "reference" +#define kXMLTagID "ID=" +#define kXMLTagIDREF "IDREF=" +#define kXMLTagFloat "real" + + +struct Symbol { + UINTN refCount; + struct Symbol *next; + CHAR8 string[1]; +}; +typedef struct Symbol Symbol, *SymbolPtr; + typedef struct TagStruct { @@ -22,6 +46,13 @@ typedef struct TagStruct { } TagStruct, *TagPtr; +typedef union { + struct { + float fNum; //4 bytes + UINT32 pad; // else 4 + } B; + CHAR8 *string; +} FlMix; CHAR8* @@ -93,5 +124,7 @@ GetPropertyInteger ( INTN Default ); +float GetPropertyFloat (TagPtr Prop, float Default); + #endif /* PLATFORM_PLIST_H_ */ diff --git a/rEFIt_UEFI/refit/menu.cpp b/rEFIt_UEFI/refit/menu.cpp index bd17d06a5d..af825191fb 100644 --- a/rEFIt_UEFI/refit/menu.cpp +++ b/rEFIt_UEFI/refit/menu.cpp @@ -2475,7 +2475,9 @@ VOID CreateMenuProps(REFIT_MENU_SCREEN *SubScreen, DEV_PROPERTY *Prop) case kTagTypeTrue: SubScreen->AddMenuInfo_f((" value: true")); break; - + case kTagTypeFloat: + SubScreen->AddMenuInfo_f(" value: %f", *(float*)Prop->Value); + break; default: //type data, print first 24 bytes //CHAR8* Bytes2HexStr(UINT8 *data, UINTN len) SubScreen->AddMenuInfo_f(" value[%llu]: %24s", Prop->ValueLen, Bytes2HexStr((UINT8*)Prop->Value, MIN(24, Prop->ValueLen)));