2020-08-25 17:35:19 +02:00
/*
* 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 , ' & ' }
} ;
2021-03-25 15:32:56 +01:00
/*
* Replace XML entities by their value
* out can be src
*/
size_t XMLDecode ( const char * src , size_t srclen , char * out , size_t outlen )
2020-08-25 17:35:19 +02:00
{
2021-03-25 15:32:56 +01:00
const char * s ;
char * o ;
2020-08-25 17:35:19 +02:00
if ( ! src ) {
2021-04-12 14:11:01 +02:00
if ( outlen > 0 ) * out = 0 ;
2020-08-25 17:35:19 +02:00
return 0 ;
}
// out is always <= src, let's overwrite src
s = src ;
2021-03-25 15:32:56 +01:00
o = out ;
while ( s < src + srclen ) /* Make sure the terminator is also copied */
2020-08-25 17:35:19 +02:00
{
if ( * s = = ' & ' ) {
s + + ;
2021-04-12 14:11:01 +02:00
size_t i ;
2020-08-25 17:35:19 +02:00
for ( i = 0 ; i < sizeof ( ents ) / sizeof ( ents [ 0 ] ) ; i + + ) {
if ( ents [ i ] . name . strncmp ( s , ents [ i ] . nameLen ) = = 0 ) {
2021-03-25 15:32:56 +01:00
if ( uintptr_t ( o ) - uintptr_t ( out ) > = outlen ) return uintptr_t ( o ) - uintptr_t ( out ) ;
* o + + = ents [ i ] . value ;
s + = ents [ i ] . nameLen ;
2020-08-25 17:35:19 +02:00
break ;
}
}
2021-04-12 14:11:01 +02:00
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
2020-08-25 17:35:19 +02:00
}
2021-03-25 15:32:56 +01:00
if ( uintptr_t ( o ) - uintptr_t ( out ) > = outlen ) return uintptr_t ( o ) - uintptr_t ( out ) ;
2020-08-25 17:35:19 +02:00
* o + + = * s + + ;
}
2021-03-25 15:32:56 +01:00
if ( uintptr_t ( o ) - uintptr_t ( out ) < outlen ) * o = 0 ;
return uintptr_t ( o ) - uintptr_t ( out ) ;
2020-08-25 17:35:19 +02:00
}
2021-04-08 17:07:05 +02:00
char * XMLDecode ( char * src , size_t size )
{
XMLDecode ( src , size , src , size + 1 ) ;
return src ;
}
2021-03-25 15:32:56 +01:00
char * XMLDecode ( char * src )
{
XMLDecode ( src , strlen ( src ) , src , strlen ( src ) + 1 ) ;
return src ;
}