mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-11 14:28:08 +01:00
123 lines
3.3 KiB
C++
123 lines
3.3 KiB
C++
/*
|
|
* Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
|
|
*
|
|
* @APPLE_LICENSE_HEADER_START@
|
|
*
|
|
* The contents of this file constitute Original Code as defined in and
|
|
* are subject to the Apple Public Source License Version 1.1 (the
|
|
* "License"). You may not use this file except in compliance with the
|
|
* License. Please obtain a copy of the License at
|
|
* http://www.apple.com/publicsource and read it before using this file.
|
|
*
|
|
* This Original Code and all software distributed under the License are
|
|
* distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
|
|
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
|
|
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
|
|
* License for the specific language governing rights and limitations
|
|
* under the License.
|
|
*
|
|
* @APPLE_LICENSE_HEADER_END@
|
|
*/
|
|
/*
|
|
* plist.c - plist parsing functions
|
|
*
|
|
* Copyright (c) 2000-2005 Apple Computer, Inc.
|
|
*
|
|
* DRI: Josh de Cesare
|
|
* code split out from drivers.c by Soren Spies, 2005
|
|
*/
|
|
//Slice - rewrite for UEFI with more functions like Copyright (c) 2003 Apple Computer
|
|
#include <Platform.h> // Only use angled for Platform, else, xcode project won't compile
|
|
|
|
#ifndef DEBUG_ALL
|
|
#define DEBUG_XML 1
|
|
#else
|
|
#define DEBUG_XML DEBUG_ALL
|
|
#endif
|
|
|
|
#if DEBUG_PLIST == 0
|
|
#define DBG(...)
|
|
#else
|
|
#define DBG(...) DebugLog(DEBUG_XML, __VA_ARGS__)
|
|
#endif
|
|
|
|
|
|
|
|
/* Function for basic XML character entities parsing */
|
|
class XMLEntity
|
|
{
|
|
public:
|
|
const XString8 name;
|
|
size_t nameLen;
|
|
CHAR8 value;
|
|
|
|
XMLEntity() : name(), nameLen(0), value(0) { }
|
|
XMLEntity(const XString8& _name, CHAR8 _value) : name(_name), nameLen(name.length()), value(_value) { }
|
|
|
|
// Not sure if default are valid. Delete them. If needed, proper ones can be created
|
|
XMLEntity(const XMLEntity&) = delete;
|
|
XMLEntity& operator=(const XMLEntity&) = delete;
|
|
|
|
};
|
|
|
|
const XMLEntity ents[] = {
|
|
{ "quot;"_XS8, '"' },
|
|
{"apos;"_XS8,'\''},
|
|
{"lt;"_XS8, '<'},
|
|
{"gt;"_XS8, '>'},
|
|
{"amp;"_XS8, '&'}
|
|
};
|
|
|
|
/*
|
|
* Replace XML entities by their value
|
|
* out can be src
|
|
*/
|
|
|
|
size_t XMLDecode(const char* src, size_t srclen, char* out, size_t outlen)
|
|
{
|
|
const char* s;
|
|
char* o;
|
|
|
|
if (!src) {
|
|
if ( outlen > 0 ) *out = 0;
|
|
return 0;
|
|
}
|
|
|
|
// out is always <= src, let's overwrite src
|
|
s = src;
|
|
o = out;
|
|
while (s < src+srclen) /* Make sure the terminator is also copied */
|
|
{
|
|
if ( *s == '&' ) {
|
|
s++;
|
|
size_t i;
|
|
for (i = 0; i < sizeof(ents)/sizeof(ents[0]); i++) {
|
|
if ( ents[i].name.strncmp(s, ents[i].nameLen) == 0 ) {
|
|
if ( uintptr_t(o)-uintptr_t(out) >= outlen ) return uintptr_t(o)-uintptr_t(out);
|
|
*o++ = ents[i].value;
|
|
s += ents[i].nameLen;
|
|
break;
|
|
}
|
|
}
|
|
if ( i < sizeof(ents)/sizeof(ents[0]) ) continue; // if entity is found, let's go up to the beginning of the loop and avoid inserting thenext char without checking if it's another entity
|
|
}
|
|
if ( uintptr_t(o)-uintptr_t(out) >= outlen ) return uintptr_t(o)-uintptr_t(out);
|
|
*o++ = *s++;
|
|
}
|
|
if ( uintptr_t(o)-uintptr_t(out) < outlen ) *o = 0;
|
|
return uintptr_t(o)-uintptr_t(out);
|
|
}
|
|
|
|
char* XMLDecode(char* src, size_t size)
|
|
{
|
|
XMLDecode(src, size, src, size+1);
|
|
return src;
|
|
}
|
|
|
|
char* XMLDecode(char* src)
|
|
{
|
|
XMLDecode(src, strlen(src), src, strlen(src)+1);
|
|
return src;
|
|
}
|