diff options
Diffstat (limited to 'src/libexpr')
-rw-r--r-- | src/libexpr/Makefile.am | 3 | ||||
-rw-r--r-- | src/libexpr/expr-to-xml.cc | 92 | ||||
-rw-r--r-- | src/libexpr/expr-to-xml.hh | 13 |
3 files changed, 107 insertions, 1 deletions
diff --git a/src/libexpr/Makefile.am b/src/libexpr/Makefile.am index d59b798c0bc9..81c851fb0037 100644 --- a/src/libexpr/Makefile.am +++ b/src/libexpr/Makefile.am @@ -4,7 +4,8 @@ libexpr_la_SOURCES = nixexpr.cc nixexpr.hh parser.cc parser.hh \ eval.cc eval.hh primops.cc \ lexer-tab.c lexer-tab.h parser-tab.c parser-tab.h \ get-drvs.cc get-drvs.hh \ - attr-path.cc attr-path.hh + attr-path.cc attr-path.hh \ + expr-to-xml.cc expr-to-xml.hh BUILT_SOURCES = nixexpr-ast.cc nixexpr-ast.hh \ parser-tab.h lexer-tab.h parser-tab.c lexer-tab.c diff --git a/src/libexpr/expr-to-xml.cc b/src/libexpr/expr-to-xml.cc new file mode 100644 index 000000000000..cd9112a425e2 --- /dev/null +++ b/src/libexpr/expr-to-xml.cc @@ -0,0 +1,92 @@ +#include "expr-to-xml.hh" + +#include "xml-writer.hh" +#include "nixexpr-ast.hh" +#include "aterm.hh" + + +static XMLAttrs singletonAttrs(const string & name, const string & value) +{ + XMLAttrs attrs; + attrs[name] = value; + return attrs; +} + + +static void printTermAsXML(Expr e, XMLWriter & doc) +{ + XMLAttrs attrs; + ATerm s; + int i; + ATermList as, es, formals; + ATerm body, pos; + + if (matchStr(e, s)) + doc.writeEmptyElement("string", singletonAttrs("value", aterm2String(s))); + + else if (matchPath(e, s)) + doc.writeEmptyElement("path", singletonAttrs("value", aterm2String(s))); + + else if (matchUri(e, s)) + doc.writeEmptyElement("uri", singletonAttrs("value", aterm2String(s))); + + else if (matchNull(e)) + doc.writeEmptyElement("null"); + + else if (matchInt(e, i)) + doc.writeEmptyElement("int", singletonAttrs("value", (format("%1%") % i).str())); + + else if (e == eTrue) + doc.writeEmptyElement("bool", singletonAttrs("value", "true")); + + else if (e == eFalse) + doc.writeEmptyElement("bool", singletonAttrs("value", "false")); + + else if (matchAttrs(e, as)) { + XMLOpenElement _(doc, "attrs"); + ATermMap attrs(128); + queryAllAttrs(e, attrs); + StringSet names; + for (ATermMap::const_iterator i = attrs.begin(); i != attrs.end(); ++i) + names.insert(aterm2String(i->key)); + for (StringSet::iterator i = names.begin(); i != names.end(); ++i) { + XMLOpenElement _(doc, "attr", singletonAttrs("name", *i)); + printTermAsXML(attrs.get(toATerm(*i)), doc); + } + } + + else if (matchList(e, es)) { + XMLOpenElement _(doc, "list"); + for (ATermIterator i(es); i; ++i) + printTermAsXML(*i, doc); + } + + else if (matchFunction(e, formals, body, pos)) { + XMLOpenElement _(doc, "function"); + + for (ATermIterator i(formals); i; ++i) { + Expr name; ValidValues valids; ATerm dummy; + if (!matchFormal(*i, name, valids, dummy)) abort(); + XMLOpenElement _(doc, "arg", singletonAttrs("name", aterm2String(name))); + + ATermList valids2; + if (matchValidValues(valids, valids2)) { + for (ATermIterator j(valids2); j; ++j) { + XMLOpenElement _(doc, "value"); + printTermAsXML(*j, doc); + } + } + } + } + + else + doc.writeEmptyElement("unevaluated"); +} + + +void printTermAsXML(Expr e, ostream & out) +{ + XMLWriter doc(true, out); + XMLOpenElement root(doc, "expr"); + printTermAsXML(e, doc); +} diff --git a/src/libexpr/expr-to-xml.hh b/src/libexpr/expr-to-xml.hh new file mode 100644 index 000000000000..56f947e520de --- /dev/null +++ b/src/libexpr/expr-to-xml.hh @@ -0,0 +1,13 @@ +#ifndef __EXPR_TO_XML_H +#define __EXPR_TO_XML_H + +#include <string> +#include <map> + +#include "nixexpr.hh" + + +void printTermAsXML(Expr e, ostream & out); + + +#endif /* !__EXPR_TO_XML_H */ |