aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2006-08-03 14:49:57 +0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2006-08-03 14:49:57 +0000
commit0e267e2625dba2c771996bcf537d1ebb6956ba58 (patch)
treea6425f8122d391510d021cbb56e629faca04e562
parent4750f6c5ed8f74683ebaa013079e24598a753cbe (diff)
* `nix-instantiate --print-args': produce XML output so that the
result can be used more easily by scripts.
-rw-r--r--src/libutil/Makefile.am3
-rw-r--r--src/libutil/xml-writer.cc59
-rw-r--r--src/libutil/xml-writer.hh64
-rw-r--r--src/nix-instantiate/main.cc15
4 files changed, 81 insertions, 60 deletions
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 <iostream>
-#include <string>
-#include <list>
-#include <map>
#include <assert.h>
-using namespace std;
-
-typedef map<string, string> XMLAttrs;
-
-
-class XMLWriter
-{
-private:
-
- ostream & output;
-
- bool closed;
-
- list<string> 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 <iostream>
+#include <string>
+#include <list>
+#include <map>
+
+using namespace std;
+
+
+typedef map<string, string> XMLAttrs;
+
+
+class XMLWriter
+{
+private:
+
+ ostream & output;
+
+ bool closed;
+
+ list<string> 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");