diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2010-05-12T22·13+0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2010-05-12T22·13+0000 |
commit | aa45027818af8976dc73e6a299d5d918e5c51df1 (patch) | |
tree | 6086eb0642bc90477397169d0ee3993c1789200e /src/libexpr/expr-to-xml.cc | |
parent | a0e3b84fac56cad6377ecd1462058a6b29bb1ea8 (diff) | |
parent | 8032f26ca0bd2233de066ce5786ff976bbd641ae (diff) |
* Sync with the trunk.
Diffstat (limited to 'src/libexpr/expr-to-xml.cc')
-rw-r--r-- | src/libexpr/expr-to-xml.cc | 186 |
1 files changed, 0 insertions, 186 deletions
diff --git a/src/libexpr/expr-to-xml.cc b/src/libexpr/expr-to-xml.cc deleted file mode 100644 index 1e59eebfc497..000000000000 --- a/src/libexpr/expr-to-xml.cc +++ /dev/null @@ -1,186 +0,0 @@ -#include "expr-to-xml.hh" -#include "xml-writer.hh" -#include "nixexpr-ast.hh" -#include "aterm.hh" -#include "util.hh" - -#include <cstdlib> - - -namespace nix { - - -static XMLAttrs singletonAttrs(const string & name, const string & value) -{ - XMLAttrs attrs; - attrs[name] = value; - return attrs; -} - - -/* set<Expr> is safe because all the expressions are also reachable - from the stack, therefore can't be garbage-collected. */ -typedef set<Expr> ExprSet; - - -static void printTermAsXML(Expr e, XMLWriter & doc, PathSet & context, - ExprSet & drvsSeen, bool location); - - -static void showAttrs(const ATermMap & attrs, XMLWriter & doc, - PathSet & context, ExprSet & drvsSeen, bool location) -{ - 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) { - ATerm attrRHS = attrs.get(toATerm(*i)); - ATerm attr; - Pos pos; - XMLAttrs xmlAttrs; - - xmlAttrs["name"] = *i; - if(matchAttrRHS(attrRHS, attr, pos)) { - ATerm path; - int line, column; - if (location && matchPos(pos, path, line, column)) { - xmlAttrs["path"] = aterm2String(path); - xmlAttrs["line"] = (format("%1%") % line).str(); - xmlAttrs["column"] = (format("%1%") % column).str(); - } - } else - abort(); // Should not happen. - - XMLOpenElement _(doc, "attr", xmlAttrs); - printTermAsXML(attr, doc, context, drvsSeen, location); - } -} - - -static void printPatternAsXML(Pattern pat, XMLWriter & doc) -{ - ATerm name; - ATermList formals; - Pattern pat1, pat2; - ATermBool ellipsis; - if (matchVarPat(pat, name)) - doc.writeEmptyElement("varpat", singletonAttrs("name", aterm2String(name))); - else if (matchAttrsPat(pat, formals, ellipsis)) { - XMLOpenElement _(doc, "attrspat"); - for (ATermIterator i(formals); i; ++i) { - Expr name; ATerm dummy; - if (!matchFormal(*i, name, dummy)) abort(); - doc.writeEmptyElement("attr", singletonAttrs("name", aterm2String(name))); - } - if (ellipsis == eTrue) doc.writeEmptyElement("ellipsis"); - } - else if (matchAtPat(pat, pat1, pat2)) { - XMLOpenElement _(doc, "at"); - printPatternAsXML(pat1, doc); - printPatternAsXML(pat2, doc); - } -} - - -static void printTermAsXML(Expr e, XMLWriter & doc, PathSet & context, - ExprSet & drvsSeen, bool location) -{ - XMLAttrs attrs; - string s; - ATerm s2; - int i; - ATermList as, es; - ATerm pat, body, pos; - - checkInterrupt(); - - if (matchStr(e, s, context)) /* !!! show the context? */ - doc.writeEmptyElement("string", singletonAttrs("value", s)); - - else if (matchPath(e, s2)) - doc.writeEmptyElement("path", singletonAttrs("value", aterm2String(s2))); - - 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)) { - ATermMap attrs; - queryAllAttrs(e, attrs, true); - - Expr aRHS = attrs.get(toATerm("type")); - Expr a = NULL; - if (aRHS) - matchAttrRHS(aRHS, a, pos); - if (a && matchStr(a, s, context) && s == "derivation") { - - XMLAttrs xmlAttrs; - Path outPath, drvPath; - - aRHS = attrs.get(toATerm("drvPath")); - matchAttrRHS(aRHS, a, pos); - if (matchStr(a, drvPath, context)) - xmlAttrs["drvPath"] = drvPath; - - aRHS = attrs.get(toATerm("outPath")); - matchAttrRHS(aRHS, a, pos); - if (matchStr(a, outPath, context)) - xmlAttrs["outPath"] = outPath; - - XMLOpenElement _(doc, "derivation", xmlAttrs); - - if (drvsSeen.find(e) == drvsSeen.end()) { - drvsSeen.insert(e); - showAttrs(attrs, doc, context, drvsSeen, location); - } else - doc.writeEmptyElement("repeated"); - } - - else { - XMLOpenElement _(doc, "attrs"); - showAttrs(attrs, doc, context, drvsSeen, location); - } - } - - else if (matchList(e, es)) { - XMLOpenElement _(doc, "list"); - for (ATermIterator i(es); i; ++i) - printTermAsXML(*i, doc, context, drvsSeen, location); - } - - else if (matchFunction(e, pat, body, pos)) { - ATerm path; - int line, column; - XMLAttrs xmlAttrs; - if (location && matchPos(pos, path, line, column)) { - xmlAttrs["path"] = aterm2String(path); - xmlAttrs["line"] = (format("%1%") % line).str(); - xmlAttrs["column"] = (format("%1%") % column).str(); - } - XMLOpenElement _(doc, "function", xmlAttrs); - printPatternAsXML(pat, doc); - } - - else - doc.writeEmptyElement("unevaluated"); -} - - -void printTermAsXML(Expr e, std::ostream & out, PathSet & context, bool location) -{ - XMLWriter doc(true, out); - XMLOpenElement root(doc, "expr"); - ExprSet drvsSeen; - printTermAsXML(e, doc, context, drvsSeen, location); -} - - -} |