From 2132d9ddeba14ea2ddcbb16fa51ddb16c45c3c6a Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Tue, 29 Aug 2006 15:29:38 +0000 Subject: [PATCH] * Fix the ~ operator. --- src/libexpr/eval.cc | 14 ++++++++++++-- src/libexpr/primops.cc | 2 +- src/libutil/util.cc | 9 +++++++++ src/libutil/util.hh | 2 ++ 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc index 6b53f60a8..90edbecb5 100644 --- a/src/libexpr/eval.cc +++ b/src/libexpr/eval.cc @@ -321,7 +321,6 @@ Expr evalExpr2(EvalState & state, Expr e) /* Normal forms. */ if (sym == symStr || sym == symPath || - sym == symSubPath || /* !!! evaluate */ sym == symUri || sym == symNull || sym == symInt || @@ -503,7 +502,7 @@ Expr evalExpr2(EvalState & state, Expr e) } /* String or path concatenation. */ - ATermList es; + ATermList es = ATempty; if (matchOpPlus(e, e1, e2) || matchConcatStrings(e, es)) { ATermVector args; if (matchOpPlus(e, e1, e2)) { @@ -520,6 +519,17 @@ Expr evalExpr2(EvalState & state, Expr e) } } + /* Backwards compatability: subpath operator (~). */ + if (matchSubPath(e, e1, e2)) { + static bool haveWarned; + warnOnce(haveWarned, "the subpath operator (~) is deprecated, use string concatenation (+) instead"); + ATermList context = ATempty; + bool dummy; + string s1 = coerceToStringWithContext(state, context, e1, dummy); + string s2 = coerceToStringWithContext(state, context, e2, dummy); + return wrapInContext(context, makePath(toATerm(canonPath(s1 + "/" + s2)))); + } + /* List concatenation. */ if (matchOpConcat(e, e1, e2)) { try { diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc index 5496e945e..65e993708 100644 --- a/src/libexpr/primops.cc +++ b/src/libexpr/primops.cc @@ -163,7 +163,7 @@ void toString(EvalState & state, Expr e, } } - else throw TypeError(format("%1% is not allowed as a derivation argument") % showType(e)); + else throw TypeError(format("cannot convert %1% to a string") % showType(e)); } diff --git a/src/libutil/util.cc b/src/libutil/util.cc index 02745498f..54cfc6c7f 100644 --- a/src/libutil/util.cc +++ b/src/libutil/util.cc @@ -404,6 +404,15 @@ void printMsg_(Verbosity level, const format & f) } +void warnOnce(bool & haveWarned, const format & f) +{ + if (!haveWarned) { + printMsg(lvlError, format("warning: %1%") % f.str()); + haveWarned = true; + } +} + + void readFull(int fd, unsigned char * buf, size_t count) { while (count) { diff --git a/src/libutil/util.hh b/src/libutil/util.hh index 22e614d95..125ba2695 100644 --- a/src/libutil/util.hh +++ b/src/libutil/util.hh @@ -178,6 +178,8 @@ void printMsg_(Verbosity level, const format & f); #define debug(f) printMsg(lvlDebug, f) +void warnOnce(bool & haveWarned, const format & f); + /* Wrappers arount read()/write() that read/write exactly the requested number of bytes. */