On Wed, 26 Jul 2006, John Horne wrote:

> Uppercase subject and lookup file key:
> 
>    CONSIDERATION in "^(?-i)CONSIDERATION"? no (end of list)
> 
> Lowercase subject and lookup file key:
> 
>    consideration in "^(?-i)consideration"? yes (matched
> "^(?-i)consideration")
> 
> Using mixed-case subject line:
> 
>    CONsidERAtiOn in "^(?-i)consideration"? yes (matched
> "^(?-i)consideration")
> 
> Now with uppercase lookup file key:
> 
>    CONsidERAtiOn in "^(?-i)CONSIDERATION"? no (end of list)
> 
> 
> As can be seen an uppercase comparison failed, when it should have
> worked, but the lowercase one worked. Mixed-case shouldn't work at all,
> but one did. A bug?

Not a bug, but an infelicity, I grant you. In section 9.3 of the
reference manual it says, in the paragraphs describing wildlsearch and
nwildlsearch:

  Like lsearch, the testing is done case-insensitively.
  
What this means is that the subject string is lower cased before any 
comparisons are done, and the regular expression by default has the 
case-insensitive flag set. In the case of a regex, lowercasing the 
subject isn't actually necessary -- it's done for other kinds of
pattern.

The infelicity is that specifing (?-i) to change the case sensitivity of 
the regex doesn't work, owing to the lower casing of the subject.

However, the good news is that I found a very small patch that makes it 
work. The specification is now 

  Like lsearch, the testing is done case-insensitively, but in the case 
  of a regular expression, the use of (?-i) in the regex turns on case-
  sensitive matching. 
  
The patch is below. I will commit this shortly, so it will also be in 
tonight's snapshot. 

-- 
Philip Hazel            University of Cambridge Computing Service
Get the Exim 4 book:    http://www.uit.co.uk/exim-book



*** exim-4.62/src/match.c   Fri Apr 28 11:32:22 2006
--- match.c     Thu Jul 27 14:24:02 2006
***************
*** 108,113 ****
--- 109,120 ----
  
  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. */
  

-- 
## List details at http://www.exim.org/mailman/listinfo/exim-users 
## Exim details at http://www.exim.org/
## Please use the Wiki with this list - http://www.exim.org/eximwiki/

Reply via email to