Allow (?-i) to work as expected in a (n)wildlsearch key.
authorPhilip Hazel <ph10@hermes.cam.ac.uk>
Thu, 27 Jul 2006 13:50:43 +0000 (13:50 +0000)
committerPhilip Hazel <ph10@hermes.cam.ac.uk>
Thu, 27 Jul 2006 13:50:43 +0000 (13:50 +0000)
doc/doc-txt/ChangeLog
src/src/match.c
test/aux-var-src/0002.wild
test/scripts/0000-Basic/0002
test/stdout/0002

index 71646ced2035f0c32cded3a0e0a071afb43fe5f4..d607ebdb149dbcecff2d4c786a9e9c79911e4430 100644 (file)
@@ -1,4 +1,4 @@
-$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.383 2006/07/27 11:29:32 ph10 Exp $
+$Cambridge: exim/doc/doc-txt/ChangeLog,v 1.384 2006/07/27 13:50:43 ph10 Exp $
 
 Change log file for Exim from version 4.21
 -------------------------------------------
@@ -140,6 +140,12 @@ PH/25 Exim was not testing for a space following SMTP commands such as EHLO
       This bug exists in every version of Exim that I still have, right back to
       0.12.
 
+PH/26 (n)wildlsearch lookups are documented as being done case-insensitively.
+      However, an attempt to turn on case-sensitivity in a regex key by
+      including (?-i) didn't work because the subject string was already
+      lowercased, and the effects were non-intuitive. It turns out that a
+      one-line patch can be used to allow (?-i) to work as expected.
+
 
 Exim version 4.62
 -----------------
index 218944530acff9e7112e55996a0b1375a8ec4b00..238a2cdeaa2ab24892b9cc24c8cf8700c352f933 100644 (file)
@@ -1,4 +1,4 @@
-/* $Cambridge: exim/src/src/match.c,v 1.14 2006/04/04 10:01:20 ph10 Exp $ */
+/* $Cambridge: exim/src/src/match.c,v 1.15 2006/07/27 13:50:43 ph10 Exp $ */
 
 /*************************************************
 *     Exim - an Internet mail transport agent    *
@@ -74,7 +74,8 @@ Arguments:
                    returns ERROR)
 
 Contents of the argument block:
-  subject        the subject string to be checked
+  origsubject    the subject in its original casing
+  subject        the subject string to be checked, lowercased if caseless
   expand_setup   if < 0, don't set up any numeric expansion variables;
                  if = 0, set $0 to whole subject, and either
                    $1 to what matches * or
@@ -99,7 +100,7 @@ check_string_block *cb = (check_string_block *)arg;
 int search_type, partial, affixlen, starflags;
 int expand_setup = cb->expand_setup;
 uschar *affix;
-uschar *s = cb->subject;
+uschar *s;
 uschar *filename = NULL;
 uschar *keyquery, *result, *semicolon;
 void *handle;
@@ -108,6 +109,12 @@ error = error;  /* Keep clever compilers from complaining */
 
 if (valueptr != NULL) *valueptr = NULL;  /* For non-lookup matches */
 
+/* For regular expressions, use cb->origsubject rather than cb->subject so that
+it works if the pattern uses (?-i) to turn off case-independence, overriding
+"caseless". */
+
+s = (pattern[0] == '^')? cb->origsubject : cb->subject;
+
 /* If required to set up $0, initialize the data but don't turn on by setting
 expand_nmax until the match is assured. */
 
index 826825725acd508003151e4970f3f05df40c142d..f3202068e725fda12c1eaf49ac41a57b46af64c8 100644 (file)
@@ -9,3 +9,5 @@ abc:        abc
 ^a\\.+b     ^a\\.+b
 \N^a\d+b    \N^a\d+b
 lsearch;DIR/aux-fixed/0002.quoted:  lookup succeeded
+^(?-i)MiXeD-CD: Data found for case-dependent MiXeD-CD
+^MiXeD-nCD: Data found for case-independent MiXeD-nCD
index 7ff379c4f3a8529cdfd5462cf348da0f6223b03d..251b8d0c507ecec872a4394cac0e8e8d17e11e83 100644 (file)
@@ -387,6 +387,13 @@ a99b:  ${lookup{a99b}nwildlsearch{DIR/aux-var/0002.wild}{$value}{NO}}
 a\\:b:  ${lookup{a\\:b}nwildlsearch{DIR/aux-var/0002.wild}}
 a\\:Xb: ${lookup{a\\:Xb}nwildlsearch{DIR/aux-var/0002.wild}}
 
+# Some tests of case-(in)dependence
+
+MiXeD-CD:  ${lookup{MiXeD-CD}nwildlsearch{DIR/aux-var/0002.wild}{$value}{NOT FOUND}}
+MixeD-CD:  ${lookup{MixeD-CD}nwildlsearch{DIR/aux-var/0002.wild}{$value}{NOT FOUND}}
+MiXeD-Ncd: ${lookup{MiXeD-Ncd}nwildlsearch{DIR/aux-var/0002.wild}{$value}{NOT FOUND}}
+MixeD-Ncd: ${lookup{MixeD-Ncd}nwildlsearch{DIR/aux-var/0002.wild}{$value}{NOT FOUND}}
+
 # IP address (CIDR) lookups
 
 1.2.3.4:      ${lookup{1.2.3.4}iplsearch{DIR/aux-fixed/0002.iplsearch}}
index 8e3c661b33a245ade48e4d9a9ec9cb1db17d5668..e437faded85f79fad81e6fddbe7c880d7fa5a7e1 100644 (file)
 > a\:b:  ^a\\.+b
 > a\:Xb: ^a\\.+b
 > 
+> # Some tests of case-(in)dependence
+> 
+> MiXeD-CD:  Data found for case-dependent MiXeD-CD
+> MixeD-CD:  NOT FOUND
+> MiXeD-Ncd: Data found for case-independent MiXeD-nCD
+> MixeD-Ncd: Data found for case-independent MiXeD-nCD
+> 
 > # IP address (CIDR) lookups
 > 
 > 1.2.3.4:      data for 1.2.3.4