eval: ${eval:08}
eval10: ${eval10:077}
eval10: ${eval10:08}
+eval10: ${eval10:0x1234}
+eval: ${eval:2+42%5}
+eval: ${eval:0xc&5}
+eval: ${eval:0xc & 5 }
+eval: ${eval:0x0c|5}
+eval: ${eval:0xc^5}
+eval: ${eval:0xc>>1}
+eval: ${eval:0xc >> 2}
+eval: ${eval:0xc >> 4 }
+eval: ${eval:0xc<<1}
+eval: ${eval:~255&0x1234}
+eval: ${eval:~ 255&0x1234}
+eval: ${eval: -(~255&0x1234)}
+
expand: \$primary_hostname ${expand:\$primary_hostname}
hash: ${hash_3:monty} ${hash_5:monty} ${hash_4_62:monty python}
hash: ${hash_3:abc}X ${hash_3:ab}X ${hash_3:a}X ${hash_3:}X
base62: ${if or {\
{eq {${base62:12345}}{0003D7}}\
{eq {${base62:12345}}{0009IX}}\
- }{OK}{NOT OK}}
+ }{OK}{NOT OK}}
base62d: ${if or {\
{eq {${base62d:0003D7}}{12345}}\
{eq {${base62d:0009IX}}{12345}}\
- }{OK}{NOT OK}}
+ }{OK}{NOT OK}}
base62d: ${if or {\
{eq {${base62d:3D7}}{12345}}\
{eq {${base62d:9IX}}{12345}}\
- }{OK}{NOT OK}}
+ }{OK}{NOT OK}}
base62 error: ${base62:12345x}
base62d error:${base62d:0003D7.}
md5: ${if eq {1}{2}{${md5:invalid}}{NO}}
mask: ${if eq {1}{2}{${mask:invalid}}{NO}}
+# Numeric overflow
+
+4096M ${if >{1}{4096M}{y}{n}}
+4096000000 ${if >{1}{4096000000}{y}{n}}
+
# Conditions
2=2: ${if ={2}{2}{y}{n}}
2>3: ${if >{2}{3}{y}{n}}
3>3: ${if >{3}{3}{y}{n}}
4>3: ${if >{4}{3}{y}{n}}
+1>-1: ${if >{1}{-1}{y}{n}}
2>=3: ${if >={2}{3}{y}{n}}
3>=3: ${if >={3}{3}{y}{n}}
4>=3: ${if >={4}{3}{y}{n}}
3<=3: ${if <={3}{3}{y}{n}}
4<=3: ${if <={4}{3}{y}{n}}
5<=3: ${if <={ 5 } { 3 } {y}{n}}
+-3<=1: ${if <={-3}{1}{y}{n}}
5>3k: ${if >{5 } {3k }{y}{n}}
5>3m: ${if >{5 } {3m }{y}{n}}
5>3z: ${if >{5 } {3z }{y}{n}}
5>a: ${if >{ 5 } {a}{y}{n}}
+>0: ${if > {}{0}{y}{n}}
+=: ${if = {}{}{y}{n}}
+-2<: ${if < {-2}{}{y}{n}}
+08>07: ${if > {08}{07}{y}{n}}
+011=11: ${if = {011}{11}{y}{n}}
+
def:y ${if def:tod_log{y}{n}}
def:n ${if def:host{y}{n}}
def:f ${if def:post{y}{n}}
${if match{x@zz.aa.bb}{^(.*)} \
{ \
- >$1< \
+ >$1< \
${if match_domain{${domain:$1}}{+dlist}{[$1]}} \
>$1< \
} \
- { CAN'T HAPPEN}}
+ { CAN'T HAPPEN}}
${if match{x@xxxabc}{^(.*)} \
{ \
- >$1< \
+ >$1< \
${if match_domain{${domain:$1}}{^\Nxxx(.*)\N}{[$1]}} \
>$1< \
} \
- { CAN'T HAPPEN}}
+ { CAN'T HAPPEN}}
match_address: ${if match_address{x@y.z}{p@q:*@y.z}{yes}{no}}
match_address: ${if match_address{x@y.z}{p@q:x@*.z}{yes}{no}}
Long: ${rfc2047: here we go: a string that is going to be encoded: it will go over the 75-char limit}
Long: ${rfc2047: here we go: a string that is going to be encoded: it will go over the 75-char limit by a long way; in fact this one will go over the 150 character limit}
+# RFC 2047 decode
+
+${rfc2047d:abcd abcd}
+${rfc2047d:<:abcd:> =?iso-8859-8?Q?=3C=3Aabcd=3A=3E?=}
+${rfc2047d:<:ab cd:> =?iso-8859-8?Q?=3C=3Aab_cd=3A=3E?=}
+${rfc2047d:Long: =?iso-8859-8?Q?_here_we_go=3A_a_string_that_is_going_to_be_encoded=3A_i?= =?iso-8859-8?Q?t_will_go_over_the_75-char_limit?=}
+${rfc2047d:Long: =?iso-8859-8?Q?_here_we_go=3A_a_string_that_is_going_to_be_encoded=3A_i?= =?iso-8859-8?Q?t_will_go_over_the_75-char_limit_by_a_long_way=3B_in_fac?= =?iso-8859-8?Q?t_this_one_will_go_over_the_150_character_limit?=}
# UTF-8
${prvs{userx@test.ex}{secret}{}}
# Correct checks; can't put explicit addresses in the tests, because they
-# will change over time.
+# will change over time.
${prvscheck{${prvs{userx@test.ex}{secret}}}{secret}}
result=$prvscheck_result
${if and {{xya}}{a}{b}}
${if and {{${lookup{x}lsearch{/a/b}}}}{a}{b}}
${if eq {$h_xyz}{1}{y}{n}}
+${if eq {$h_xyz:}{1}{y}{n}
+${if def:h_xyz}{y}{n}}
${if or {eq {}{}{yes}{no}}
${if or {{eq {}{}{yes}{no}}
${if or {{eq {}{}}{yes}{no}}
${substr_1_:12345}
${substr__3:12345}
+# Iterations: forany and forall
+
+${if forany{a:b:c}{eq{$item}{a}}{yes}{no}}
+${if forany{a:b:c}{eq{$item}{b}}{yes}{no}}
+${if forany{a:b:c}{eq{$item}{c}}{yes}{no}}
+${if forany {a:b:c} {eq {$item} {z}} {yes} {no}}
+${if !forany{a:b:c}{eq{$item}{z}}{yes}{no}}
+${if !forany{a:b:c}{eq{$item}{a}}{yes}{no}}
+${if forany{}{eq{$item}{a}}{yes}{no}}
+${if !forany{}{eq{$item}{a}}{yes}{no}}
+${if forany{<, $primary_hostname,foo,bar}{eq{$item}{$primary_hostname}}{yes}{no}}
+
+${if forany{}{yes}{no}}
+${if forany{a:b:c}{gt{$item}{a}{yes}{no}}
+
+${if forall{a:b:c}{match{$item}{^[a-c]\$}}{yes}{no}}
+${if forall{q:b:c}{match{$item}{^[a-c]\$}}{yes}{no}}
+${if forall{a:b:z}{match{$item}{^[a-c]\$}}{yes}{no}}
+${if forall{}{match{$item}{^[a-c]\$}}{yes}{no}}
+
+${if !forall{a:b:c}{match{$item}{^[a-c]\$}}{yes}{no}}
+${if !forall{q:b:c}{match{$item}{^[a-c]\$}}{yes}{no}}
+${if !forall{a:b:z}{match{$item}{^[a-c]\$}}{yes}{no}}
+${if !forall{}{match{$item}{^[a-c]\$}}{yes}{no}}
+
+# Expect yes
+${if forany{a:b:c}\
+ {\
+ eq\
+ {$item: ${if forall{x:y:z}{match{$item}{^[x-z]\$}}{true}{false}}}\
+ {$item: true}\
+ }\
+{outer=yes}{outer=no}} item='$item' (unset)
+
+# Expect no
+${if forany{a:b:c}\
+ {\
+ eq\
+ {$item: ${if !forall{x:y:z}{match{$item}{^[x-z]\$}}{true}{false}}}\
+ {$item: true}\
+ }\
+{outer=yes}{outer=no}}
+
+# Error inside nest - check message is helpful
+${if forany{a:b:c}\
+ {\
+ eq\
+ {$item: ${if forall{x:y:z}{match{$item}{^[x-z]\$}{true}{false}}}\
+ {$item: true}\
+ }\
+{outer=yes}{outer=no}}
+
+
# Miscellaneous (for bug fixes, etc)
${if ={1}{1} {true}{${if ={1}{1} {true}{${if ={1}{1}{true}fail}}}}}