diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2003-11-19 11:35:41 +0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2003-11-19 11:35:41 +0000 |
commit | ac68840e79ce74f05ee8b31bb1d528c98b9c7f76 (patch) | |
tree | 98e8251d0537197b1c3e53068529f1e5e3114fdc /src/libexpr/main.cc | |
parent | 2be8b5917a8040fac72e7970e94bbb436e8c35d6 (diff) |
* Refactoring: put the Nix expression evaluator in its own library so
that it can be used by multiple programs.
Diffstat (limited to 'src/libexpr/main.cc')
-rw-r--r-- | src/libexpr/main.cc | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/src/libexpr/main.cc b/src/libexpr/main.cc new file mode 100644 index 000000000..aa6883ff8 --- /dev/null +++ b/src/libexpr/main.cc @@ -0,0 +1,117 @@ +#include <map> +#include <iostream> + +#include "globals.hh" +#include "normalise.hh" +#include "shared.hh" +#include "eval.hh" + + +#if 0 +static Path searchPath(const Paths & searchDirs, const Path & relPath) +{ + if (string(relPath, 0, 1) == "/") return relPath; + + for (Paths::const_iterator i = searchDirs.begin(); + i != searchDirs.end(); i++) + { + Path path = *i + "/" + relPath; + if (pathExists(path)) return path; + } + + throw Error( + format("path `%1%' not found in any of the search directories") + % relPath); +} +#endif + + +static Expr evalStdin(EvalState & state) +{ + startNest(nest, lvlTalkative, format("evaluating standard input")); + Expr e = ATreadFromFile(stdin); + if (!e) + throw Error(format("unable to read a term from stdin")); + return evalExpr(state, e); +} + + +static void printNixExpr(EvalState & state, Expr e) +{ + ATMatcher m; + ATermList es; + + if (atMatch(m, e) >> "Attrs" >> es) { + Expr a = queryAttr(e, "type"); + if (a && evalString(state, a) == "derivation") { + a = queryAttr(e, "drvPath"); + if (a) { + cout << format("%1%\n") % evalPath(state, a); + return; + } + } + } + + if (ATgetType(e) == AT_LIST) { + for (ATermIterator i((ATermList) e); i; ++i) + printNixExpr(state, evalExpr(state, *i)); + return; + } + + throw badTerm("top level does not evaluate to one or more Nix expressions", e); +} + + +void run(Strings args) +{ + EvalState state; + Strings files; + bool readStdin = false; + +#if 0 + state.searchDirs.push_back("."); + state.searchDirs.push_back(nixDataDir + "/nix"); +#endif + + for (Strings::iterator it = args.begin(); + it != args.end(); ) + { + string arg = *it++; + +#if 0 + if (arg == "--includedir" || arg == "-I") { + if (it == args.end()) + throw UsageError(format("argument required in `%1%'") % arg); + state.searchDirs.push_back(*it++); + } + else +#endif + if (arg == "--verbose" || arg == "-v") + verbosity = (Verbosity) ((int) verbosity + 1); + else if (arg == "-") + readStdin = true; + else if (arg[0] == '-') + throw UsageError(format("unknown flag `%1%`") % arg); + else + files.push_back(arg); + } + + openDB(); + + if (readStdin) { + Expr e = evalStdin(state); + printNixExpr(state, e); + } + + for (Strings::iterator it = files.begin(); + it != files.end(); it++) + { + Expr e = evalFile(state, absPath(*it)); + printNixExpr(state, e); + } + + printEvalStats(state); +} + + +string programId = "nix-instantiate"; |