* Mode --parse-only' to parse the input (on stdin, -'), and print
				
					
				
			out the AST as an ATerm. * Mode `--eval-only' to parse and evaluate the input, and print the resulting normal form as an ATerm. Neither of these modes require store/DB write permission.
This commit is contained in:
		
							parent
							
								
									37d7abd694
								
							
						
					
					
						commit
						ee401afad8
					
				
					 1 changed files with 28 additions and 8 deletions
				
			
		| 
						 | 
					@ -15,17 +15,17 @@ void printHelp()
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static Expr evalStdin(EvalState & state)
 | 
					static Expr evalStdin(EvalState & state, bool parseOnly)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    startNest(nest, lvlTalkative, format("evaluating standard input"));
 | 
					    startNest(nest, lvlTalkative, format("evaluating standard input"));
 | 
				
			||||||
    string s, s2;
 | 
					    string s, s2;
 | 
				
			||||||
    while (getline(cin, s2)) s += s2 + "\n";
 | 
					    while (getline(cin, s2)) s += s2 + "\n";
 | 
				
			||||||
    Expr e = parseExprFromString(state, s, absPath("."));
 | 
					    Expr e = parseExprFromString(state, s, absPath("."));
 | 
				
			||||||
    return evalExpr(state, e);
 | 
					    return parseOnly ? e : evalExpr(state, e);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void printNixExpr(EvalState & state, Expr e)
 | 
					static void printDrvPaths(EvalState & state, Expr e)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    ATMatcher m;
 | 
					    ATMatcher m;
 | 
				
			||||||
    ATermList es;
 | 
					    ATermList es;
 | 
				
			||||||
| 
						 | 
					@ -45,14 +45,14 @@ static void printNixExpr(EvalState & state, Expr e)
 | 
				
			||||||
            ATermMap drvMap;
 | 
					            ATermMap drvMap;
 | 
				
			||||||
            queryAllAttrs(e, drvMap);
 | 
					            queryAllAttrs(e, drvMap);
 | 
				
			||||||
            for (ATermIterator i(drvMap.keys()); i; ++i)
 | 
					            for (ATermIterator i(drvMap.keys()); i; ++i)
 | 
				
			||||||
                printNixExpr(state, evalExpr(state, drvMap.get(*i)));
 | 
					                printDrvPaths(state, evalExpr(state, drvMap.get(*i)));
 | 
				
			||||||
            return;
 | 
					            return;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (atMatch(m, e) >> "List" >> es) {
 | 
					    if (atMatch(m, e) >> "List" >> es) {
 | 
				
			||||||
        for (ATermIterator i(es); i; ++i)
 | 
					        for (ATermIterator i(es); i; ++i)
 | 
				
			||||||
            printNixExpr(state, evalExpr(state, *i));
 | 
					            printDrvPaths(state, evalExpr(state, *i));
 | 
				
			||||||
        return;
 | 
					        return;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -60,11 +60,22 @@ static void printNixExpr(EvalState & state, Expr e)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void printResult(EvalState & state, Expr e, bool evalOnly)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    if (evalOnly)
 | 
				
			||||||
 | 
					        cout << format("%1%\n") % e;
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        printDrvPaths(state, e);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void run(Strings args)
 | 
					void run(Strings args)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    EvalState state;
 | 
					    EvalState state;
 | 
				
			||||||
    Strings files;
 | 
					    Strings files;
 | 
				
			||||||
    bool readStdin = false;
 | 
					    bool readStdin = false;
 | 
				
			||||||
 | 
					    bool evalOnly = false;
 | 
				
			||||||
 | 
					    bool parseOnly = false;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (Strings::iterator it = args.begin();
 | 
					    for (Strings::iterator it = args.begin();
 | 
				
			||||||
         it != args.end(); )
 | 
					         it != args.end(); )
 | 
				
			||||||
| 
						 | 
					@ -73,6 +84,14 @@ void run(Strings args)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if (arg == "-")
 | 
					        if (arg == "-")
 | 
				
			||||||
            readStdin = true;
 | 
					            readStdin = true;
 | 
				
			||||||
 | 
					        else if (arg == "--eval-only") {
 | 
				
			||||||
 | 
					            readOnlyMode = true;
 | 
				
			||||||
 | 
					            evalOnly = true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        else if (arg == "--parse-only") {
 | 
				
			||||||
 | 
					            readOnlyMode = true;
 | 
				
			||||||
 | 
					            parseOnly = evalOnly = true;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
        else if (arg[0] == '-')
 | 
					        else if (arg[0] == '-')
 | 
				
			||||||
            throw UsageError(format("unknown flag `%1%`") % arg);
 | 
					            throw UsageError(format("unknown flag `%1%`") % arg);
 | 
				
			||||||
        else
 | 
					        else
 | 
				
			||||||
| 
						 | 
					@ -82,15 +101,16 @@ void run(Strings args)
 | 
				
			||||||
    openDB();
 | 
					    openDB();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    if (readStdin) {
 | 
					    if (readStdin) {
 | 
				
			||||||
        Expr e = evalStdin(state);
 | 
					        Expr e = evalStdin(state, parseOnly);
 | 
				
			||||||
        printNixExpr(state, e);
 | 
					        printResult(state, e, evalOnly);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    for (Strings::iterator it = files.begin();
 | 
					    for (Strings::iterator it = files.begin();
 | 
				
			||||||
         it != files.end(); it++)
 | 
					         it != files.end(); it++)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
        Expr e = evalFile(state, absPath(*it));
 | 
					        Expr e = evalFile(state, absPath(*it));
 | 
				
			||||||
        printNixExpr(state, e);
 | 
					        /* !!! parseOnly ignored */
 | 
				
			||||||
 | 
					        printResult(state, e, evalOnly);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    printEvalStats(state);
 | 
					    printEvalStats(state);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue