Allow both strings to be omitted in "${if" expansions: the true value
authorPhilip Hazel <ph10@hermes.cam.ac.uk>
Wed, 17 Nov 2004 16:12:26 +0000 (16:12 +0000)
committerPhilip Hazel <ph10@hermes.cam.ac.uk>
Wed, 17 Nov 2004 16:12:26 +0000 (16:12 +0000)
defaults to "true", which works nicely for "condition" conditions (the
false value has always defaulted to "").

doc/doc-txt/ChangeLog
doc/doc-txt/NewStuff
src/src/expand.c

index 251de3f..59bc0b9 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.30 2004/11/17 15:21:10 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.31 2004/11/17 16:12:26 ph10 Exp $
 
 Change log file for Exim from version 4.21
 -------------------------------------------
 
 Change log file for Exim from version 4.21
 -------------------------------------------
@@ -129,6 +129,11 @@ Exim version 4.44
     have increased the buffer size for the ${rfc2047: expansion operator from
     1024 to 2048 bytes.
 
     have increased the buffer size for the ${rfc2047: expansion operator from
     1024 to 2048 bytes.
 
+33. It is now permitted to omit both strings after an "if" condition; if the
+    condition is true, the result is "true". As before, when the second string
+    is omitted, a false condition yields an empty string. This makes it less
+    cumbersome to write custom ACL and router conditions.
+
 
 Exim version 4.43
 -----------------
 
 Exim version 4.43
 -----------------
index 7421078..d5d3407 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/NewStuff,v 1.10 2004/11/17 14:32:25 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/NewStuff,v 1.11 2004/11/17 16:12:26 ph10 Exp $
 
 New Features in Exim
 --------------------
 
 New Features in Exim
 --------------------
@@ -90,6 +90,24 @@ Version 4.44
     to find the amount of free space (only true for experimental systems), the
     space value is -1.
 
     to find the amount of free space (only true for experimental systems), the
     space value is -1.
 
+11. It is now permitted to omit both strings after an "if" condition; if the
+    condition is true, the result is the string "true". As before, when the
+    second string is omitted, a false condition yields an empty string. This
+    makes it less cumbersome to write custom ACL and router conditions. For
+    example, instead of
+
+      condition = ${if eq {$acl_m4}{1}{yes}{no}}
+
+    or the shorter form
+
+      condition = ${if eq {$acl_m4}{1}{yes}}
+
+    (because the second string has always defaulted to ""), you can now write
+
+      condition = ${if eq {$acl_m4}{1}}
+
+    Previously this was a syntax error.
+
 
 Version 4.43
 ------------
 
 Version 4.43
 ------------
index 916659f..f580d38 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/expand.c,v 1.5 2004/11/17 15:21:10 ph10 Exp $ */
+/* $Cambridge: exim/src/src/expand.c,v 1.6 2004/11/17 16:12:26 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -2175,17 +2175,24 @@ uschar *s = *sptr;    /* Local value */
 uschar *sub1, *sub2;
 
 /* If there are no following strings, we substitute the contents of $value for
 uschar *sub1, *sub2;
 
 /* If there are no following strings, we substitute the contents of $value for
-lookups and for extractions in the success case. In the fail case, nothing is
-substituted. In the case of "if", lack of following strings is an error. */
+lookups and for extractions in the success case. For the ${if item, the string
+"true" is substituted. In the fail case, nothing is substituted for all three 
+items. */
 
 while (isspace(*s)) s++;
 if (*s == '}')
   {
 
 while (isspace(*s)) s++;
 if (*s == '}')
   {
-  if (type[0] == 'i') goto FAILED_CURLY;
-  if (yes && lookup_value != NULL)
-    *yieldptr = string_cat(*yieldptr, sizeptr, ptrptr, lookup_value,
-      Ustrlen(lookup_value));
-  lookup_value = save_lookup;
+  if (type[0] == 'i')
+    {
+    if (yes) *yieldptr = string_cat(*yieldptr, sizeptr, ptrptr, US"true", 4); 
+    }
+  else
+    {      
+    if (yes && lookup_value != NULL)
+      *yieldptr = string_cat(*yieldptr, sizeptr, ptrptr, lookup_value,
+        Ustrlen(lookup_value));
+    lookup_value = save_lookup;
+    }
   s++;
   goto RETURN;
   }
   s++;
   goto RETURN;
   }