diff options
Diffstat (limited to 'src')
-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 | ||||
-rw-r--r-- | src/nix-instantiate/main.cc | 90 |
4 files changed, 111 insertions, 87 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 */ diff --git a/src/nix-instantiate/main.cc b/src/nix-instantiate/main.cc index 6a0586a2d86d..eb5c1ce8552d 100644 --- a/src/nix-instantiate/main.cc +++ b/src/nix-instantiate/main.cc @@ -7,10 +7,9 @@ #include "shared.hh" #include "eval.hh" #include "parser.hh" -#include "nixexpr-ast.hh" #include "get-drvs.hh" #include "attr-path.hh" -#include "xml-writer.hh" +#include "expr-to-xml.hh" #include "help.txt.hh" @@ -34,94 +33,13 @@ static int rootNr = 0; static bool indirectRoot = false; -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"); -} - - static void printResult(EvalState & state, Expr e, bool evalOnly, bool xmlOutput, const ATermMap & autoArgs) { if (evalOnly) - if (xmlOutput) { - XMLWriter doc(true, cout); - XMLOpenElement root(doc, "expr"); - printTermAsXML(e, doc); - } else + if (xmlOutput) + printTermAsXML(e, cout); + else cout << format("%1%\n") % e; else { |