about summary refs log tree commit diff
path: root/src/libexpr/eval.cc
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2004-10-26T17·01+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2004-10-26T17·01+0000
commit9fa07b376dd52ee8bbcc074e59d36af3f3f2536d (patch)
treeef2d6d8d32b8a7c87c5396ab3b34b7fafa3810f1 /src/libexpr/eval.cc
parentee401afad81dc7759c66829372826f98268ae606 (diff)
* String/path concatenation operator (`+').
Diffstat (limited to 'src/libexpr/eval.cc')
-rw-r--r--src/libexpr/eval.cc14
1 files changed, 14 insertions, 0 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index 215692aeb3..4454aaec45 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -338,6 +338,20 @@ Expr evalExpr2(EvalState & state, Expr e)
         return makeBool(attrs.get(name) != 0);
     }
 
+    /* String or path concatenation. */
+    if (atMatch(m, e) >> "OpPlus" >> e1 >> e2) {
+        e1 = evalExpr(state, e1);
+        e2 = evalExpr(state, e2);
+        string s1, s2;
+        if (atMatch(m, e1) >> "Str" >> s1 &&
+            atMatch(m, e2) >> "Str" >> s2)
+            return makeString(s1 + s2);
+        else if (atMatch(m, e1) >> "Path" >> s1 &&
+            atMatch(m, e2) >> "Path" >> s2)
+            return makeString(canonPath(s1 + "/" + s2));
+        else throw Error("wrong argument types in `+' operator");
+    }
+
     /* Barf. */
     throw badTerm("invalid expression", e);
 }