109 lines
3.5 KiB
Diff
109 lines
3.5 KiB
Diff
|
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
|
||
|
|