From 0e267e2625dba2c771996bcf537d1ebb6956ba58 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Thu, 3 Aug 2006 14:49:57 +0000 Subject: [PATCH] * `nix-instantiate --print-args': produce XML output so that the result can be used more easily by scripts. --- src/libutil/Makefile.am | 3 +- src/libutil/xml-writer.cc | 59 ++-------------------------------- src/libutil/xml-writer.hh | 64 +++++++++++++++++++++++++++++++++++++ src/nix-instantiate/main.cc | 15 +++++++-- 4 files changed, 81 insertions(+), 60 deletions(-) create mode 100644 src/libutil/xml-writer.hh diff --git a/src/libutil/Makefile.am b/src/libutil/Makefile.am index 8fab0c5b0..513d8ecf5 100644 --- a/src/libutil/Makefile.am +++ b/src/libutil/Makefile.am @@ -2,7 +2,8 @@ lib_LTLIBRARIES = libutil.la libutil_la_SOURCES = util.cc util.hh hash.cc hash.hh \ archive.cc archive.hh aterm.cc aterm.hh \ - aterm-map.cc aterm-map.hh + aterm-map.cc aterm-map.hh \ + xml-writer.cc xml-writer.hh if !HAVE_OPENSSL libutil_la_SOURCES += \ diff --git a/src/libutil/xml-writer.cc b/src/libutil/xml-writer.cc index 269944909..b0e25f2c7 100644 --- a/src/libutil/xml-writer.cc +++ b/src/libutil/xml-writer.cc @@ -1,61 +1,6 @@ -#include -#include -#include -#include #include -using namespace std; - -typedef map XMLAttrs; - - -class XMLWriter -{ -private: - - ostream & output; - - bool closed; - - list pendingElems; - -public: - - XMLWriter(ostream & output); - ~XMLWriter(); - - void close(); - - void openElement(const string & name, - const XMLAttrs & attrs = XMLAttrs()); - void closeElement(); - - void writeShortElement(const string & name, - const XMLAttrs & attrs = XMLAttrs()); - - void writeCharData(const string & data); - -private: - void writeAttrs(const XMLAttrs & attrs); -}; - - -class XMLOpenElement -{ -private: - XMLWriter & writer; -public: - XMLOpenElement(XMLWriter & writer, const string & name, - const XMLAttrs & attrs = XMLAttrs()) - : writer(writer) - { - writer.openElement(name, attrs); - } - ~XMLOpenElement() - { - writer.closeElement(); - } -}; +#include "xml-writer.hh" XMLWriter::XMLWriter(ostream & output) @@ -138,6 +83,7 @@ void XMLWriter::writeAttrs(const XMLAttrs & attrs) } +#if 0 int main(int argc, char * * argv) { XMLWriter doc(cout); @@ -159,3 +105,4 @@ int main(int argc, char * * argv) return 0; } +#endif diff --git a/src/libutil/xml-writer.hh b/src/libutil/xml-writer.hh new file mode 100644 index 000000000..84c7fafbc --- /dev/null +++ b/src/libutil/xml-writer.hh @@ -0,0 +1,64 @@ +#ifndef __XML_WRITER_H +#define __XML_WRITER_H + +#include +#include +#include +#include + +using namespace std; + + +typedef map XMLAttrs; + + +class XMLWriter +{ +private: + + ostream & output; + + bool closed; + + list pendingElems; + +public: + + XMLWriter(ostream & output); + ~XMLWriter(); + + void close(); + + void openElement(const string & name, + const XMLAttrs & attrs = XMLAttrs()); + void closeElement(); + + void writeShortElement(const string & name, + const XMLAttrs & attrs = XMLAttrs()); + + void writeCharData(const string & data); + +private: + void writeAttrs(const XMLAttrs & attrs); +}; + + +class XMLOpenElement +{ +private: + XMLWriter & writer; +public: + XMLOpenElement(XMLWriter & writer, const string & name, + const XMLAttrs & attrs = XMLAttrs()) + : writer(writer) + { + writer.openElement(name, attrs); + } + ~XMLOpenElement() + { + writer.closeElement(); + } +}; + + +#endif /* !__XML_WRITER_H */ diff --git a/src/nix-instantiate/main.cc b/src/nix-instantiate/main.cc index f49615648..f8b0f3a20 100644 --- a/src/nix-instantiate/main.cc +++ b/src/nix-instantiate/main.cc @@ -10,6 +10,7 @@ #include "nixexpr-ast.hh" #include "get-drvs.hh" #include "attr-path.hh" +#include "xml-writer.hh" #include "help.txt.hh" @@ -40,21 +41,29 @@ static void printResult(EvalState & state, Expr e, cout << format("%1%\n") % e; else if (printArgs) { + XMLWriter doc(cout); + XMLOpenElement root(doc, "args"); + ATermList formals; ATerm body, pos; + if (matchFunction(e, formals, body, pos)) { for (ATermIterator i(formals); i; ++i) { Expr name; ValidValues valids; ATerm dummy; if (!matchFormal(*i, name, valids, dummy)) abort(); - cout << format("%1%: ") % aterm2String(name); + + XMLAttrs attrs; + attrs["name"] = aterm2String(name); + XMLOpenElement elem(doc, "arg", attrs); + ATermList valids2; if (matchValidValues(valids, valids2)) { for (ATermIterator j(valids2); j; ++j) { Expr e = evalExpr(state, *j); - cout << format("%1% ") % showValue(e); + XMLOpenElement elem(doc, "value"); + doc.writeCharData(showValue(e)); } } - cout << format("\n"); } } else printMsg(lvlError, "warning: expression does not evaluate to a function");