Karsten Hopp 8f0b65
To: vim_dev@googlegroups.com
Karsten Hopp 8f0b65
Subject: Patch 7.3.1111
Karsten Hopp 8f0b65
Fcc: outbox
Karsten Hopp 8f0b65
From: Bram Moolenaar <Bram@moolenaar.net>
Karsten Hopp 8f0b65
Mime-Version: 1.0
Karsten Hopp 8f0b65
Content-Type: text/plain; charset=UTF-8
Karsten Hopp 8f0b65
Content-Transfer-Encoding: 8bit
Karsten Hopp 8f0b65
------------
Karsten Hopp 8f0b65
Karsten Hopp 8f0b65
Patch 7.3.1111
Karsten Hopp 8f0b65
Problem:    nfa_recognize_char_class() implementation is inefficient.
Karsten Hopp 8f0b65
Solution:   Use bits in an int instead of chars in a string. (Dominique Pelle)
Karsten Hopp 8f0b65
Files:	    src/regexp_nfa.c, src/testdir/test36.in, src/testdir/test36.ok
Karsten Hopp 8f0b65
Karsten Hopp 8f0b65
Karsten Hopp 8f0b65
*** ../vim-7.3.1110/src/regexp_nfa.c	2013-06-04 14:23:00.000000000 +0200
Karsten Hopp 8f0b65
--- src/regexp_nfa.c	2013-06-04 17:38:43.000000000 +0200
Karsten Hopp 8f0b65
***************
Karsten Hopp 8f0b65
*** 380,417 ****
Karsten Hopp 8f0b65
      char_u  *end;
Karsten Hopp 8f0b65
      int	    extra_newl;
Karsten Hopp 8f0b65
  {
Karsten Hopp 8f0b65
!     int		i;
Karsten Hopp 8f0b65
!     /* Each of these variables takes up a char in "config[]",
Karsten Hopp 8f0b65
!      * in the order they are here. */
Karsten Hopp 8f0b65
!     int		not = FALSE, af = FALSE, AF = FALSE, az = FALSE, AZ = FALSE,
Karsten Hopp 8f0b65
! 		o7 = FALSE, o9 = FALSE, underscore = FALSE, newl = FALSE;
Karsten Hopp 8f0b65
      char_u	*p;
Karsten Hopp 8f0b65
! #define NCONFIGS 16
Karsten Hopp 8f0b65
!     int		classid[NCONFIGS] = {
Karsten Hopp 8f0b65
! 	NFA_DIGIT, NFA_NDIGIT, NFA_HEX, NFA_NHEX,
Karsten Hopp 8f0b65
! 	NFA_OCTAL, NFA_NOCTAL, NFA_WORD, NFA_NWORD,
Karsten Hopp 8f0b65
! 	NFA_HEAD, NFA_NHEAD, NFA_ALPHA, NFA_NALPHA,
Karsten Hopp 8f0b65
! 	NFA_LOWER, NFA_NLOWER, NFA_UPPER, NFA_NUPPER
Karsten Hopp 8f0b65
!     };
Karsten Hopp 8f0b65
!     char_u	myconfig[10];
Karsten Hopp 8f0b65
!     char_u	config[NCONFIGS][9] = {
Karsten Hopp 8f0b65
! 	"000000100",	/* digit */
Karsten Hopp 8f0b65
! 	"100000100",	/* non digit */
Karsten Hopp 8f0b65
! 	"011000100",	/* hex-digit */
Karsten Hopp 8f0b65
! 	"111000100",	/* non hex-digit */
Karsten Hopp 8f0b65
! 	"000001000",	/* octal-digit */
Karsten Hopp 8f0b65
! 	"100001000",	/* [^0-7] */
Karsten Hopp 8f0b65
! 	"000110110",	/* [0-9A-Za-z_]	*/
Karsten Hopp 8f0b65
! 	"100110110",	/* [^0-9A-Za-z_] */
Karsten Hopp 8f0b65
! 	"000110010",	/* head of word */
Karsten Hopp 8f0b65
! 	"100110010",	/* not head of word */
Karsten Hopp 8f0b65
! 	"000110000",	/* alphabetic char a-z */
Karsten Hopp 8f0b65
! 	"100110000",	/* non alphabetic char */
Karsten Hopp 8f0b65
! 	"000100000",	/* lowercase letter */
Karsten Hopp 8f0b65
! 	"100100000",	/* non lowercase */
Karsten Hopp 8f0b65
! 	"000010000",	/* uppercase */
Karsten Hopp 8f0b65
! 	"100010000"	/* non uppercase */
Karsten Hopp 8f0b65
!     };
Karsten Hopp 8f0b65
  
Karsten Hopp 8f0b65
      if (extra_newl == TRUE)
Karsten Hopp 8f0b65
  	newl = TRUE;
Karsten Hopp 8f0b65
--- 380,397 ----
Karsten Hopp 8f0b65
      char_u  *end;
Karsten Hopp 8f0b65
      int	    extra_newl;
Karsten Hopp 8f0b65
  {
Karsten Hopp 8f0b65
! #   define CLASS_not		0x80
Karsten Hopp 8f0b65
! #   define CLASS_af		0x40
Karsten Hopp 8f0b65
! #   define CLASS_AF		0x20
Karsten Hopp 8f0b65
! #   define CLASS_az		0x10
Karsten Hopp 8f0b65
! #   define CLASS_AZ		0x08
Karsten Hopp 8f0b65
! #   define CLASS_o7		0x04
Karsten Hopp 8f0b65
! #   define CLASS_o9		0x02
Karsten Hopp 8f0b65
! #   define CLASS_underscore	0x01
Karsten Hopp 8f0b65
! 
Karsten Hopp 8f0b65
!     int		newl = FALSE;
Karsten Hopp 8f0b65
      char_u	*p;
Karsten Hopp 8f0b65
!     int		config = 0;
Karsten Hopp 8f0b65
  
Karsten Hopp 8f0b65
      if (extra_newl == TRUE)
Karsten Hopp 8f0b65
  	newl = TRUE;
Karsten Hopp 8f0b65
***************
Karsten Hopp 8f0b65
*** 421,427 ****
Karsten Hopp 8f0b65
      p = start;
Karsten Hopp 8f0b65
      if (*p == '^')
Karsten Hopp 8f0b65
      {
Karsten Hopp 8f0b65
! 	not = TRUE;
Karsten Hopp 8f0b65
  	p++;
Karsten Hopp 8f0b65
      }
Karsten Hopp 8f0b65
  
Karsten Hopp 8f0b65
--- 401,407 ----
Karsten Hopp 8f0b65
      p = start;
Karsten Hopp 8f0b65
      if (*p == '^')
Karsten Hopp 8f0b65
      {
Karsten Hopp 8f0b65
! 	config |= CLASS_not;
Karsten Hopp 8f0b65
  	p++;
Karsten Hopp 8f0b65
      }
Karsten Hopp 8f0b65
  
Karsten Hopp 8f0b65
***************
Karsten Hopp 8f0b65
*** 434,470 ****
Karsten Hopp 8f0b65
  		case '0':
Karsten Hopp 8f0b65
  		    if (*(p + 2) == '9')
Karsten Hopp 8f0b65
  		    {
Karsten Hopp 8f0b65
! 			o9 = TRUE;
Karsten Hopp 8f0b65
  			break;
Karsten Hopp 8f0b65
  		    }
Karsten Hopp 8f0b65
  		    else
Karsten Hopp 8f0b65
  		    if (*(p + 2) == '7')
Karsten Hopp 8f0b65
  		    {
Karsten Hopp 8f0b65
! 			o7 = TRUE;
Karsten Hopp 8f0b65
  			break;
Karsten Hopp 8f0b65
  		    }
Karsten Hopp 8f0b65
  		case 'a':
Karsten Hopp 8f0b65
  		    if (*(p + 2) == 'z')
Karsten Hopp 8f0b65
  		    {
Karsten Hopp 8f0b65
! 			az = TRUE;
Karsten Hopp 8f0b65
  			break;
Karsten Hopp 8f0b65
  		    }
Karsten Hopp 8f0b65
  		    else
Karsten Hopp 8f0b65
  		    if (*(p + 2) == 'f')
Karsten Hopp 8f0b65
  		    {
Karsten Hopp 8f0b65
! 			af = TRUE;
Karsten Hopp 8f0b65
  			break;
Karsten Hopp 8f0b65
  		    }
Karsten Hopp 8f0b65
  		case 'A':
Karsten Hopp 8f0b65
  		    if (*(p + 2) == 'Z')
Karsten Hopp 8f0b65
  		    {
Karsten Hopp 8f0b65
! 			AZ = TRUE;
Karsten Hopp 8f0b65
  			break;
Karsten Hopp 8f0b65
  		    }
Karsten Hopp 8f0b65
  		    else
Karsten Hopp 8f0b65
  		    if (*(p + 2) == 'F')
Karsten Hopp 8f0b65
  		    {
Karsten Hopp 8f0b65
! 			AF = TRUE;
Karsten Hopp 8f0b65
  			break;
Karsten Hopp 8f0b65
  		    }
Karsten Hopp 8f0b65
  		/* FALLTHROUGH */
Karsten Hopp 8f0b65
--- 414,450 ----
Karsten Hopp 8f0b65
  		case '0':
Karsten Hopp 8f0b65
  		    if (*(p + 2) == '9')
Karsten Hopp 8f0b65
  		    {
Karsten Hopp 8f0b65
! 			config |= CLASS_o9;
Karsten Hopp 8f0b65
  			break;
Karsten Hopp 8f0b65
  		    }
Karsten Hopp 8f0b65
  		    else
Karsten Hopp 8f0b65
  		    if (*(p + 2) == '7')
Karsten Hopp 8f0b65
  		    {
Karsten Hopp 8f0b65
! 			config |= CLASS_o7;
Karsten Hopp 8f0b65
  			break;
Karsten Hopp 8f0b65
  		    }
Karsten Hopp 8f0b65
  		case 'a':
Karsten Hopp 8f0b65
  		    if (*(p + 2) == 'z')
Karsten Hopp 8f0b65
  		    {
Karsten Hopp 8f0b65
! 			config |= CLASS_az;
Karsten Hopp 8f0b65
  			break;
Karsten Hopp 8f0b65
  		    }
Karsten Hopp 8f0b65
  		    else
Karsten Hopp 8f0b65
  		    if (*(p + 2) == 'f')
Karsten Hopp 8f0b65
  		    {
Karsten Hopp 8f0b65
! 			config |= CLASS_af;
Karsten Hopp 8f0b65
  			break;
Karsten Hopp 8f0b65
  		    }
Karsten Hopp 8f0b65
  		case 'A':
Karsten Hopp 8f0b65
  		    if (*(p + 2) == 'Z')
Karsten Hopp 8f0b65
  		    {
Karsten Hopp 8f0b65
! 			config |= CLASS_AZ;
Karsten Hopp 8f0b65
  			break;
Karsten Hopp 8f0b65
  		    }
Karsten Hopp 8f0b65
  		    else
Karsten Hopp 8f0b65
  		    if (*(p + 2) == 'F')
Karsten Hopp 8f0b65
  		    {
Karsten Hopp 8f0b65
! 			config |= CLASS_AF;
Karsten Hopp 8f0b65
  			break;
Karsten Hopp 8f0b65
  		    }
Karsten Hopp 8f0b65
  		/* FALLTHROUGH */
Karsten Hopp 8f0b65
***************
Karsten Hopp 8f0b65
*** 480,486 ****
Karsten Hopp 8f0b65
  	}
Karsten Hopp 8f0b65
  	else if (*p == '_')
Karsten Hopp 8f0b65
  	{
Karsten Hopp 8f0b65
! 	    underscore = TRUE;
Karsten Hopp 8f0b65
  	    p ++;
Karsten Hopp 8f0b65
  	}
Karsten Hopp 8f0b65
  	else if (*p == '\n')
Karsten Hopp 8f0b65
--- 460,466 ----
Karsten Hopp 8f0b65
  	}
Karsten Hopp 8f0b65
  	else if (*p == '_')
Karsten Hopp 8f0b65
  	{
Karsten Hopp 8f0b65
! 	    config |= CLASS_underscore;
Karsten Hopp 8f0b65
  	    p ++;
Karsten Hopp 8f0b65
  	}
Karsten Hopp 8f0b65
  	else if (*p == '\n')
Karsten Hopp 8f0b65
***************
Karsten Hopp 8f0b65
*** 495,532 ****
Karsten Hopp 8f0b65
      if (p != end)
Karsten Hopp 8f0b65
  	return FAIL;
Karsten Hopp 8f0b65
  
Karsten Hopp 8f0b65
-     /* build the config that represents the ranges we gathered */
Karsten Hopp 8f0b65
-     STRCPY(myconfig, "000000000");
Karsten Hopp 8f0b65
-     if (not == TRUE)
Karsten Hopp 8f0b65
- 	myconfig[0] = '1';
Karsten Hopp 8f0b65
-     if (af == TRUE)
Karsten Hopp 8f0b65
- 	myconfig[1] = '1';
Karsten Hopp 8f0b65
-     if (AF == TRUE)
Karsten Hopp 8f0b65
- 	myconfig[2] = '1';
Karsten Hopp 8f0b65
-     if (az == TRUE)
Karsten Hopp 8f0b65
- 	myconfig[3] = '1';
Karsten Hopp 8f0b65
-     if (AZ == TRUE)
Karsten Hopp 8f0b65
- 	myconfig[4] = '1';
Karsten Hopp 8f0b65
-     if (o7 == TRUE)
Karsten Hopp 8f0b65
- 	myconfig[5] = '1';
Karsten Hopp 8f0b65
-     if (o9 == TRUE)
Karsten Hopp 8f0b65
- 	myconfig[6] = '1';
Karsten Hopp 8f0b65
-     if (underscore == TRUE)
Karsten Hopp 8f0b65
- 	myconfig[7] = '1';
Karsten Hopp 8f0b65
      if (newl == TRUE)
Karsten Hopp 8f0b65
-     {
Karsten Hopp 8f0b65
- 	myconfig[8] = '1';
Karsten Hopp 8f0b65
  	extra_newl = ADD_NL;
Karsten Hopp 8f0b65
-     }
Karsten Hopp 8f0b65
-     /* try to recognize character classes */
Karsten Hopp 8f0b65
-     for (i = 0; i < NCONFIGS; i++)
Karsten Hopp 8f0b65
- 	if (STRNCMP(myconfig, config[i], 8) == 0)
Karsten Hopp 8f0b65
- 	    return classid[i] + extra_newl;
Karsten Hopp 8f0b65
  
Karsten Hopp 8f0b65
!     /* fallthrough => no success so far */
Karsten Hopp 8f0b65
      return FAIL;
Karsten Hopp 8f0b65
- 
Karsten Hopp 8f0b65
- #undef NCONFIGS
Karsten Hopp 8f0b65
  }
Karsten Hopp 8f0b65
  
Karsten Hopp 8f0b65
  /*
Karsten Hopp 8f0b65
--- 475,519 ----
Karsten Hopp 8f0b65
      if (p != end)
Karsten Hopp 8f0b65
  	return FAIL;
Karsten Hopp 8f0b65
  
Karsten Hopp 8f0b65
      if (newl == TRUE)
Karsten Hopp 8f0b65
  	extra_newl = ADD_NL;
Karsten Hopp 8f0b65
  
Karsten Hopp 8f0b65
!     switch (config)
Karsten Hopp 8f0b65
!     {
Karsten Hopp 8f0b65
! 	case CLASS_o9:
Karsten Hopp 8f0b65
! 	    return extra_newl + NFA_DIGIT;
Karsten Hopp 8f0b65
! 	case CLASS_not |  CLASS_o9:
Karsten Hopp 8f0b65
! 	    return extra_newl + NFA_NDIGIT;
Karsten Hopp 8f0b65
! 	case CLASS_af | CLASS_AF | CLASS_o9:
Karsten Hopp 8f0b65
! 	    return extra_newl + NFA_HEX;
Karsten Hopp 8f0b65
! 	case CLASS_not | CLASS_af | CLASS_AF | CLASS_o9:
Karsten Hopp 8f0b65
! 	    return extra_newl + NFA_NHEX;
Karsten Hopp 8f0b65
! 	case CLASS_o7:
Karsten Hopp 8f0b65
! 	    return extra_newl + NFA_OCTAL;
Karsten Hopp 8f0b65
! 	case CLASS_not | CLASS_o7:
Karsten Hopp 8f0b65
! 	    return extra_newl + NFA_NOCTAL;
Karsten Hopp 8f0b65
! 	case CLASS_az | CLASS_AZ | CLASS_o9 | CLASS_underscore:
Karsten Hopp 8f0b65
! 	    return extra_newl + NFA_WORD;
Karsten Hopp 8f0b65
! 	case CLASS_not | CLASS_az | CLASS_AZ | CLASS_o9 | CLASS_underscore:
Karsten Hopp 8f0b65
! 	    return extra_newl + NFA_NWORD;
Karsten Hopp 8f0b65
! 	case CLASS_az | CLASS_AZ | CLASS_underscore:
Karsten Hopp 8f0b65
! 	    return extra_newl + NFA_HEAD;
Karsten Hopp 8f0b65
! 	case CLASS_not | CLASS_az | CLASS_AZ | CLASS_underscore:
Karsten Hopp 8f0b65
! 	    return extra_newl + NFA_NHEAD;
Karsten Hopp 8f0b65
! 	case CLASS_az | CLASS_AZ:
Karsten Hopp 8f0b65
! 	    return extra_newl + NFA_ALPHA;
Karsten Hopp 8f0b65
! 	case CLASS_not | CLASS_az | CLASS_AZ:
Karsten Hopp 8f0b65
! 	    return extra_newl + NFA_NALPHA;
Karsten Hopp 8f0b65
! 	case CLASS_az:
Karsten Hopp 8f0b65
! 	   return extra_newl + NFA_LOWER;
Karsten Hopp 8f0b65
! 	case CLASS_not | CLASS_az:
Karsten Hopp 8f0b65
! 	    return extra_newl + NFA_NLOWER;
Karsten Hopp 8f0b65
! 	case CLASS_AZ:
Karsten Hopp 8f0b65
! 	    return extra_newl + NFA_UPPER;
Karsten Hopp 8f0b65
! 	case CLASS_not | CLASS_AZ:
Karsten Hopp 8f0b65
! 	    return extra_newl + NFA_NUPPER;
Karsten Hopp 8f0b65
!     }
Karsten Hopp 8f0b65
      return FAIL;
Karsten Hopp 8f0b65
  }
Karsten Hopp 8f0b65
  
Karsten Hopp 8f0b65
  /*
Karsten Hopp 8f0b65
***************
Karsten Hopp 8f0b65
*** 900,906 ****
Karsten Hopp 8f0b65
  			EMSG_RET_FAIL(_(e_z1_not_allowed));
Karsten Hopp 8f0b65
  		    EMIT(NFA_ZREF1 + (no_Magic(c) - '1'));
Karsten Hopp 8f0b65
  		    /* No need to set nfa_has_backref, the sub-matches don't
Karsten Hopp 8f0b65
! 		     * change when \z1 .. \z9 maches or not. */
Karsten Hopp 8f0b65
  		    re_has_z = REX_USE;
Karsten Hopp 8f0b65
  		    break;
Karsten Hopp 8f0b65
  		case '(':
Karsten Hopp 8f0b65
--- 887,893 ----
Karsten Hopp 8f0b65
  			EMSG_RET_FAIL(_(e_z1_not_allowed));
Karsten Hopp 8f0b65
  		    EMIT(NFA_ZREF1 + (no_Magic(c) - '1'));
Karsten Hopp 8f0b65
  		    /* No need to set nfa_has_backref, the sub-matches don't
Karsten Hopp 8f0b65
! 		     * change when \z1 .. \z9 matches or not. */
Karsten Hopp 8f0b65
  		    re_has_z = REX_USE;
Karsten Hopp 8f0b65
  		    break;
Karsten Hopp 8f0b65
  		case '(':
Karsten Hopp 8f0b65
***************
Karsten Hopp 8f0b65
*** 4658,4664 ****
Karsten Hopp 8f0b65
  		    }
Karsten Hopp 8f0b65
  		    else
Karsten Hopp 8f0b65
  		    {
Karsten Hopp 8f0b65
! 			/* skip ofer the matched characters, set character
Karsten Hopp 8f0b65
  			 * count in NFA_SKIP */
Karsten Hopp 8f0b65
  			ll = nextlist;
Karsten Hopp 8f0b65
  			add_state = t->state->out;
Karsten Hopp 8f0b65
--- 4645,4651 ----
Karsten Hopp 8f0b65
  		    }
Karsten Hopp 8f0b65
  		    else
Karsten Hopp 8f0b65
  		    {
Karsten Hopp 8f0b65
! 			/* skip over the matched characters, set character
Karsten Hopp 8f0b65
  			 * count in NFA_SKIP */
Karsten Hopp 8f0b65
  			ll = nextlist;
Karsten Hopp 8f0b65
  			add_state = t->state->out;
Karsten Hopp 8f0b65
*** ../vim-7.3.1110/src/testdir/test36.in	2010-08-15 21:57:29.000000000 +0200
Karsten Hopp 8f0b65
--- src/testdir/test36.in	2013-06-04 17:38:14.000000000 +0200
Karsten Hopp 8f0b65
***************
Karsten Hopp 8f0b65
*** 1,40 ****
Karsten Hopp 8f0b65
! Test character classes in regexp
Karsten Hopp 8f0b65
  
Karsten Hopp 8f0b65
  STARTTEST
Karsten Hopp 8f0b65
! /^start-here
Karsten Hopp 8f0b65
! j:s/\d//g
Karsten Hopp 8f0b65
! j:s/\D//g
Karsten Hopp 8f0b65
! j:s/\o//g
Karsten Hopp 8f0b65
! j:s/\O//g
Karsten Hopp 8f0b65
! j:s/\x//g
Karsten Hopp 8f0b65
! j:s/\X//g
Karsten Hopp 8f0b65
! j:s/\w//g
Karsten Hopp 8f0b65
! j:s/\W//g
Karsten Hopp 8f0b65
! j:s/\h//g
Karsten Hopp 8f0b65
! j:s/\H//g
Karsten Hopp 8f0b65
! j:s/\a//g
Karsten Hopp 8f0b65
! j:s/\A//g
Karsten Hopp 8f0b65
! j:s/\l//g
Karsten Hopp 8f0b65
! j:s/\L//g
Karsten Hopp 8f0b65
! j:s/\u//g
Karsten Hopp 8f0b65
! j:s/\U//g
Karsten Hopp 8f0b65
  :/^start-here/+1,$wq! test.out
Karsten Hopp 8f0b65
  ENDTEST
Karsten Hopp 8f0b65
  
Karsten Hopp 8f0b65
  start-here
Karsten Hopp 8f0b65
  	
 !"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
- 	?
 !"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
- 	?
 !"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
- 	?
 !"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
- 	?
 !"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
- 	?
 !"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
- 	?
 !"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
- 	?
 !"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
- 	?
 !"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
- 	?
 !"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
- 	?
 !"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
- 	?
 !"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
- 	?
 !"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
- 	?
 !"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
- 	?
 !"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
- 	?
 !"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
--- 1,105 ----
Karsten Hopp 8f0b65
! Test character classes in regexp using regexpengine 0, 1, 2.
Karsten Hopp 8f0b65
  
Karsten Hopp 8f0b65
  STARTTEST
Karsten Hopp 8f0b65
! /^start-here/+1
Karsten Hopp 8f0b65
! Y:s/\%#=0\d//g
Karsten Hopp 8f0b65
! p:s/\%#=1\d//g
Karsten Hopp 8f0b65
! p:s/\%#=2\d//g
Karsten Hopp 8f0b65
! p:s/\%#=0[0-9]//g
Karsten Hopp 8f0b65
! p:s/\%#=1[0-9]//g
Karsten Hopp 8f0b65
! p:s/\%#=2[0-9]//g
Karsten Hopp 8f0b65
! p:s/\%#=0\D//g
Karsten Hopp 8f0b65
! p:s/\%#=1\D//g
Karsten Hopp 8f0b65
! p:s/\%#=2\D//g
Karsten Hopp 8f0b65
! p:s/\%#=0[^0-9]//g
Karsten Hopp 8f0b65
! p:s/\%#=1[^0-9]//g
Karsten Hopp 8f0b65
! p:s/\%#=2[^0-9]//g
Karsten Hopp 8f0b65
! p:s/\%#=0\o//g
Karsten Hopp 8f0b65
! p:s/\%#=1\o//g
Karsten Hopp 8f0b65
! p:s/\%#=2\o//g
Karsten Hopp 8f0b65
! p:s/\%#=0[0-7]//g
Karsten Hopp 8f0b65
! p:s/\%#=1[0-7]//g
Karsten Hopp 8f0b65
! p:s/\%#=2[0-7]//g
Karsten Hopp 8f0b65
! p:s/\%#=0\O//g
Karsten Hopp 8f0b65
! p:s/\%#=1\O//g
Karsten Hopp 8f0b65
! p:s/\%#=2\O//g
Karsten Hopp 8f0b65
! p:s/\%#=0[^0-7]//g
Karsten Hopp 8f0b65
! p:s/\%#=1[^0-7]//g
Karsten Hopp 8f0b65
! p:s/\%#=2[^0-7]//g
Karsten Hopp 8f0b65
! p:s/\%#=0\x//g
Karsten Hopp 8f0b65
! p:s/\%#=1\x//g
Karsten Hopp 8f0b65
! p:s/\%#=2\x//g
Karsten Hopp 8f0b65
! p:s/\%#=0[0-9A-Fa-f]//g
Karsten Hopp 8f0b65
! p:s/\%#=1[0-9A-Fa-f]//g
Karsten Hopp 8f0b65
! p:s/\%#=2[0-9A-Fa-f]//g
Karsten Hopp 8f0b65
! p:s/\%#=0\X//g
Karsten Hopp 8f0b65
! p:s/\%#=1\X//g
Karsten Hopp 8f0b65
! p:s/\%#=2\X//g
Karsten Hopp 8f0b65
! p:s/\%#=0[^0-9A-Fa-f]//g
Karsten Hopp 8f0b65
! p:s/\%#=1[^0-9A-Fa-f]//g
Karsten Hopp 8f0b65
! p:s/\%#=2[^0-9A-Fa-f]//g
Karsten Hopp 8f0b65
! p:s/\%#=0\w//g
Karsten Hopp 8f0b65
! p:s/\%#=1\w//g
Karsten Hopp 8f0b65
! p:s/\%#=2\w//g
Karsten Hopp 8f0b65
! p:s/\%#=0[0-9A-Za-z_]//g
Karsten Hopp 8f0b65
! p:s/\%#=1[0-9A-Za-z_]//g
Karsten Hopp 8f0b65
! p:s/\%#=2[0-9A-Za-z_]//g
Karsten Hopp 8f0b65
! p:s/\%#=0\W//g
Karsten Hopp 8f0b65
! p:s/\%#=1\W//g
Karsten Hopp 8f0b65
! p:s/\%#=2\W//g
Karsten Hopp 8f0b65
! p:s/\%#=0[^0-9A-Za-z_]//g
Karsten Hopp 8f0b65
! p:s/\%#=1[^0-9A-Za-z_]//g
Karsten Hopp 8f0b65
! p:s/\%#=2[^0-9A-Za-z_]//g
Karsten Hopp 8f0b65
! p:s/\%#=0\h//g
Karsten Hopp 8f0b65
! p:s/\%#=1\h//g
Karsten Hopp 8f0b65
! p:s/\%#=2\h//g
Karsten Hopp 8f0b65
! p:s/\%#=0[A-Za-z_]//g
Karsten Hopp 8f0b65
! p:s/\%#=1[A-Za-z_]//g
Karsten Hopp 8f0b65
! p:s/\%#=2[A-Za-z_]//g
Karsten Hopp 8f0b65
! p:s/\%#=0\H//g
Karsten Hopp 8f0b65
! p:s/\%#=1\H//g
Karsten Hopp 8f0b65
! p:s/\%#=2\H//g
Karsten Hopp 8f0b65
! p:s/\%#=0[^A-Za-z_]//g
Karsten Hopp 8f0b65
! p:s/\%#=1[^A-Za-z_]//g
Karsten Hopp 8f0b65
! p:s/\%#=2[^A-Za-z_]//g
Karsten Hopp 8f0b65
! p:s/\%#=0\a//g
Karsten Hopp 8f0b65
! p:s/\%#=1\a//g
Karsten Hopp 8f0b65
! p:s/\%#=2\a//g
Karsten Hopp 8f0b65
! p:s/\%#=0[A-Za-z]//g
Karsten Hopp 8f0b65
! p:s/\%#=1[A-Za-z]//g
Karsten Hopp 8f0b65
! p:s/\%#=2[A-Za-z]//g
Karsten Hopp 8f0b65
! p:s/\%#=0\A//g
Karsten Hopp 8f0b65
! p:s/\%#=1\A//g
Karsten Hopp 8f0b65
! p:s/\%#=2\A//g
Karsten Hopp 8f0b65
! p:s/\%#=0[^A-Za-z]//g
Karsten Hopp 8f0b65
! p:s/\%#=1[^A-Za-z]//g
Karsten Hopp 8f0b65
! p:s/\%#=2[^A-Za-z]//g
Karsten Hopp 8f0b65
! p:s/\%#=0\l//g
Karsten Hopp 8f0b65
! p:s/\%#=1\l//g
Karsten Hopp 8f0b65
! p:s/\%#=2\l//g
Karsten Hopp 8f0b65
! p:s/\%#=0[a-z]//g
Karsten Hopp 8f0b65
! p:s/\%#=1[a-z]//g
Karsten Hopp 8f0b65
! p:s/\%#=2[a-z]//g
Karsten Hopp 8f0b65
! p:s/\%#=0\L//g
Karsten Hopp 8f0b65
! p:s/\%#=1\L//g
Karsten Hopp 8f0b65
! p:s/\%#=2\L//g
Karsten Hopp 8f0b65
! p:s/\%#=0[^a-z]//g
Karsten Hopp 8f0b65
! p:s/\%#=1[^a-z]//g
Karsten Hopp 8f0b65
! p:s/\%#=2[^a-z]//g
Karsten Hopp 8f0b65
! p:s/\%#=0\u//g
Karsten Hopp 8f0b65
! p:s/\%#=1\u//g
Karsten Hopp 8f0b65
! p:s/\%#=2\u//g
Karsten Hopp 8f0b65
! p:s/\%#=0[A-Z]//g
Karsten Hopp 8f0b65
! p:s/\%#=1[A-Z]//g
Karsten Hopp 8f0b65
! p:s/\%#=2[A-Z]//g
Karsten Hopp 8f0b65
! p:s/\%#=0\U//g
Karsten Hopp 8f0b65
! p:s/\%#=1\U//g
Karsten Hopp 8f0b65
! p:s/\%#=2\U//g
Karsten Hopp 8f0b65
! p:s/\%#=0[^A-Z]//g
Karsten Hopp 8f0b65
! p:s/\%#=1[^A-Z]//g
Karsten Hopp 8f0b65
! p:s/\%#=2[^A-Z]//g
Karsten Hopp 8f0b65
  :/^start-here/+1,$wq! test.out
Karsten Hopp 8f0b65
  ENDTEST
Karsten Hopp 8f0b65
  
Karsten Hopp 8f0b65
  start-here
Karsten Hopp 8f0b65
  	
 !"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
*** ../vim-7.3.1110/src/testdir/test36.ok	2010-08-15 21:57:29.000000000 +0200
Karsten Hopp 8f0b65
--- src/testdir/test36.ok	2013-06-04 17:38:14.000000000 +0200
Karsten Hopp 8f0b65
***************
Karsten Hopp 8f0b65
*** 1,16 ****
Karsten Hopp 8f0b65
--- 1,96 ----
Karsten Hopp 8f0b65
  	
 !"#$%&'()#+'-./:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 0123456789
Karsten Hopp 8f0b65
+ 0123456789
Karsten Hopp 8f0b65
+ 0123456789
Karsten Hopp 8f0b65
+ 0123456789
Karsten Hopp 8f0b65
+ 0123456789
Karsten Hopp 8f0b65
  0123456789
Karsten Hopp 8f0b65
  	
 !"#$%&'()#+'-./89:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./89:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./89:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./89:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./89:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./89:;<=>?@ABCDEFGHIXYZ[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 01234567
Karsten Hopp 8f0b65
+ 01234567
Karsten Hopp 8f0b65
+ 01234567
Karsten Hopp 8f0b65
+ 01234567
Karsten Hopp 8f0b65
+ 01234567
Karsten Hopp 8f0b65
  01234567
Karsten Hopp 8f0b65
  	
 !"#$%&'()#+'-./:;<=>?@GHIXYZ[\]^_`ghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./:;<=>?@GHIXYZ[\]^_`ghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./:;<=>?@GHIXYZ[\]^_`ghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./:;<=>?@GHIXYZ[\]^_`ghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./:;<=>?@GHIXYZ[\]^_`ghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./:;<=>?@GHIXYZ[\]^_`ghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 0123456789ABCDEFabcdef
Karsten Hopp 8f0b65
+ 0123456789ABCDEFabcdef
Karsten Hopp 8f0b65
+ 0123456789ABCDEFabcdef
Karsten Hopp 8f0b65
+ 0123456789ABCDEFabcdef
Karsten Hopp 8f0b65
+ 0123456789ABCDEFabcdef
Karsten Hopp 8f0b65
  0123456789ABCDEFabcdef
Karsten Hopp 8f0b65
  	
 !"#$%&'()#+'-./:;<=>?@[\]^`{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./:;<=>?@[\]^`{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./:;<=>?@[\]^`{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./:;<=>?@[\]^`{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./:;<=>?@[\]^`{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./:;<=>?@[\]^`{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 0123456789ABCDEFGHIXYZ_abcdefghiwxyz
Karsten Hopp 8f0b65
+ 0123456789ABCDEFGHIXYZ_abcdefghiwxyz
Karsten Hopp 8f0b65
+ 0123456789ABCDEFGHIXYZ_abcdefghiwxyz
Karsten Hopp 8f0b65
+ 0123456789ABCDEFGHIXYZ_abcdefghiwxyz
Karsten Hopp 8f0b65
+ 0123456789ABCDEFGHIXYZ_abcdefghiwxyz
Karsten Hopp 8f0b65
  0123456789ABCDEFGHIXYZ_abcdefghiwxyz
Karsten Hopp 8f0b65
  	
 !"#$%&'()#+'-./0123456789:;<=>?@[\]^`{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./0123456789:;<=>?@[\]^`{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./0123456789:;<=>?@[\]^`{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./0123456789:;<=>?@[\]^`{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./0123456789:;<=>?@[\]^`{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./0123456789:;<=>?@[\]^`{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ ABCDEFGHIXYZ_abcdefghiwxyz
Karsten Hopp 8f0b65
+ ABCDEFGHIXYZ_abcdefghiwxyz
Karsten Hopp 8f0b65
+ ABCDEFGHIXYZ_abcdefghiwxyz
Karsten Hopp 8f0b65
+ ABCDEFGHIXYZ_abcdefghiwxyz
Karsten Hopp 8f0b65
+ ABCDEFGHIXYZ_abcdefghiwxyz
Karsten Hopp 8f0b65
  ABCDEFGHIXYZ_abcdefghiwxyz
Karsten Hopp 8f0b65
  	
 !"#$%&'()#+'-./0123456789:;<=>?@[\]^_`{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./0123456789:;<=>?@[\]^_`{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./0123456789:;<=>?@[\]^_`{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./0123456789:;<=>?@[\]^_`{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./0123456789:;<=>?@[\]^_`{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./0123456789:;<=>?@[\]^_`{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ ABCDEFGHIXYZabcdefghiwxyz
Karsten Hopp 8f0b65
+ ABCDEFGHIXYZabcdefghiwxyz
Karsten Hopp 8f0b65
+ ABCDEFGHIXYZabcdefghiwxyz
Karsten Hopp 8f0b65
+ ABCDEFGHIXYZabcdefghiwxyz
Karsten Hopp 8f0b65
+ ABCDEFGHIXYZabcdefghiwxyz
Karsten Hopp 8f0b65
  ABCDEFGHIXYZabcdefghiwxyz
Karsten Hopp 8f0b65
  	
 !"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./0123456789:;<=>?@ABCDEFGHIXYZ[\]^_`{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ abcdefghiwxyz
Karsten Hopp 8f0b65
+ abcdefghiwxyz
Karsten Hopp 8f0b65
+ abcdefghiwxyz
Karsten Hopp 8f0b65
+ abcdefghiwxyz
Karsten Hopp 8f0b65
+ abcdefghiwxyz
Karsten Hopp 8f0b65
  abcdefghiwxyz
Karsten Hopp 8f0b65
  	
 !"#$%&'()#+'-./0123456789:;<=>?@[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./0123456789:;<=>?@[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./0123456789:;<=>?@[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./0123456789:;<=>?@[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./0123456789:;<=>?@[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ 	?
 !"#$%&'()#+'-./0123456789:;<=>?@[\]^_`abcdefghiwxyz{|}~€‚›¦±¼ÇÓé
Karsten Hopp 8f0b65
+ ABCDEFGHIXYZ
Karsten Hopp 8f0b65
+ ABCDEFGHIXYZ
Karsten Hopp 8f0b65
+ ABCDEFGHIXYZ
Karsten Hopp 8f0b65
+ ABCDEFGHIXYZ
Karsten Hopp 8f0b65
+ ABCDEFGHIXYZ
Karsten Hopp 8f0b65
  ABCDEFGHIXYZ
Karsten Hopp 8f0b65
*** ../vim-7.3.1110/src/version.c	2013-06-04 14:23:00.000000000 +0200
Karsten Hopp 8f0b65
--- src/version.c	2013-06-04 17:42:06.000000000 +0200
Karsten Hopp 8f0b65
***************
Karsten Hopp 8f0b65
*** 730,731 ****
Karsten Hopp 8f0b65
--- 730,733 ----
Karsten Hopp 8f0b65
  {   /* Add new patch number below this line */
Karsten Hopp 8f0b65
+ /**/
Karsten Hopp 8f0b65
+     1111,
Karsten Hopp 8f0b65
  /**/
Karsten Hopp 8f0b65
Karsten Hopp 8f0b65
-- 
Karsten Hopp 8f0b65
Ed's Radiator Shop: The Best Place in Town to Take a Leak.
Karsten Hopp 8f0b65
Karsten Hopp 8f0b65
 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
Karsten Hopp 8f0b65
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
Karsten Hopp 8f0b65
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
Karsten Hopp 8f0b65
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///