Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in / Register
Toggle navigation
L
libplist
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
1
Issues
1
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
pwn
libplist
Commits
77b02c94
Commit
77b02c94
authored
Oct 10, 2009
by
Jonathan Beck
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Rework public API to make it more consistent.
parent
c18c9d08
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
565 additions
and
199 deletions
+565
-199
plist.h
include/plist/plist.h
+258
-87
plist.c
src/plist.c
+307
-112
No files found.
include/plist/plist.h
View file @
77b02c94
...
...
@@ -65,13 +65,11 @@ extern "C" {
* The enumeration of plist node types.
*/
typedef
enum
{
PLIST_BOOLEAN
,
/**< Boolean, scalar type */
PLIST_BOOLEAN
,
/**< Boolean, scalar type */
PLIST_UINT
,
/**< Unsigned integer, scalar type */
PLIST_REAL
,
/**< Real, scalar type */
PLIST_STRING
,
/**< ASCII string, scalar type */
PLIST_ARRAY
,
/**< Ordered array, structured type */
PLIST_STRING
,
/**< ASCII string, scalar type */
PLIST_ARRAY
,
/**< Ordered array, structured type */
PLIST_DICT
,
/**< Unordered dictionary (key/value pair), structured type */
PLIST_DATE
,
/**< Date, scalar type */
PLIST_DATA
,
/**< Binary data, scalar type */
...
...
@@ -102,6 +100,62 @@ extern "C" {
*/
PLIST_API
plist_t
plist_new_array
(
void
);
/**
* Create a new plist_t type #PLIST_STRING
*
* @param val the sting value, encoded in UTF8.
* @return the created item
* @sa #plist_type
*/
PLIST_API
plist_t
plist_new_string
(
const
char
*
val
);
/**
* Create a new plist_t type #PLIST_BOOLEAN
*
* @param val the boolean value, 0 is false, other values are true.
* @return the created item
* @sa #plist_type
*/
PLIST_API
plist_t
plist_new_bool
(
uint8_t
val
);
/**
* Create a new plist_t type #PLIST_UINT
*
* @param val the unsigned integer value
* @return the created item
* @sa #plist_type
*/
PLIST_API
plist_t
plist_new_uint
(
uint64_t
val
);
/**
* Create a new plist_t type #PLIST_REAL
*
* @param val the real value
* @return the created item
* @sa #plist_type
*/
PLIST_API
plist_t
plist_new_real
(
double
val
);
/**
* Create a new plist_t type #PLIST_DATA
*
* @param val the binary buffer
* @param length the length of the buffer
* @return the created item
* @sa #plist_type
*/
PLIST_API
plist_t
plist_new_data
(
const
char
*
val
,
uint64_t
length
);
/**
* Create a new plist_t type #PLIST_DATE
*
* @param sec the number of seconds since 01/01/2001
* @param usec the number of microseconds
* @return the created item
* @sa #plist_type
*/
PLIST_API
plist_t
plist_new_date
(
int32_t
sec
,
int32_t
usec
);
/**
* Destruct a plist_t node and all its children recursively
*
...
...
@@ -120,139 +174,113 @@ extern "C" {
/********************************************
* *
*
Tree navigation
*
*
Array functions
*
* *
********************************************/
/**
* Get
the first child of a node
* Get
size of a #PLIST_ARRAY node.
*
* @param node the first child
* @param node the node of type #PLIST_ARRAY
* @return size of the #PLIST_ARRAY node
*/
PLIST_API
plist_t
plist_get_first_child
(
plist_t
node
);
PLIST_API
uint32_t
plist_array_get_size
(
plist_t
node
);
/**
* Get the n
ext sibling of a node
* Get the n
th item in a #PLIST_ARRAY node.
*
* @param node the next sibling
* @param node the node of type #PLIST_ARRAY
* @param n the index of the item to get. Range is [0, array_size[
* @return the nth item or NULL if node is not of type #PLIST_ARRAY
*/
PLIST_API
plist_t
plist_get_next_sibling
(
plist_t
node
);
PLIST_API
plist_t
plist_array_get_item
(
plist_t
node
,
uint32_t
n
);
/**
* Get the previous sibling of a node
* Set the nth item in a #PLIST_ARRAY node.
* The previous item at index n will be freed using #plist_free
*
* @param node the previous sibling
* @param node the node of type #PLIST_ARRAY
* @param item the new item at index n
* @param n the index of the item to get. Range is [0, array_size[. Assert if n is not in range.
*/
PLIST_API
plist_t
plist_get_prev_sibling
(
plist_t
node
);
PLIST_API
void
plist_array_set_item
(
plist_t
node
,
plist_t
item
,
uint32_t
n
);
/**
*
Get the parent of a node
*
Append a new item at the end of a #PLIST_ARRAY node.
*
* @param node the parent (NULL if node is root)
* @param node the node of type #PLIST_ARRAY
* @param item the new item
*/
PLIST_API
plist_t
plist_get_parent
(
plist_t
node
);
PLIST_API
void
plist_array_append_item
(
plist_t
node
,
plist_t
item
);
/**
*
Get the nth child of
a #PLIST_ARRAY node.
*
Insert a new item at position n in
a #PLIST_ARRAY node.
*
* @param node the node of type #PLIST_ARRAY
* @param
n the index of the child to get. Range is [0, array_size[
* @
return the nth children or NULL if node is not of type #PLIST_ARRAY
* @param
item the new item to insert
* @
param n The position at which the node will be stored. Range is [0, array_size[. Assert if n is not in range.
*/
PLIST_API
plist_t
plist_get_array_nth_el
(
plist_t
node
,
uint32_t
n
);
PLIST_API
void
plist_array_insert_item
(
plist_t
node
,
plist_t
item
,
uint32_t
n
);
/**
* Get the child of a #PLIST_DICT node from the associated key value.
* Remove an existing position in a #PLIST_ARRAY node.
* Removed position will be freed using #plist_free
*
* @param node the node of type #PLIST_DICT
* @param key the key associated to the requested value
* @return the key associated value or NULL if node is not of type #PLIST_DICT
* @param node the node of type #PLIST_ARRAY
* @param n The position to remove. Range is [0, array_size[. Assert if n is not in range.
*/
PLIST_API
plist_t
plist_get_dict_el_from_key
(
plist_t
node
,
const
char
*
key
);
PLIST_API
void
plist_array_remove_item
(
plist_t
node
,
uint32_t
n
);
/********************************************
* *
*
Setters
*
*
Dictionary functions
*
* *
********************************************/
/**
* Add a subnode to a node. The node must be of a structured type
* (ie #PLIST_DICT or #PLIST_ARRAY). This function fails silently
* if subnode already has a father.
*
* @param node the node to add a children to
* @param subnode the children node
*/
PLIST_API
void
plist_add_sub_node
(
plist_t
node
,
plist_t
subnode
);
/**
* Add a subnode of type #PLIST_KEY to a node. The node must be of a structured type
* (ie #PLIST_DICT or #PLIST_ARRAY).
*
* @param node the node to add a children to
* @param val the key value encoded as an ASCII string (must be null terminated)
*/
PLIST_API
void
plist_add_sub_key_el
(
plist_t
node
,
const
char
*
val
);
/**
* Add a subnode of type #PLIST_STRING to a node. The node must be of a structured type
* (ie #PLIST_DICT or #PLIST_ARRAY).
* Get size of a #PLIST_DICT node.
*
* @param node the node
to add a children to
* @
param val the string value encoded as an ASCII or UTF-8 string (must be null terminated)
* @param node the node
of type #PLIST_DICT
* @
return size of the #PLIST_DICT node
*/
PLIST_API
void
plist_add_sub_string_el
(
plist_t
node
,
const
char
*
val
);
PLIST_API
uint32_t
plist_dict_get_size
(
plist_t
node
);
/**
* Add a subnode of type #PLIST_BOOLEAN to a node. The node must be of a structured type
* (ie #PLIST_DICT or #PLIST_ARRAY).
* Get the nth item in a #PLIST_DICT node.
*
* @param node the node to add a children to
* @param val the boolean value (TRUE or FALSE)
*/
PLIST_API
void
plist_add_sub_bool_el
(
plist_t
node
,
uint8_t
val
);
/**
* Add a subnode of type #PLIST_UINT to a node. The node must be of a structured type
* (ie #PLIST_DICT or #PLIST_ARRAY).
*
* @param node the node to add a children to
* @param val the unsigned integer value
* @param node the node of type #PLIST_DICT
* @param key the identifier of the item to get.
* @return the item or NULL if node is not of type #PLIST_DICT
*/
PLIST_API
void
plist_add_sub_uint_el
(
plist_t
node
,
uint64_t
val
);
PLIST_API
plist_t
plist_dict_get_item
(
plist_t
node
,
const
char
*
key
);
/**
*
Add a subnode of type #PLIST_REAL to a node. The node must be of a structured type
*
(ie #PLIST_DICT or #PLIST_ARRAY).
*
Set item identified by key in a #PLIST_DICT node.
*
The previous item at index n will be freed using #plist_free
*
* @param node the node to add a children to
* @param val the real value
* @param node the node of type #PLIST_DICT
* @param item the new item associated to key
* @param key the identifier of the item to get. Assert if identifier is not present.
*/
PLIST_API
void
plist_
add_sub_real_el
(
plist_t
node
,
double
val
);
PLIST_API
void
plist_
dict_set_item
(
plist_t
node
,
plist_t
item
,
const
char
*
key
);
/**
* Add a subnode of type #PLIST_DATA to a node. The node must be of a structured type
* (ie #PLIST_DICT or #PLIST_ARRAY).
* Insert a new item at position n in a #PLIST_DICT node.
*
* @param node the node
to add a children to
* @param
val the binary buffer
* @param
length the length of the buffer
* @param node the node
of type #PLIST_DICT
* @param
item the new item to insert
* @param
key The identifier of the item to insert. Assert if identifier already present.
*/
PLIST_API
void
plist_
add_sub_data_el
(
plist_t
node
,
const
char
*
val
,
uint64_t
length
);
PLIST_API
void
plist_
dict_insert_item
(
plist_t
node
,
plist_t
item
,
const
char
*
key
);
/**
*
Add a subnode of type #PLIST_DATE to a node. The node must be of a structured type
*
(ie #PLIST_DICT or #PLIST_ARRAY).
*
Remove an existing position in a #PLIST_DICT node.
*
Removed position will be freed using #plist_free
*
* @param node the node to add a children to
* @param sec the number of seconds since 01/01/2001
* @param usec the number of microseconds
* @param node the node of type #PLIST_DICT
* @param key The identifier of the item to remove. Assert if identifier is not present.
*/
PLIST_API
void
plist_
add_sub_date_el
(
plist_t
node
,
int32_t
sec
,
int32_t
usec
);
PLIST_API
void
plist_
dict_remove_item
(
plist_t
node
,
const
char
*
key
);
/********************************************
...
...
@@ -261,6 +289,13 @@ extern "C" {
* *
********************************************/
/**
* Get the parent of a node
*
* @param node the parent (NULL if node is root)
*/
PLIST_API
plist_t
plist_get_parent
(
plist_t
node
);
/**
* Get the #plist_type of a node.
*
...
...
@@ -454,7 +489,6 @@ extern "C" {
PLIST_API
void
plist_from_bin
(
const
char
*
plist_bin
,
uint32_t
length
,
plist_t
*
plist
);
/********************************************
* *
* Utils *
...
...
@@ -488,6 +522,143 @@ extern "C" {
*/
PLIST_API
char
plist_compare_node_value
(
plist_t
node_l
,
plist_t
node_r
);
//DEPRECATED API BELOW
/*@}*/
/**
* \defgroup DeprecatedAPI Deprecated libplist API
*/
/*@{*/
/********************************************
* *
* Tree navigation *
* *
********************************************/
/**
* Get the first child of a node
*
* @param node the first child
*/
PLIST_API
plist_t
plist_get_first_child
(
plist_t
node
);
/**
* Get the next sibling of a node
*
* @param node the next sibling
*/
PLIST_API
plist_t
plist_get_next_sibling
(
plist_t
node
);
/**
* Get the previous sibling of a node
*
* @param node the previous sibling
*/
PLIST_API
plist_t
plist_get_prev_sibling
(
plist_t
node
);
/**
* Get the nth child of a #PLIST_ARRAY node.
*
* @param node the node of type #PLIST_ARRAY
* @param n the index of the child to get. Range is [0, array_size[
* @return the nth children or NULL if node is not of type #PLIST_ARRAY
*/
PLIST_API
plist_t
plist_get_array_nth_el
(
plist_t
node
,
uint32_t
n
);
/**
* Get the child of a #PLIST_DICT node from the associated key value.
*
* @param node the node of type #PLIST_DICT
* @param key the key associated to the requested value
* @return the key associated value or NULL if node is not of type #PLIST_DICT
*/
PLIST_API
plist_t
plist_get_dict_el_from_key
(
plist_t
node
,
const
char
*
key
);
/********************************************
* *
* Setters *
* *
********************************************/
/**
* Add a subnode to a node. The node must be of a structured type
* (ie #PLIST_DICT or #PLIST_ARRAY). This function fails silently
* if subnode already has a father.
*
* @param node the node to add a children to
* @param subnode the children node
*/
PLIST_API
void
plist_add_sub_node
(
plist_t
node
,
plist_t
subnode
);
/**
* Add a subnode of type #PLIST_KEY to a node. The node must be of a structured type
* (ie #PLIST_DICT or #PLIST_ARRAY).
*
* @param node the node to add a children to
* @param val the key value encoded as an ASCII string (must be null terminated)
*/
PLIST_API
void
plist_add_sub_key_el
(
plist_t
node
,
const
char
*
val
);
/**
* Add a subnode of type #PLIST_STRING to a node. The node must be of a structured type
* (ie #PLIST_DICT or #PLIST_ARRAY).
*
* @param node the node to add a children to
* @param val the string value encoded as an ASCII or UTF-8 string (must be null terminated)
*/
PLIST_API
void
plist_add_sub_string_el
(
plist_t
node
,
const
char
*
val
);
/**
* Add a subnode of type #PLIST_BOOLEAN to a node. The node must be of a structured type
* (ie #PLIST_DICT or #PLIST_ARRAY).
*
* @param node the node to add a children to
* @param val the boolean value (TRUE or FALSE)
*/
PLIST_API
void
plist_add_sub_bool_el
(
plist_t
node
,
uint8_t
val
);
/**
* Add a subnode of type #PLIST_UINT to a node. The node must be of a structured type
* (ie #PLIST_DICT or #PLIST_ARRAY).
*
* @param node the node to add a children to
* @param val the unsigned integer value
*/
PLIST_API
void
plist_add_sub_uint_el
(
plist_t
node
,
uint64_t
val
);
/**
* Add a subnode of type #PLIST_REAL to a node. The node must be of a structured type
* (ie #PLIST_DICT or #PLIST_ARRAY).
*
* @param node the node to add a children to
* @param val the real value
*/
PLIST_API
void
plist_add_sub_real_el
(
plist_t
node
,
double
val
);
/**
* Add a subnode of type #PLIST_DATA to a node. The node must be of a structured type
* (ie #PLIST_DICT or #PLIST_ARRAY).
*
* @param node the node to add a children to
* @param val the binary buffer
* @param length the length of the buffer
*/
PLIST_API
void
plist_add_sub_data_el
(
plist_t
node
,
const
char
*
val
,
uint64_t
length
);
/**
* Add a subnode of type #PLIST_DATE to a node. The node must be of a structured type
* (ie #PLIST_DICT or #PLIST_ARRAY).
*
* @param node the node to add a children to
* @param sec the number of seconds since 01/01/2001
* @param usec the number of microseconds
*/
PLIST_API
void
plist_add_sub_date_el
(
plist_t
node
,
int32_t
sec
,
int32_t
usec
);
/*@}*/
...
...
src/plist.c
View file @
77b02c94
...
...
@@ -80,57 +80,70 @@ plist_t plist_new_array(void)
return
plist_new_node
(
data
);
}
static
plist_t
plist_add_sub_element
(
plist_t
node
,
plist_type
type
,
const
void
*
value
,
uint64_t
length
)
//These nodes should not be handled by users
static
plist_t
plist_new_key
(
const
char
*
val
)
{
//only structured types can have children
plist_type
node_type
=
plist_get_node_type
(
node
);
if
(
node_type
==
PLIST_DICT
||
node_type
==
PLIST_ARRAY
)
{
//only structured types are allowed to have nulll value
if
(
value
||
(
!
value
&&
(
type
==
PLIST_DICT
||
type
==
PLIST_ARRAY
)))
{
plist_data_t
data
=
plist_new_plist_data
();
data
->
type
=
PLIST_KEY
;
data
->
strval
=
strdup
(
val
);
data
->
length
=
strlen
(
val
);
return
plist_new_node
(
data
);
}
plist_t
subnode
=
NULL
;
plist_t
plist_new_string
(
const
char
*
val
)
{
plist_data_t
data
=
plist_new_plist_data
();
data
->
type
=
PLIST_STRING
;
data
->
strval
=
strdup
(
val
);
data
->
length
=
strlen
(
val
);
return
plist_new_node
(
data
);
}
//now handle value
plist_data_t
data
=
plist_new_plist_data
();
data
->
type
=
type
;
data
->
length
=
length
;
plist_t
plist_new_bool
(
uint8_t
val
)
{
plist_data_t
data
=
plist_new_plist_data
();
data
->
type
=
PLIST_BOOLEAN
;
data
->
boolval
=
val
;
data
->
length
=
sizeof
(
uint8_t
);
return
plist_new_node
(
data
);
}
switch
(
type
)
{
case
PLIST_BOOLEAN
:
data
->
boolval
=
*
((
char
*
)
value
);
break
;
case
PLIST_UINT
:
data
->
intval
=
*
((
uint64_t
*
)
value
);
break
;
case
PLIST_REAL
:
data
->
realval
=
*
((
double
*
)
value
);
break
;
case
PLIST_KEY
:
case
PLIST_STRING
:
data
->
strval
=
strdup
((
char
*
)
value
);
break
;
case
PLIST_DATA
:
data
->
buff
=
(
uint8_t
*
)
malloc
(
length
);
memcpy
(
data
->
buff
,
value
,
length
);
break
;
case
PLIST_DATE
:
data
->
timeval
.
tv_sec
=
((
GTimeVal
*
)
value
)
->
tv_sec
;
data
->
timeval
.
tv_usec
=
((
GTimeVal
*
)
value
)
->
tv_usec
;
break
;
case
PLIST_ARRAY
:
case
PLIST_DICT
:
default:
break
;
}
plist_t
plist_new_uint
(
uint64_t
val
)
{
plist_data_t
data
=
plist_new_plist_data
();
data
->
type
=
PLIST_UINT
;
data
->
intval
=
val
;
data
->
length
=
sizeof
(
uint64_t
);
return
plist_new_node
(
data
);
}
subnode
=
plist_new_node
(
data
);
if
(
node
)
g_node_append
(
node
,
subnode
);
return
subnode
;
}
else
return
NULL
;
}
return
NULL
;
plist_t
plist_new_real
(
double
val
)
{
plist_data_t
data
=
plist_new_plist_data
();
data
->
type
=
PLIST_REAL
;
data
->
realval
=
val
;
data
->
length
=
sizeof
(
double
);
return
plist_new_node
(
data
);
}
plist_t
plist_new_data
(
const
char
*
val
,
uint64_t
length
)
{
plist_data_t
data
=
plist_new_plist_data
();
data
->
type
=
PLIST_DATA
;
data
->
buff
=
(
uint8_t
*
)
malloc
(
length
);
memcpy
(
data
->
buff
,
val
,
length
);
data
->
length
=
length
;
return
plist_new_node
(
data
);
}
plist_t
plist_new_date
(
int32_t
sec
,
int32_t
usec
)
{
plist_data_t
data
=
plist_new_plist_data
();
data
->
type
=
PLIST_DATE
;
data
->
timeval
.
tv_sec
=
sec
;
data
->
timeval
.
tv_usec
=
usec
;
data
->
length
=
sizeof
(
GTimeVal
);
return
plist_new_node
(
data
);
}
void
plist_free
(
plist_t
plist
)
...
...
@@ -181,54 +194,131 @@ plist_t plist_copy(plist_t node)
return
copied
;
}
plist_t
plist_get_first_child
(
plist_t
node
)
uint32_t
plist_array_get_size
(
plist_t
node
)
{
return
(
plist_t
)
g_node_first_child
((
GNode
*
)
node
);
uint32_t
ret
=
0
;
if
(
node
&&
PLIST_ARRAY
==
plist_get_node_type
(
node
))
{
ret
=
g_node_n_children
(
node
);
}
return
ret
;
}
plist_t
plist_
get_next_sibling
(
plist_t
node
)
plist_t
plist_
array_get_item
(
plist_t
node
,
uint32_t
n
)
{
return
(
plist_t
)
g_node_next_sibling
((
GNode
*
)
node
);
plist_t
ret
=
NULL
;
if
(
node
&&
PLIST_ARRAY
==
plist_get_node_type
(
node
))
{
ret
=
(
plist_t
)
g_node_nth_child
(
node
,
n
);
}
return
ret
;
}
plist_t
plist_get_prev_sibling
(
plist_t
node
)
void
plist_array_set_item
(
plist_t
node
,
plist_t
item
,
uint32_t
n
)
{
return
(
plist_t
)
g_node_prev_sibling
((
GNode
*
)
node
);
if
(
node
&&
PLIST_ARRAY
==
plist_get_node_type
(
node
))
{
plist_t
old_item
=
plist_array_get_item
(
node
,
n
);
if
(
old_item
)
{
plist_free_node
(
old_item
,
NULL
);
old_item
=
NULL
;
plist_copy_node
(
item
,
&
old_item
);
}
}
return
;
}
plist_t
plist_get_parent
(
plist_t
node
)
void
plist_array_append_item
(
plist_t
node
,
plist_t
item
)
{
return
node
?
(
plist_t
)
((
GNode
*
)
node
)
->
parent
:
NULL
;
if
(
node
&&
PLIST_ARRAY
==
plist_get_node_type
(
node
))
{
g_node_append
(
node
,
item
);
}
return
;
}
plist_t
plist_get_array_nth_el
(
plist_t
node
,
uint32_t
n
)
void
plist_array_insert_item
(
plist_t
node
,
plist_t
item
,
uint32_t
n
)
{
plist_t
ret
=
NULL
;
if
(
node
&&
PLIST_ARRAY
==
plist_get_node_type
(
node
))
{
uint32_t
i
=
0
;
plist_t
temp
=
plist_get_first_child
(
node
);
g_node_insert
(
node
,
n
,
item
);
}
return
;
}
while
(
i
<=
n
&&
temp
)
{
if
(
i
==
n
)
ret
=
temp
;
temp
=
plist_get_next_sibling
(
temp
);
i
++
;
void
plist_array_remove_item
(
plist_t
node
,
uint32_t
n
)
{
if
(
node
&&
PLIST_ARRAY
==
plist_get_node_type
(
node
))
{
plist_t
old_item
=
plist_array_get_item
(
node
,
n
);
if
(
old_item
)
{
plist_free
(
old_item
);
}
}
return
;
}
uint32_t
plist_dict_get_size
(
plist_t
node
)
{
uint32_t
ret
=
0
;
if
(
node
&&
PLIST_DICT
==
plist_get_node_type
(
node
))
{
ret
=
g_node_n_children
(
node
)
/
2
;
}
return
ret
;
}
plist_t
plist_
get_dict_el_from_key
(
plist_t
node
,
const
char
*
key
)
plist_t
plist_
dict_get_item
(
plist_t
node
,
const
char
*
key
)
{
plist_t
ret
=
NULL
;
if
(
node
&&
PLIST_DICT
==
plist_get_node_type
(
node
))
{
plist_t
key_node
=
plist_find_node_by_key
(
node
,
key
);
ret
=
plist_get_next_sibling
(
key_node
);
plist_t
current
=
NULL
;
for
(
current
=
plist_get_first_child
(
node
);
current
;
current
=
plist_get_next_sibling
(
plist_get_next_sibling
(
current
)))
{
assert
(
PLIST_KEY
==
plist_get_node_type
(
current
)
);
plist_data_t
data
=
plist_get_data
(
current
);
if
(
data
&&
!
strcmp
(
key
,
data
->
strval
))
{
ret
=
plist_get_next_sibling
(
current
);
break
;
}
}
}
return
ret
;
}
void
plist_dict_set_item
(
plist_t
node
,
plist_t
item
,
const
char
*
key
)
{
if
(
node
&&
PLIST_DICT
==
plist_get_node_type
(
node
))
{
plist_t
old_item
=
plist_dict_get_item
(
node
,
key
);
if
(
old_item
)
{
plist_free_node
(
old_item
,
NULL
);
old_item
=
NULL
;
plist_copy_node
(
item
,
&
old_item
);
}
}
return
;
}
void
plist_dict_insert_item
(
plist_t
node
,
plist_t
item
,
const
char
*
key
)
{
if
(
node
&&
PLIST_DICT
==
plist_get_node_type
(
node
))
{
g_node_append
(
node
,
plist_new_key
(
key
));
g_node_append
(
node
,
item
);
}
return
;
}
void
plist_dict_remove_item
(
plist_t
node
,
const
char
*
key
)
{
if
(
node
&&
PLIST_DICT
==
plist_get_node_type
(
node
))
{
plist_t
old_item
=
plist_dict_get_item
(
node
,
key
);
if
(
old_item
)
{
plist_t
key_node
=
g_node_prev_sibling
(
old_item
);
plist_free
(
key_node
);
plist_free
(
old_item
);
}
}
return
;
}
static
char
compare_node_value
(
plist_type
type
,
plist_data_t
data
,
const
void
*
value
,
uint64_t
length
)
{
char
res
=
FALSE
;
...
...
@@ -335,6 +425,11 @@ static void plist_get_type_and_value(plist_t node, plist_type * type, void *valu
}
}
plist_t
plist_get_parent
(
plist_t
node
)
{
return
node
?
(
plist_t
)
((
GNode
*
)
node
)
->
parent
:
NULL
;
}
plist_type
plist_get_node_type
(
plist_t
node
)
{
if
(
node
)
{
...
...
@@ -345,51 +440,6 @@ plist_type plist_get_node_type(plist_t node)
return
PLIST_NONE
;
}
void
plist_add_sub_node
(
plist_t
node
,
plist_t
subnode
)
{
if
(
node
&&
subnode
)
{
plist_type
type
=
plist_get_node_type
(
node
);
if
(
type
==
PLIST_DICT
||
type
==
PLIST_ARRAY
)
g_node_append
(
node
,
subnode
);
}
}
void
plist_add_sub_key_el
(
plist_t
node
,
const
char
*
val
)
{
plist_add_sub_element
(
node
,
PLIST_KEY
,
val
,
strlen
(
val
));
}
void
plist_add_sub_string_el
(
plist_t
node
,
const
char
*
val
)
{
plist_add_sub_element
(
node
,
PLIST_STRING
,
val
,
strlen
(
val
));
}
void
plist_add_sub_bool_el
(
plist_t
node
,
uint8_t
val
)
{
plist_add_sub_element
(
node
,
PLIST_BOOLEAN
,
&
val
,
sizeof
(
uint8_t
));
}
void
plist_add_sub_uint_el
(
plist_t
node
,
uint64_t
val
)
{
plist_add_sub_element
(
node
,
PLIST_UINT
,
&
val
,
sizeof
(
uint64_t
));
}
void
plist_add_sub_real_el
(
plist_t
node
,
double
val
)
{
plist_add_sub_element
(
node
,
PLIST_REAL
,
&
val
,
sizeof
(
double
));
}
void
plist_add_sub_data_el
(
plist_t
node
,
const
char
*
val
,
uint64_t
length
)
{
plist_add_sub_element
(
node
,
PLIST_DATA
,
val
,
length
);
}
void
plist_add_sub_date_el
(
plist_t
node
,
int32_t
sec
,
int32_t
usec
)
{
GTimeVal
val
=
{
sec
,
usec
};
plist_add_sub_element
(
node
,
PLIST_DATE
,
&
val
,
sizeof
(
GTimeVal
));
}
void
plist_get_key_val
(
plist_t
node
,
char
**
val
)
{
plist_type
type
=
plist_get_node_type
(
node
);
...
...
@@ -570,7 +620,6 @@ static plist_t plist_set_element_val(plist_t node, plist_type type, const void *
}
}
void
plist_set_key_val
(
plist_t
node
,
const
char
*
val
)
{
plist_set_element_val
(
node
,
PLIST_KEY
,
val
,
strlen
(
val
));
...
...
@@ -606,3 +655,149 @@ void plist_set_date_val(plist_t node, int32_t sec, int32_t usec)
GTimeVal
val
=
{
sec
,
usec
};
plist_set_element_val
(
node
,
PLIST_DATE
,
&
val
,
sizeof
(
GTimeVal
));
}
//DEPRECATED API BELOW
static
plist_t
plist_add_sub_element
(
plist_t
node
,
plist_type
type
,
const
void
*
value
,
uint64_t
length
)
{
//only structured types can have children
plist_type
node_type
=
plist_get_node_type
(
node
);
if
(
node_type
==
PLIST_DICT
||
node_type
==
PLIST_ARRAY
)
{
//only structured types are allowed to have nulll value
if
(
value
||
(
!
value
&&
(
type
==
PLIST_DICT
||
type
==
PLIST_ARRAY
)))
{
plist_t
subnode
=
NULL
;
//now handle value
plist_data_t
data
=
plist_new_plist_data
();
data
->
type
=
type
;
data
->
length
=
length
;
switch
(
type
)
{
case
PLIST_BOOLEAN
:
data
->
boolval
=
*
((
char
*
)
value
);
break
;
case
PLIST_UINT
:
data
->
intval
=
*
((
uint64_t
*
)
value
);
break
;
case
PLIST_REAL
:
data
->
realval
=
*
((
double
*
)
value
);
break
;
case
PLIST_KEY
:
case
PLIST_STRING
:
data
->
strval
=
strdup
((
char
*
)
value
);
break
;
case
PLIST_DATA
:
data
->
buff
=
(
uint8_t
*
)
malloc
(
length
);
memcpy
(
data
->
buff
,
value
,
length
);
break
;
case
PLIST_DATE
:
data
->
timeval
.
tv_sec
=
((
GTimeVal
*
)
value
)
->
tv_sec
;
data
->
timeval
.
tv_usec
=
((
GTimeVal
*
)
value
)
->
tv_usec
;
break
;
case
PLIST_ARRAY
:
case
PLIST_DICT
:
default:
break
;
}
subnode
=
plist_new_node
(
data
);
if
(
node
)
g_node_append
(
node
,
subnode
);
return
subnode
;
}
else
return
NULL
;
}
return
NULL
;
}
plist_t
plist_get_first_child
(
plist_t
node
)
{
return
(
plist_t
)
g_node_first_child
((
GNode
*
)
node
);
}
plist_t
plist_get_next_sibling
(
plist_t
node
)
{
return
(
plist_t
)
g_node_next_sibling
((
GNode
*
)
node
);
}
plist_t
plist_get_prev_sibling
(
plist_t
node
)
{
return
(
plist_t
)
g_node_prev_sibling
((
GNode
*
)
node
);
}
plist_t
plist_get_array_nth_el
(
plist_t
node
,
uint32_t
n
)
{
plist_t
ret
=
NULL
;
if
(
node
&&
PLIST_ARRAY
==
plist_get_node_type
(
node
))
{
uint32_t
i
=
0
;
plist_t
temp
=
plist_get_first_child
(
node
);
while
(
i
<=
n
&&
temp
)
{
if
(
i
==
n
)
ret
=
temp
;
temp
=
plist_get_next_sibling
(
temp
);
i
++
;
}
}
return
ret
;
}
plist_t
plist_get_dict_el_from_key
(
plist_t
node
,
const
char
*
key
)
{
plist_t
ret
=
NULL
;
if
(
node
&&
PLIST_DICT
==
plist_get_node_type
(
node
))
{
plist_t
key_node
=
plist_find_node_by_key
(
node
,
key
);
ret
=
plist_get_next_sibling
(
key_node
);
}
return
ret
;
}
void
plist_add_sub_node
(
plist_t
node
,
plist_t
subnode
)
{
if
(
node
&&
subnode
)
{
plist_type
type
=
plist_get_node_type
(
node
);
if
(
type
==
PLIST_DICT
||
type
==
PLIST_ARRAY
)
g_node_append
(
node
,
subnode
);
}
}
void
plist_add_sub_key_el
(
plist_t
node
,
const
char
*
val
)
{
plist_add_sub_element
(
node
,
PLIST_KEY
,
val
,
strlen
(
val
));
}
void
plist_add_sub_string_el
(
plist_t
node
,
const
char
*
val
)
{
plist_add_sub_element
(
node
,
PLIST_STRING
,
val
,
strlen
(
val
));
}
void
plist_add_sub_bool_el
(
plist_t
node
,
uint8_t
val
)
{
plist_add_sub_element
(
node
,
PLIST_BOOLEAN
,
&
val
,
sizeof
(
uint8_t
));
}
void
plist_add_sub_uint_el
(
plist_t
node
,
uint64_t
val
)
{
plist_add_sub_element
(
node
,
PLIST_UINT
,
&
val
,
sizeof
(
uint64_t
));
}
void
plist_add_sub_real_el
(
plist_t
node
,
double
val
)
{
plist_add_sub_element
(
node
,
PLIST_REAL
,
&
val
,
sizeof
(
double
));
}
void
plist_add_sub_data_el
(
plist_t
node
,
const
char
*
val
,
uint64_t
length
)
{
plist_add_sub_element
(
node
,
PLIST_DATA
,
val
,
length
);
}
void
plist_add_sub_date_el
(
plist_t
node
,
int32_t
sec
,
int32_t
usec
)
{
GTimeVal
val
=
{
sec
,
usec
};
plist_add_sub_element
(
node
,
PLIST_DATE
,
&
val
,
sizeof
(
GTimeVal
));
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment