about summary refs log tree commit diff
path: root/src/fix.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/fix.cc')
-rw-r--r--src/fix.cc33
1 files changed, 33 insertions, 0 deletions
diff --git a/src/fix.cc b/src/fix.cc
index 8f72d531c8c7..9111cd372733 100644
--- a/src/fix.cc
+++ b/src/fix.cc
@@ -146,6 +146,8 @@ static Expr evalExpr2(EvalState & state, Expr e)
     /* Normal forms. */
     if (ATmatch(e, "<str>", &s1) ||
         ATmatch(e, "[<list>]", &e1) ||
+        ATmatch(e, "True") ||
+        ATmatch(e, "False") ||
         ATmatch(e, "Function([<list>], <term>)", &e1, &e2) ||
         ATmatch(e, "FSId(<str>)", &s1))
         return e;
@@ -167,6 +169,37 @@ static Expr evalExpr2(EvalState & state, Expr e)
             substExprMany((ATermList) e3, (ATermList) e2, e4));
     }
 
+    /* Conditional. */
+    if (ATmatch(e, "If(<term>, <term>, <term>)", &e1, &e2, &e3)) {
+        e1 = evalExpr(state, e1);
+        Expr x;
+        if (ATmatch(e1, "True")) x = e2;
+        else if (ATmatch(e1, "False")) x = e3;
+        else throw badTerm("expecting a boolean", e1);
+        return evalExpr(state, x);
+    }
+
+    /* Ad-hoc function for string matching. */
+    if (ATmatch(e, "HasSubstr(<term>, <term>)", &e1, &e2)) {
+        e1 = evalExpr(state, e1);
+        e2 = evalExpr(state, e2);
+        
+        char * s1, * s2;
+        if (!ATmatch(e1, "<str>", &s1))
+            throw badTerm("expecting a string", e1);
+        if (!ATmatch(e2, "<str>", &s2))
+            throw badTerm("expecting a string", e2);
+        
+        return
+            string(s1).find(string(s2)) != string::npos ?
+            ATmake("True") : ATmake("False");
+    }
+
+    /* Platform constant. */
+    if (ATmatch(e, "Platform")) {
+        return ATmake("<str>", SYSTEM);
+    }
+
     /* Fix inclusion. */
     if (ATmatch(e, "IncludeFix(<str>)", &s1)) {
         string fileName(s1);