- endianness issues: on big endian machines, writing out only part of an integer was broken (get_needed_bytes(x) < sizeof(x)) -> shift integer before memcpy() on big endian machines - alignment issues: unaligned reads when loading binary plist. Leads to slow runtime performance (kernel trapping and fixing things up), SIGBUS (kernel not helping us out) -> introduce get_unaligned() and have the compiler generate the code needed for the unaligned access (note that there remains unaligned accesses that I haven't been able to track down - I've seen 2 of them with test #2) - type-punning issues: breaking strict aliasing rules can lead to unexpected results as the compiler takes full advantage of the aliasing while optimizing -> introduce the plist_uint_ptr union instead of casting pointers Tested on amd64, alpha and hppa.
In locales like German, a ',' is used as a decimal separator. When the program calling plist_to_xml uses LC_NUMBER with something different than a '.', parsing of the resulting XML document fails. This patch fixes it.
This makes it possible to process the resulting char* directly as a c-string without further copying.
* on armel system floating poing data can have different endianess than rest of types; hence we fix arm endianess for defined(__VFP_FP__) to be big/native; this also applies for data parsing/writing * date parsing didnt flip the endianess back for little endian systems when reading the values causing test failures; we fix this by ensuring float endianess is applied when parsing
For string nodes, a set of special characters must be converted to predefined xml entities. This patch adds an entitiy test case for this and makes libplist pass it fine by explicitly adding text nodes.
Before recursing over its children, plist_free_node started by detaching the current GNode from its parent which means that calling g_node_destroy on the root of the tree was freeing only the top-level GNode while what was intended was to free the whole tree. Don't leak memory by not detaching children GNodes from their parents so that g_node_destroy on the toplevel GNode can clean everything.
The 2nd missing break was harmless since it fell through the default: case which has a break, but it makes things more robust if we were ever to add new cases to this switch. The 1st missing break; was causing warnings in valgrind since we ended up calling strdup on a memory zone not containing a \0 character.