lasso/0002-xml-xml.c-fix-liberal-use-of-casting-for-the-SNIPPET.patch

109 lines
3.5 KiB
Diff
Raw Normal View History

From 53c4298876331c1312a9a0f4dbe6eb28b2dbea59 Mon Sep 17 00:00:00 2001
From: Benjamin Dauvergne <bdauvergne@entrouvert.com>
Date: Thu, 24 Apr 2014 01:30:49 +0200
Subject: [PATCH 2/2] xml/xml.c: fix liberal use of casting for the
SNIPPET_INTEGER and SNIPPET_BOOLEAN case
Some behaviour are also made more explicit like the optional if equals
to -1 case for integer fields, and the optional if FALSE for boolean
fields.
---
lasso/xml/xml.c | 55 ++++++++++++++++++++++++++++++++++---------------------
1 file changed, 34 insertions(+), 21 deletions(-)
diff --git a/lasso/xml/xml.c b/lasso/xml/xml.c
index ba207f552cf5c6a587c1866adecab9f2ac9a339a..4485d47669deb5b15c3f3cbcfec98942bd2edbf6 100644
--- a/lasso/xml/xml.c
+++ b/lasso/xml/xml.c
@@ -2717,7 +2717,6 @@ lasso_node_build_xmlNode_from_snippets(LassoNode *node, LassoNodeClass *class, x
struct XmlSnippet *snippets, gboolean lasso_dump)
{
struct XmlSnippet *snippet;
- SnippetType type;
GType g_type;
xmlNode *t;
GList *elem;
@@ -2727,36 +2726,49 @@ lasso_node_build_xmlNode_from_snippets(LassoNode *node, LassoNodeClass *class, x
for (snippet = snippets; snippet && snippet->name; snippet++) {
void *value;
+ int int_value;
+ gboolean bool_value;
char *str;
+ gboolean optional = snippet->type & SNIPPET_OPTIONAL;
+ gboolean optional_neg = snippet->type & SNIPPET_OPTIONAL_NEG;
if (! snippet->offset && ! (snippet->type & SNIPPET_PRIVATE)) {
continue;
}
- type = snippet->type & 0xff;
- value = SNIPPET_STRUCT_MEMBER(void *, node, g_type, snippet);
- str = value;
- if (lasso_dump == FALSE && snippet->type & SNIPPET_LASSO_DUMP)
+ if (lasso_dump == FALSE && snippet->type & SNIPPET_LASSO_DUMP) {
continue;
-
- if (type == SNIPPET_ATTRIBUTE && snippet->type & SNIPPET_ANY) {
+ }
+ if ((snippet->type & 0xff) == SNIPPET_ATTRIBUTE && (snippet->type & SNIPPET_ANY)) {
snippet_any_attribute = snippet;
continue;
}
- if (value == NULL && (!(snippet->type & SNIPPET_BOOLEAN ||
- snippet->type & SNIPPET_INTEGER) ||
- snippet->type & SNIPPET_OPTIONAL))
- continue;
- if (snippet->type & SNIPPET_OPTIONAL_NEG && GPOINTER_TO_INT(value) == -1)
- continue;
+ // convert input type to string if needed
+ if (snippet->type & SNIPPET_INTEGER) {
+ int_value = SNIPPET_STRUCT_MEMBER(int, node, g_type, snippet);
+ if (int_value == 0 && optional) {
+ continue;
+ }
+ if (int_value == -1 && optional_neg) {
+ continue;
+ }
+ str = g_strdup_printf("%i", int_value);
+ } else if (snippet->type & SNIPPET_BOOLEAN) {
+ bool_value = SNIPPET_STRUCT_MEMBER(gboolean, node, g_type, snippet);
+ if (bool_value == FALSE && optional) {
+ continue;
+ }
+ str = bool_value ? "true" : "false";
+ } else {
+ value = SNIPPET_STRUCT_MEMBER(void *, node, g_type, snippet);
+ if (value == NULL) {
+ continue;
+ }
+ str = value;
+ }
- /* XXX: not sure it is 64-bits clean */
- if (snippet->type & SNIPPET_BOOLEAN)
- str = GPOINTER_TO_INT(value) ? "true" : "false";
- if (snippet->type & SNIPPET_INTEGER)
- str = g_strdup_printf("%d", GPOINTER_TO_INT(value));
-
- switch (type) {
+ // output type
+ switch (snippet->type & 0xff) {
case SNIPPET_ATTRIBUTE:
if (snippet->ns_name) {
xmlNsPtr ns;
@@ -2840,8 +2852,9 @@ lasso_node_build_xmlNode_from_snippets(LassoNode *node, LassoNodeClass *class, x
case SNIPPET_UNUSED1:
g_assert_not_reached();
}
- if (snippet->type & SNIPPET_INTEGER)
+ if (snippet->type & SNIPPET_INTEGER) {
lasso_release(str);
+ }
}
if (snippet_any_attribute) {
--
1.9.0