parsing float values in plists

Signed-off-by: SergeySlice <sergey.slice@gmail.com>
This commit is contained in:
SergeySlice 2020-04-22 20:52:21 +03:00
parent 15a9eebae6
commit d3da5e1a21
5 changed files with 122 additions and 46 deletions

View File

@ -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

View File

@ -166,7 +166,8 @@ typedef enum {
kTagTypeDate,
kTagTypeFalse,
kTagTypeTrue,
kTagTypeArray
kTagTypeArray,
kTagTypeFloat
} TAG_TYPE;
typedef struct DEV_PROPERTY DEV_PROPERTY; //yyyy

View File

@ -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;
}

View File

@ -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_ */

View File

@ -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)));