+ xmlNode *child;
+ int status;
+
+ memset(cdp_prep, '\0', sizeof(cdp_prep_t));
+
+ status = 0;
+ for (child = node->xmlChildrenNode; child != NULL; child = child->next) {
+ if ((xmlStrcmp(child->name, (const xmlChar *) "comment") == 0)
+ || (xmlStrcmp(child->name, (const xmlChar *) "text") == 0))
+ /* ignore */ ;
+ else if (xmlStrcmp(child->name, (const xmlChar *) "primary_value") ==
+ 0)
+ status =
+ get_double_from_node(doc, child,
+ &cdp_prep->scratch[CDP_primary_val].
+ u_val);
+ else if (xmlStrcmp(child->name, (const xmlChar *) "secondary_value")
+ == 0)
+ status =
+ get_double_from_node(doc, child,
+ &cdp_prep->scratch[CDP_secondary_val].
+ u_val);
+ else if (xmlStrcmp(child->name, (const xmlChar *) "intercept") == 0)
+ status = get_double_from_node(doc, child,
+ &cdp_prep->
+ scratch[CDP_hw_intercept].u_val);
+ else if (xmlStrcmp(child->name, (const xmlChar *) "last_intercept") ==
+ 0)
+ status =
+ get_double_from_node(doc, child,
+ &cdp_prep->
+ scratch[CDP_hw_last_intercept].u_val);
+ else if (xmlStrcmp(child->name, (const xmlChar *) "slope") == 0)
+ status = get_double_from_node(doc, child,
+ &cdp_prep->scratch[CDP_hw_slope].
+ u_val);
+ else if (xmlStrcmp(child->name, (const xmlChar *) "last_slope") == 0)
+ status = get_double_from_node(doc, child,
+ &cdp_prep->
+ scratch[CDP_hw_last_slope].u_val);
+ else if (xmlStrcmp(child->name, (const xmlChar *) "nan_count") == 0)
+ status = get_int_from_node(doc, child,
+ (int *) &cdp_prep->
+ scratch[CDP_null_count].u_cnt);
+ else if (xmlStrcmp(child->name, (const xmlChar *) "last_nan_count") ==
+ 0)
+ status =
+ get_int_from_node(doc, child,
+ (int *) &cdp_prep->
+ scratch[CDP_last_null_count].u_cnt);
+ else if (xmlStrcmp(child->name, (const xmlChar *) "seasonal") == 0)
+ status = get_double_from_node(doc, child,
+ &cdp_prep->scratch[CDP_hw_seasonal].
+ u_val);
+ else if (xmlStrcmp(child->name, (const xmlChar *) "last_seasonal") ==
+ 0)
+ status =
+ get_double_from_node(doc, child,
+ &cdp_prep->scratch[CDP_hw_last_seasonal].
+ u_val);
+ else if (xmlStrcmp(child->name, (const xmlChar *) "init_flag") == 0)
+ status = get_int_from_node(doc, child,
+ (int *) &cdp_prep->
+ scratch[CDP_init_seasonal].u_cnt);
+ else if (xmlStrcmp(child->name, (const xmlChar *) "history") == 0)
+ status = parse_tag_rra_cdp_prep_ds_history(doc, child, cdp_prep);
+ else if (xmlStrcmp(child->name, (const xmlChar *) "value") == 0)
+ status = get_double_from_node(doc, child,
+ &cdp_prep->scratch[CDP_val].u_val);
+ else if (xmlStrcmp(child->name,
+ (const xmlChar *) "unknown_datapoints") == 0)
+ status = get_int_from_node(doc, child,
+ (int *) &cdp_prep->
+ scratch[CDP_unkn_pdp_cnt].u_cnt);
+ /*
+ * Compatibility code for 1.0.49
+ */
+ else if (xmlStrcmp(child->name, (const xmlChar *) "value") == 0) { /* {{{ */
+ unsigned int i = 0;
+ rra_def_t *rra_def = rrd->rra_def + (rrd->stat_head->rra_cnt - 1);
+
+ while (42) {
+ if (i >= ARRAY_LENGTH(cdp_prep->scratch)) {
+ status = -1;
+ break;
+ }
+
+ if ((cf_conv(rra_def->cf_nam) == CF_FAILURES)
+ || (i == CDP_unkn_pdp_cnt)
+ || (i == CDP_null_count)
+ || (i == CDP_last_null_count))
+ status = get_int_from_node(doc, child,
+ (int *) &cdp_prep->scratch[i].
+ u_cnt);
+ else
+ status = get_double_from_node(doc, child,
+ &cdp_prep->scratch[i].
+ u_val);
+
+ if (status != 0)
+ break;
+
+ /* When this loops exits (sucessfully) `child' points to the last
+ * `value' tag in the list. */
+ if ((child->next == NULL)
+ || (xmlStrcmp(child->name, (const xmlChar *) "value") !=
+ 0))
+ break;
+
+ child = child->next;
+ i++;
+ }
+ } /* }}} */
+ else {
+ rrd_set_error("parse_tag_rra_cdp_prep: Unknown tag: %s",
+ child->name);
+ status = -1;
+ }
+
+ if (status != 0)
+ break;