+/**
+ * \file props_io.cxx
+ * Started Fall 2000 by David Megginson, david@megginson.com
+ * This code is released into the Public Domain.
+ *
+ * See props.html for documentation [replace with URL when available].
+ *
+ * $Id$
+ */
+
+#ifdef HAVE_CONFIG_H
+# include <simgear_config.h>
+#endif
#include <simgear/compiler.h>
public:
PropsVisitor (SGPropertyNode * root, const string &base, int default_mode = 0)
- : _root(root), _level(0), _base(base), _hasException(false), _default_mode(default_mode) {}
+ : _default_mode(default_mode), _root(root), _level(0), _base(base), _hasException(false) {}
virtual ~PropsVisitor () {}
} catch (sg_io_exception &e) {
setException(e);
}
+
+ const char *omit = atts.getValue("omit-node");
+ if (omit && !strcmp(omit, "y")) {
+ int nChildren = node->nChildren();
+ for (int i = 0; i < nChildren; i++) {
+ SGPropertyNode *src = node->getChild(i);
+ const char *name = src->getName();
+ int index = st.counters[name];
+ st.counters[name]++;
+ SGPropertyNode *dst = st.node->getChild(name, index, true);
+ copyProperties(src, dst);
+ }
+ st.node->removeChild(node->getName(), node->getIndex(), false);
+ node = st.node;
+ }
}
const char *type = atts.getValue("type");
static void
-writeAtts (ostream &output, const SGPropertyNode * node)
+writeAtts (ostream &output, const SGPropertyNode * node, bool forceindex)
{
int index = node->getIndex();
- if (index != 0)
+ if (index != 0 || forceindex)
output << " n=\"" << index << '"';
#if 0
const string name = node->getName();
int nChildren = node->nChildren();
+ bool node_has_value = false;
// If there is a literal value,
// write it first.
if (node->hasValue() && (write_all || node->getAttribute(archive_flag))) {
doIndent(output, indent);
output << '<' << name;
- writeAtts(output, node);
+ writeAtts(output, node, nChildren != 0);
if (node->isAlias() && node->getAliasTarget() != 0) {
output << " alias=\"" << node->getAliasTarget()->getPath()
<< "\"/>" << endl;
writeData(output, node->getStringValue());
output << "</" << name << '>' << endl;
}
+ node_has_value = true;
}
// If there are children, write them next.
if (nChildren > 0) {
doIndent(output, indent);
output << '<' << name;
- writeAtts(output, node);
+ writeAtts(output, node, node_has_value);
output << '>' << endl;
for (int i = 0; i < nChildren; i++)
writeNode(output, node->getChild(i), write_all, indent + INDENT_STEP, archive_flag);
writeProperties (const string &file, const SGPropertyNode * start_node,
bool write_all, SGPropertyNode::Attribute archive_flag)
{
+ SGPath path(file.c_str());
+ path.create_dir(0777);
+
ofstream output(file.c_str());
if (output.good()) {
writeProperties(output, start_node, write_all, archive_flag);