|
Karsten Hopp |
d27979 |
To: vim_dev@googlegroups.com
|
|
Karsten Hopp |
d27979 |
Subject: Patch 7.3.1138
|
|
Karsten Hopp |
d27979 |
Fcc: outbox
|
|
Karsten Hopp |
d27979 |
From: Bram Moolenaar <Bram@moolenaar.net>
|
|
Karsten Hopp |
d27979 |
Mime-Version: 1.0
|
|
Karsten Hopp |
d27979 |
Content-Type: text/plain; charset=UTF-8
|
|
Karsten Hopp |
d27979 |
Content-Transfer-Encoding: 8bit
|
|
Karsten Hopp |
d27979 |
------------
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
Patch 7.3.1138
|
|
Karsten Hopp |
d27979 |
Problem: New regexp engine: neglist no longer used.
|
|
Karsten Hopp |
d27979 |
Solution: Remove the now unused neglist.
|
|
Karsten Hopp |
d27979 |
Files: src/regexp_nfa.c
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
*** ../vim-7.3.1137/src/regexp_nfa.c 2013-06-07 14:08:24.000000000 +0200
|
|
Karsten Hopp |
d27979 |
--- src/regexp_nfa.c 2013-06-07 14:43:12.000000000 +0200
|
|
Karsten Hopp |
d27979 |
***************
|
|
Karsten Hopp |
d27979 |
*** 4276,4288 ****
|
|
Karsten Hopp |
d27979 |
int flag = 0;
|
|
Karsten Hopp |
d27979 |
int go_to_nextline = FALSE;
|
|
Karsten Hopp |
d27979 |
nfa_thread_T *t;
|
|
Karsten Hopp |
d27979 |
! nfa_list_T list[3];
|
|
Karsten Hopp |
d27979 |
! nfa_list_T *listtbl[2][2];
|
|
Karsten Hopp |
d27979 |
! nfa_list_T *ll;
|
|
Karsten Hopp |
d27979 |
int listidx;
|
|
Karsten Hopp |
d27979 |
nfa_list_T *thislist;
|
|
Karsten Hopp |
d27979 |
nfa_list_T *nextlist;
|
|
Karsten Hopp |
d27979 |
- nfa_list_T *neglist;
|
|
Karsten Hopp |
d27979 |
int *listids = NULL;
|
|
Karsten Hopp |
d27979 |
nfa_state_T *add_state;
|
|
Karsten Hopp |
d27979 |
int add_count;
|
|
Karsten Hopp |
d27979 |
--- 4276,4285 ----
|
|
Karsten Hopp |
d27979 |
int flag = 0;
|
|
Karsten Hopp |
d27979 |
int go_to_nextline = FALSE;
|
|
Karsten Hopp |
d27979 |
nfa_thread_T *t;
|
|
Karsten Hopp |
d27979 |
! nfa_list_T list[2];
|
|
Karsten Hopp |
d27979 |
int listidx;
|
|
Karsten Hopp |
d27979 |
nfa_list_T *thislist;
|
|
Karsten Hopp |
d27979 |
nfa_list_T *nextlist;
|
|
Karsten Hopp |
d27979 |
int *listids = NULL;
|
|
Karsten Hopp |
d27979 |
nfa_state_T *add_state;
|
|
Karsten Hopp |
d27979 |
int add_count;
|
|
Karsten Hopp |
d27979 |
***************
|
|
Karsten Hopp |
d27979 |
*** 4306,4314 ****
|
|
Karsten Hopp |
d27979 |
list[0].len = nstate + 1;
|
|
Karsten Hopp |
d27979 |
list[1].t = (nfa_thread_T *)lalloc(size, TRUE);
|
|
Karsten Hopp |
d27979 |
list[1].len = nstate + 1;
|
|
Karsten Hopp |
d27979 |
! list[2].t = (nfa_thread_T *)lalloc(size, TRUE);
|
|
Karsten Hopp |
d27979 |
! list[2].len = nstate + 1;
|
|
Karsten Hopp |
d27979 |
! if (list[0].t == NULL || list[1].t == NULL || list[2].t == NULL)
|
|
Karsten Hopp |
d27979 |
goto theend;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
#ifdef ENABLE_LOG
|
|
Karsten Hopp |
d27979 |
--- 4303,4309 ----
|
|
Karsten Hopp |
d27979 |
list[0].len = nstate + 1;
|
|
Karsten Hopp |
d27979 |
list[1].t = (nfa_thread_T *)lalloc(size, TRUE);
|
|
Karsten Hopp |
d27979 |
list[1].len = nstate + 1;
|
|
Karsten Hopp |
d27979 |
! if (list[0].t == NULL || list[1].t == NULL)
|
|
Karsten Hopp |
d27979 |
goto theend;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
#ifdef ENABLE_LOG
|
|
Karsten Hopp |
d27979 |
***************
|
|
Karsten Hopp |
d27979 |
*** 4332,4356 ****
|
|
Karsten Hopp |
d27979 |
thislist->n = 0;
|
|
Karsten Hopp |
d27979 |
nextlist = &list[1];
|
|
Karsten Hopp |
d27979 |
nextlist->n = 0;
|
|
Karsten Hopp |
d27979 |
- neglist = &list[2];
|
|
Karsten Hopp |
d27979 |
- neglist->n = 0;
|
|
Karsten Hopp |
d27979 |
#ifdef ENABLE_LOG
|
|
Karsten Hopp |
d27979 |
fprintf(log_fd, "(---) STARTSTATE\n");
|
|
Karsten Hopp |
d27979 |
#endif
|
|
Karsten Hopp |
d27979 |
thislist->id = nfa_listid + 1;
|
|
Karsten Hopp |
d27979 |
addstate(thislist, start, m, 0);
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
! /* There are two cases when the NFA advances: 1. input char matches the
|
|
Karsten Hopp |
d27979 |
! * NFA node and 2. input char does not match the NFA node and the state
|
|
Karsten Hopp |
d27979 |
! * has the negated flag. The following macro calls addstate() according to
|
|
Karsten Hopp |
d27979 |
! * these rules. It is used A LOT, so use the "listtbl" table for speed */
|
|
Karsten Hopp |
d27979 |
! listtbl[0][0] = NULL;
|
|
Karsten Hopp |
d27979 |
! listtbl[0][1] = neglist;
|
|
Karsten Hopp |
d27979 |
! listtbl[1][0] = nextlist;
|
|
Karsten Hopp |
d27979 |
! listtbl[1][1] = NULL;
|
|
Karsten Hopp |
d27979 |
! #define ADD_POS_NEG_STATE(state) \
|
|
Karsten Hopp |
d27979 |
! ll = listtbl[result ? 1 : 0][state->negated]; \
|
|
Karsten Hopp |
d27979 |
! if (ll != NULL) { \
|
|
Karsten Hopp |
d27979 |
add_state = state->out; \
|
|
Karsten Hopp |
d27979 |
add_off = clen; \
|
|
Karsten Hopp |
d27979 |
}
|
|
Karsten Hopp |
d27979 |
--- 4327,4340 ----
|
|
Karsten Hopp |
d27979 |
thislist->n = 0;
|
|
Karsten Hopp |
d27979 |
nextlist = &list[1];
|
|
Karsten Hopp |
d27979 |
nextlist->n = 0;
|
|
Karsten Hopp |
d27979 |
#ifdef ENABLE_LOG
|
|
Karsten Hopp |
d27979 |
fprintf(log_fd, "(---) STARTSTATE\n");
|
|
Karsten Hopp |
d27979 |
#endif
|
|
Karsten Hopp |
d27979 |
thislist->id = nfa_listid + 1;
|
|
Karsten Hopp |
d27979 |
addstate(thislist, start, m, 0);
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
! #define ADD_STATE_IF_MATCH(state) \
|
|
Karsten Hopp |
d27979 |
! if (result) { \
|
|
Karsten Hopp |
d27979 |
add_state = state->out; \
|
|
Karsten Hopp |
d27979 |
add_off = clen; \
|
|
Karsten Hopp |
d27979 |
}
|
|
Karsten Hopp |
d27979 |
***************
|
|
Karsten Hopp |
d27979 |
*** 4385,4395 ****
|
|
Karsten Hopp |
d27979 |
thislist = &list[flag];
|
|
Karsten Hopp |
d27979 |
nextlist = &list[flag ^= 1];
|
|
Karsten Hopp |
d27979 |
nextlist->n = 0; /* clear nextlist */
|
|
Karsten Hopp |
d27979 |
- listtbl[1][0] = nextlist;
|
|
Karsten Hopp |
d27979 |
++nfa_listid;
|
|
Karsten Hopp |
d27979 |
thislist->id = nfa_listid;
|
|
Karsten Hopp |
d27979 |
nextlist->id = nfa_listid + 1;
|
|
Karsten Hopp |
d27979 |
- neglist->id = nfa_listid + 1;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
pimlist.ga_len = 0;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
--- 4369,4377 ----
|
|
Karsten Hopp |
d27979 |
***************
|
|
Karsten Hopp |
d27979 |
*** 4413,4436 ****
|
|
Karsten Hopp |
d27979 |
/*
|
|
Karsten Hopp |
d27979 |
* If the state lists are empty we can stop.
|
|
Karsten Hopp |
d27979 |
*/
|
|
Karsten Hopp |
d27979 |
! if (thislist->n == 0 && neglist->n == 0)
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
/* compute nextlist */
|
|
Karsten Hopp |
d27979 |
! for (listidx = 0; listidx < thislist->n || neglist->n > 0; ++listidx)
|
|
Karsten Hopp |
d27979 |
{
|
|
Karsten Hopp |
d27979 |
! if (neglist->n > 0)
|
|
Karsten Hopp |
d27979 |
! {
|
|
Karsten Hopp |
d27979 |
! t = &neglist->t[0];
|
|
Karsten Hopp |
d27979 |
! neglist->n--;
|
|
Karsten Hopp |
d27979 |
! listidx--;
|
|
Karsten Hopp |
d27979 |
! #ifdef ENABLE_LOG
|
|
Karsten Hopp |
d27979 |
! fprintf(log_fd, " using neglist entry, %d remaining\n",
|
|
Karsten Hopp |
d27979 |
! neglist->n);
|
|
Karsten Hopp |
d27979 |
! #endif
|
|
Karsten Hopp |
d27979 |
! }
|
|
Karsten Hopp |
d27979 |
! else
|
|
Karsten Hopp |
d27979 |
! t = &thislist->t[listidx];
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
#ifdef NFA_REGEXP_DEBUG_LOG
|
|
Karsten Hopp |
d27979 |
nfa_set_code(t->state->c);
|
|
Karsten Hopp |
d27979 |
--- 4395,4407 ----
|
|
Karsten Hopp |
d27979 |
/*
|
|
Karsten Hopp |
d27979 |
* If the state lists are empty we can stop.
|
|
Karsten Hopp |
d27979 |
*/
|
|
Karsten Hopp |
d27979 |
! if (thislist->n == 0)
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
/* compute nextlist */
|
|
Karsten Hopp |
d27979 |
! for (listidx = 0; listidx < thislist->n; ++listidx)
|
|
Karsten Hopp |
d27979 |
{
|
|
Karsten Hopp |
d27979 |
! t = &thislist->t[listidx];
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
#ifdef NFA_REGEXP_DEBUG_LOG
|
|
Karsten Hopp |
d27979 |
nfa_set_code(t->state->c);
|
|
Karsten Hopp |
d27979 |
***************
|
|
Karsten Hopp |
d27979 |
*** 4475,4481 ****
|
|
Karsten Hopp |
d27979 |
* states at this position. When the list of states is going
|
|
Karsten Hopp |
d27979 |
* to be empty quit without advancing, so that "reginput" is
|
|
Karsten Hopp |
d27979 |
* correct. */
|
|
Karsten Hopp |
d27979 |
! if (nextlist->n == 0 && neglist->n == 0)
|
|
Karsten Hopp |
d27979 |
clen = 0;
|
|
Karsten Hopp |
d27979 |
goto nextchar;
|
|
Karsten Hopp |
d27979 |
}
|
|
Karsten Hopp |
d27979 |
--- 4446,4452 ----
|
|
Karsten Hopp |
d27979 |
* states at this position. When the list of states is going
|
|
Karsten Hopp |
d27979 |
* to be empty quit without advancing, so that "reginput" is
|
|
Karsten Hopp |
d27979 |
* correct. */
|
|
Karsten Hopp |
d27979 |
! if (nextlist->n == 0)
|
|
Karsten Hopp |
d27979 |
clen = 0;
|
|
Karsten Hopp |
d27979 |
goto nextchar;
|
|
Karsten Hopp |
d27979 |
}
|
|
Karsten Hopp |
d27979 |
***************
|
|
Karsten Hopp |
d27979 |
*** 4648,4654 ****
|
|
Karsten Hopp |
d27979 |
{
|
|
Karsten Hopp |
d27979 |
/* match current character, output of corresponding
|
|
Karsten Hopp |
d27979 |
* NFA_END_PATTERN to be used at next position. */
|
|
Karsten Hopp |
d27979 |
- ll = nextlist;
|
|
Karsten Hopp |
d27979 |
add_state = t->state->out1->out->out;
|
|
Karsten Hopp |
d27979 |
add_off = clen;
|
|
Karsten Hopp |
d27979 |
}
|
|
Karsten Hopp |
d27979 |
--- 4619,4624 ----
|
|
Karsten Hopp |
d27979 |
***************
|
|
Karsten Hopp |
d27979 |
*** 4656,4662 ****
|
|
Karsten Hopp |
d27979 |
{
|
|
Karsten Hopp |
d27979 |
/* skip over the matched characters, set character
|
|
Karsten Hopp |
d27979 |
* count in NFA_SKIP */
|
|
Karsten Hopp |
d27979 |
- ll = nextlist;
|
|
Karsten Hopp |
d27979 |
add_state = t->state->out1->out;
|
|
Karsten Hopp |
d27979 |
add_off = bytelen;
|
|
Karsten Hopp |
d27979 |
add_count = bytelen - clen;
|
|
Karsten Hopp |
d27979 |
--- 4626,4631 ----
|
|
Karsten Hopp |
d27979 |
***************
|
|
Karsten Hopp |
d27979 |
*** 4821,4827 ****
|
|
Karsten Hopp |
d27979 |
result = FAIL;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
end = t->state->out1; /* NFA_END_COMPOSING */
|
|
Karsten Hopp |
d27979 |
! ADD_POS_NEG_STATE(end);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
}
|
|
Karsten Hopp |
d27979 |
#endif
|
|
Karsten Hopp |
d27979 |
--- 4790,4796 ----
|
|
Karsten Hopp |
d27979 |
result = FAIL;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
end = t->state->out1; /* NFA_END_COMPOSING */
|
|
Karsten Hopp |
d27979 |
! ADD_STATE_IF_MATCH(end);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
}
|
|
Karsten Hopp |
d27979 |
#endif
|
|
Karsten Hopp |
d27979 |
***************
|
|
Karsten Hopp |
d27979 |
*** 4833,4846 ****
|
|
Karsten Hopp |
d27979 |
go_to_nextline = TRUE;
|
|
Karsten Hopp |
d27979 |
/* Pass -1 for the offset, which means taking the position
|
|
Karsten Hopp |
d27979 |
* at the start of the next line. */
|
|
Karsten Hopp |
d27979 |
- ll = nextlist;
|
|
Karsten Hopp |
d27979 |
add_state = t->state->out;
|
|
Karsten Hopp |
d27979 |
add_off = -1;
|
|
Karsten Hopp |
d27979 |
}
|
|
Karsten Hopp |
d27979 |
else if (curc == '\n' && reg_line_lbr)
|
|
Karsten Hopp |
d27979 |
{
|
|
Karsten Hopp |
d27979 |
/* match \n as if it is an ordinary character */
|
|
Karsten Hopp |
d27979 |
- ll = nextlist;
|
|
Karsten Hopp |
d27979 |
add_state = t->state->out;
|
|
Karsten Hopp |
d27979 |
add_off = 1;
|
|
Karsten Hopp |
d27979 |
}
|
|
Karsten Hopp |
d27979 |
--- 4802,4813 ----
|
|
Karsten Hopp |
d27979 |
***************
|
|
Karsten Hopp |
d27979 |
*** 4863,4869 ****
|
|
Karsten Hopp |
d27979 |
case NFA_CLASS_BACKSPACE:
|
|
Karsten Hopp |
d27979 |
case NFA_CLASS_ESCAPE:
|
|
Karsten Hopp |
d27979 |
result = check_char_class(t->state->c, curc);
|
|
Karsten Hopp |
d27979 |
! ADD_POS_NEG_STATE(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_START_COLL:
|
|
Karsten Hopp |
d27979 |
--- 4830,4836 ----
|
|
Karsten Hopp |
d27979 |
case NFA_CLASS_BACKSPACE:
|
|
Karsten Hopp |
d27979 |
case NFA_CLASS_ESCAPE:
|
|
Karsten Hopp |
d27979 |
result = check_char_class(t->state->c, curc);
|
|
Karsten Hopp |
d27979 |
! ADD_STATE_IF_MATCH(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_START_COLL:
|
|
Karsten Hopp |
d27979 |
***************
|
|
Karsten Hopp |
d27979 |
*** 4933,4939 ****
|
|
Karsten Hopp |
d27979 |
{
|
|
Karsten Hopp |
d27979 |
/* next state is in out of the NFA_END_COLL, out1 of
|
|
Karsten Hopp |
d27979 |
* START points to the END state */
|
|
Karsten Hopp |
d27979 |
- ll = nextlist;
|
|
Karsten Hopp |
d27979 |
add_state = t->state->out1->out;
|
|
Karsten Hopp |
d27979 |
add_off = clen;
|
|
Karsten Hopp |
d27979 |
}
|
|
Karsten Hopp |
d27979 |
--- 4900,4905 ----
|
|
Karsten Hopp |
d27979 |
***************
|
|
Karsten Hopp |
d27979 |
*** 4944,4950 ****
|
|
Karsten Hopp |
d27979 |
/* Any char except '\0', (end of input) does not match. */
|
|
Karsten Hopp |
d27979 |
if (curc > 0)
|
|
Karsten Hopp |
d27979 |
{
|
|
Karsten Hopp |
d27979 |
- ll = nextlist;
|
|
Karsten Hopp |
d27979 |
add_state = t->state->out;
|
|
Karsten Hopp |
d27979 |
add_off = clen;
|
|
Karsten Hopp |
d27979 |
}
|
|
Karsten Hopp |
d27979 |
--- 4910,4915 ----
|
|
Karsten Hopp |
d27979 |
***************
|
|
Karsten Hopp |
d27979 |
*** 4955,5087 ****
|
|
Karsten Hopp |
d27979 |
*/
|
|
Karsten Hopp |
d27979 |
case NFA_IDENT: /* \i */
|
|
Karsten Hopp |
d27979 |
result = vim_isIDc(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_POS_NEG_STATE(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_SIDENT: /* \I */
|
|
Karsten Hopp |
d27979 |
result = !VIM_ISDIGIT(curc) && vim_isIDc(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_POS_NEG_STATE(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_KWORD: /* \k */
|
|
Karsten Hopp |
d27979 |
result = vim_iswordp_buf(reginput, reg_buf);
|
|
Karsten Hopp |
d27979 |
! ADD_POS_NEG_STATE(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_SKWORD: /* \K */
|
|
Karsten Hopp |
d27979 |
result = !VIM_ISDIGIT(curc)
|
|
Karsten Hopp |
d27979 |
&& vim_iswordp_buf(reginput, reg_buf);
|
|
Karsten Hopp |
d27979 |
! ADD_POS_NEG_STATE(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_FNAME: /* \f */
|
|
Karsten Hopp |
d27979 |
result = vim_isfilec(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_POS_NEG_STATE(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_SFNAME: /* \F */
|
|
Karsten Hopp |
d27979 |
result = !VIM_ISDIGIT(curc) && vim_isfilec(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_POS_NEG_STATE(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_PRINT: /* \p */
|
|
Karsten Hopp |
d27979 |
result = ptr2cells(reginput) == 1;
|
|
Karsten Hopp |
d27979 |
! ADD_POS_NEG_STATE(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_SPRINT: /* \P */
|
|
Karsten Hopp |
d27979 |
result = !VIM_ISDIGIT(curc) && ptr2cells(reginput) == 1;
|
|
Karsten Hopp |
d27979 |
! ADD_POS_NEG_STATE(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_WHITE: /* \s */
|
|
Karsten Hopp |
d27979 |
result = vim_iswhite(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_POS_NEG_STATE(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_NWHITE: /* \S */
|
|
Karsten Hopp |
d27979 |
result = curc != NUL && !vim_iswhite(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_POS_NEG_STATE(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_DIGIT: /* \d */
|
|
Karsten Hopp |
d27979 |
result = ri_digit(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_POS_NEG_STATE(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_NDIGIT: /* \D */
|
|
Karsten Hopp |
d27979 |
result = curc != NUL && !ri_digit(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_POS_NEG_STATE(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_HEX: /* \x */
|
|
Karsten Hopp |
d27979 |
result = ri_hex(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_POS_NEG_STATE(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_NHEX: /* \X */
|
|
Karsten Hopp |
d27979 |
result = curc != NUL && !ri_hex(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_POS_NEG_STATE(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_OCTAL: /* \o */
|
|
Karsten Hopp |
d27979 |
result = ri_octal(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_POS_NEG_STATE(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_NOCTAL: /* \O */
|
|
Karsten Hopp |
d27979 |
result = curc != NUL && !ri_octal(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_POS_NEG_STATE(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_WORD: /* \w */
|
|
Karsten Hopp |
d27979 |
result = ri_word(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_POS_NEG_STATE(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_NWORD: /* \W */
|
|
Karsten Hopp |
d27979 |
result = curc != NUL && !ri_word(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_POS_NEG_STATE(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_HEAD: /* \h */
|
|
Karsten Hopp |
d27979 |
result = ri_head(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_POS_NEG_STATE(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_NHEAD: /* \H */
|
|
Karsten Hopp |
d27979 |
result = curc != NUL && !ri_head(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_POS_NEG_STATE(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_ALPHA: /* \a */
|
|
Karsten Hopp |
d27979 |
result = ri_alpha(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_POS_NEG_STATE(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_NALPHA: /* \A */
|
|
Karsten Hopp |
d27979 |
result = curc != NUL && !ri_alpha(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_POS_NEG_STATE(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_LOWER: /* \l */
|
|
Karsten Hopp |
d27979 |
result = ri_lower(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_POS_NEG_STATE(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_NLOWER: /* \L */
|
|
Karsten Hopp |
d27979 |
result = curc != NUL && !ri_lower(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_POS_NEG_STATE(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_UPPER: /* \u */
|
|
Karsten Hopp |
d27979 |
result = ri_upper(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_POS_NEG_STATE(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_NUPPER: /* \U */
|
|
Karsten Hopp |
d27979 |
result = curc != NUL && !ri_upper(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_POS_NEG_STATE(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_BACKREF1:
|
|
Karsten Hopp |
d27979 |
--- 4920,5052 ----
|
|
Karsten Hopp |
d27979 |
*/
|
|
Karsten Hopp |
d27979 |
case NFA_IDENT: /* \i */
|
|
Karsten Hopp |
d27979 |
result = vim_isIDc(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_STATE_IF_MATCH(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_SIDENT: /* \I */
|
|
Karsten Hopp |
d27979 |
result = !VIM_ISDIGIT(curc) && vim_isIDc(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_STATE_IF_MATCH(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_KWORD: /* \k */
|
|
Karsten Hopp |
d27979 |
result = vim_iswordp_buf(reginput, reg_buf);
|
|
Karsten Hopp |
d27979 |
! ADD_STATE_IF_MATCH(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_SKWORD: /* \K */
|
|
Karsten Hopp |
d27979 |
result = !VIM_ISDIGIT(curc)
|
|
Karsten Hopp |
d27979 |
&& vim_iswordp_buf(reginput, reg_buf);
|
|
Karsten Hopp |
d27979 |
! ADD_STATE_IF_MATCH(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_FNAME: /* \f */
|
|
Karsten Hopp |
d27979 |
result = vim_isfilec(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_STATE_IF_MATCH(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_SFNAME: /* \F */
|
|
Karsten Hopp |
d27979 |
result = !VIM_ISDIGIT(curc) && vim_isfilec(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_STATE_IF_MATCH(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_PRINT: /* \p */
|
|
Karsten Hopp |
d27979 |
result = ptr2cells(reginput) == 1;
|
|
Karsten Hopp |
d27979 |
! ADD_STATE_IF_MATCH(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_SPRINT: /* \P */
|
|
Karsten Hopp |
d27979 |
result = !VIM_ISDIGIT(curc) && ptr2cells(reginput) == 1;
|
|
Karsten Hopp |
d27979 |
! ADD_STATE_IF_MATCH(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_WHITE: /* \s */
|
|
Karsten Hopp |
d27979 |
result = vim_iswhite(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_STATE_IF_MATCH(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_NWHITE: /* \S */
|
|
Karsten Hopp |
d27979 |
result = curc != NUL && !vim_iswhite(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_STATE_IF_MATCH(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_DIGIT: /* \d */
|
|
Karsten Hopp |
d27979 |
result = ri_digit(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_STATE_IF_MATCH(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_NDIGIT: /* \D */
|
|
Karsten Hopp |
d27979 |
result = curc != NUL && !ri_digit(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_STATE_IF_MATCH(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_HEX: /* \x */
|
|
Karsten Hopp |
d27979 |
result = ri_hex(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_STATE_IF_MATCH(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_NHEX: /* \X */
|
|
Karsten Hopp |
d27979 |
result = curc != NUL && !ri_hex(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_STATE_IF_MATCH(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_OCTAL: /* \o */
|
|
Karsten Hopp |
d27979 |
result = ri_octal(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_STATE_IF_MATCH(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_NOCTAL: /* \O */
|
|
Karsten Hopp |
d27979 |
result = curc != NUL && !ri_octal(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_STATE_IF_MATCH(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_WORD: /* \w */
|
|
Karsten Hopp |
d27979 |
result = ri_word(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_STATE_IF_MATCH(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_NWORD: /* \W */
|
|
Karsten Hopp |
d27979 |
result = curc != NUL && !ri_word(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_STATE_IF_MATCH(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_HEAD: /* \h */
|
|
Karsten Hopp |
d27979 |
result = ri_head(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_STATE_IF_MATCH(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_NHEAD: /* \H */
|
|
Karsten Hopp |
d27979 |
result = curc != NUL && !ri_head(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_STATE_IF_MATCH(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_ALPHA: /* \a */
|
|
Karsten Hopp |
d27979 |
result = ri_alpha(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_STATE_IF_MATCH(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_NALPHA: /* \A */
|
|
Karsten Hopp |
d27979 |
result = curc != NUL && !ri_alpha(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_STATE_IF_MATCH(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_LOWER: /* \l */
|
|
Karsten Hopp |
d27979 |
result = ri_lower(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_STATE_IF_MATCH(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_NLOWER: /* \L */
|
|
Karsten Hopp |
d27979 |
result = curc != NUL && !ri_lower(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_STATE_IF_MATCH(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_UPPER: /* \u */
|
|
Karsten Hopp |
d27979 |
result = ri_upper(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_STATE_IF_MATCH(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_NUPPER: /* \U */
|
|
Karsten Hopp |
d27979 |
result = curc != NUL && !ri_upper(curc);
|
|
Karsten Hopp |
d27979 |
! ADD_STATE_IF_MATCH(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
case NFA_BACKREF1:
|
|
Karsten Hopp |
d27979 |
***************
|
|
Karsten Hopp |
d27979 |
*** 5135,5141 ****
|
|
Karsten Hopp |
d27979 |
{
|
|
Karsten Hopp |
d27979 |
/* match current character, jump ahead to out of
|
|
Karsten Hopp |
d27979 |
* NFA_SKIP */
|
|
Karsten Hopp |
d27979 |
- ll = nextlist;
|
|
Karsten Hopp |
d27979 |
add_state = t->state->out->out;
|
|
Karsten Hopp |
d27979 |
add_off = clen;
|
|
Karsten Hopp |
d27979 |
}
|
|
Karsten Hopp |
d27979 |
--- 5100,5105 ----
|
|
Karsten Hopp |
d27979 |
***************
|
|
Karsten Hopp |
d27979 |
*** 5143,5149 ****
|
|
Karsten Hopp |
d27979 |
{
|
|
Karsten Hopp |
d27979 |
/* skip over the matched characters, set character
|
|
Karsten Hopp |
d27979 |
* count in NFA_SKIP */
|
|
Karsten Hopp |
d27979 |
- ll = nextlist;
|
|
Karsten Hopp |
d27979 |
add_state = t->state->out;
|
|
Karsten Hopp |
d27979 |
add_off = bytelen;
|
|
Karsten Hopp |
d27979 |
add_count = bytelen - clen;
|
|
Karsten Hopp |
d27979 |
--- 5107,5112 ----
|
|
Karsten Hopp |
d27979 |
***************
|
|
Karsten Hopp |
d27979 |
*** 5156,5169 ****
|
|
Karsten Hopp |
d27979 |
if (t->count - clen <= 0)
|
|
Karsten Hopp |
d27979 |
{
|
|
Karsten Hopp |
d27979 |
/* end of match, go to what follows */
|
|
Karsten Hopp |
d27979 |
- ll = nextlist;
|
|
Karsten Hopp |
d27979 |
add_state = t->state->out;
|
|
Karsten Hopp |
d27979 |
add_off = clen;
|
|
Karsten Hopp |
d27979 |
}
|
|
Karsten Hopp |
d27979 |
else
|
|
Karsten Hopp |
d27979 |
{
|
|
Karsten Hopp |
d27979 |
/* add state again with decremented count */
|
|
Karsten Hopp |
d27979 |
- ll = nextlist;
|
|
Karsten Hopp |
d27979 |
add_state = t->state;
|
|
Karsten Hopp |
d27979 |
add_off = 0;
|
|
Karsten Hopp |
d27979 |
add_count = t->count - clen;
|
|
Karsten Hopp |
d27979 |
--- 5119,5130 ----
|
|
Karsten Hopp |
d27979 |
***************
|
|
Karsten Hopp |
d27979 |
*** 5267,5273 ****
|
|
Karsten Hopp |
d27979 |
&& clen != utf_char2len(curc))
|
|
Karsten Hopp |
d27979 |
result = FALSE;
|
|
Karsten Hopp |
d27979 |
#endif
|
|
Karsten Hopp |
d27979 |
! ADD_POS_NEG_STATE(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
}
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
--- 5228,5234 ----
|
|
Karsten Hopp |
d27979 |
&& clen != utf_char2len(curc))
|
|
Karsten Hopp |
d27979 |
result = FALSE;
|
|
Karsten Hopp |
d27979 |
#endif
|
|
Karsten Hopp |
d27979 |
! ADD_STATE_IF_MATCH(t->state);
|
|
Karsten Hopp |
d27979 |
break;
|
|
Karsten Hopp |
d27979 |
}
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
***************
|
|
Karsten Hopp |
d27979 |
*** 5328,5336 ****
|
|
Karsten Hopp |
d27979 |
continue;
|
|
Karsten Hopp |
d27979 |
}
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
! addstate(ll, add_state, &t->subs, add_off);
|
|
Karsten Hopp |
d27979 |
if (add_count > 0)
|
|
Karsten Hopp |
d27979 |
! nextlist->t[ll->n - 1].count = add_count;
|
|
Karsten Hopp |
d27979 |
}
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
} /* for (thislist = thislist; thislist->state; thislist++) */
|
|
Karsten Hopp |
d27979 |
--- 5289,5297 ----
|
|
Karsten Hopp |
d27979 |
continue;
|
|
Karsten Hopp |
d27979 |
}
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
! addstate(nextlist, add_state, &t->subs, add_off);
|
|
Karsten Hopp |
d27979 |
if (add_count > 0)
|
|
Karsten Hopp |
d27979 |
! nextlist->t[nextlist->n - 1].count = add_count;
|
|
Karsten Hopp |
d27979 |
}
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
} /* for (thislist = thislist; thislist->state; thislist++) */
|
|
Karsten Hopp |
d27979 |
***************
|
|
Karsten Hopp |
d27979 |
*** 5396,5405 ****
|
|
Karsten Hopp |
d27979 |
/* Free memory */
|
|
Karsten Hopp |
d27979 |
vim_free(list[0].t);
|
|
Karsten Hopp |
d27979 |
vim_free(list[1].t);
|
|
Karsten Hopp |
d27979 |
- vim_free(list[2].t);
|
|
Karsten Hopp |
d27979 |
vim_free(listids);
|
|
Karsten Hopp |
d27979 |
ga_clear(&pimlist);
|
|
Karsten Hopp |
d27979 |
! #undef ADD_POS_NEG_STATE
|
|
Karsten Hopp |
d27979 |
#ifdef NFA_REGEXP_DEBUG_LOG
|
|
Karsten Hopp |
d27979 |
fclose(debug);
|
|
Karsten Hopp |
d27979 |
#endif
|
|
Karsten Hopp |
d27979 |
--- 5357,5365 ----
|
|
Karsten Hopp |
d27979 |
/* Free memory */
|
|
Karsten Hopp |
d27979 |
vim_free(list[0].t);
|
|
Karsten Hopp |
d27979 |
vim_free(list[1].t);
|
|
Karsten Hopp |
d27979 |
vim_free(listids);
|
|
Karsten Hopp |
d27979 |
ga_clear(&pimlist);
|
|
Karsten Hopp |
d27979 |
! #undef ADD_STATE_IF_MATCH
|
|
Karsten Hopp |
d27979 |
#ifdef NFA_REGEXP_DEBUG_LOG
|
|
Karsten Hopp |
d27979 |
fclose(debug);
|
|
Karsten Hopp |
d27979 |
#endif
|
|
Karsten Hopp |
d27979 |
*** ../vim-7.3.1137/src/version.c 2013-06-07 14:08:24.000000000 +0200
|
|
Karsten Hopp |
d27979 |
--- src/version.c 2013-06-07 14:57:46.000000000 +0200
|
|
Karsten Hopp |
d27979 |
***************
|
|
Karsten Hopp |
d27979 |
*** 730,731 ****
|
|
Karsten Hopp |
d27979 |
--- 730,733 ----
|
|
Karsten Hopp |
d27979 |
{ /* Add new patch number below this line */
|
|
Karsten Hopp |
d27979 |
+ /**/
|
|
Karsten Hopp |
d27979 |
+ 1138,
|
|
Karsten Hopp |
d27979 |
/**/
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
--
|
|
Karsten Hopp |
d27979 |
From "know your smileys":
|
|
Karsten Hopp |
d27979 |
<|-) Chinese
|
|
Karsten Hopp |
d27979 |
<|-( Chinese and doesn't like these kind of jokes
|
|
Karsten Hopp |
d27979 |
|
|
Karsten Hopp |
d27979 |
/// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\
|
|
Karsten Hopp |
d27979 |
/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
|
|
Karsten Hopp |
d27979 |
\\\ an exciting new programming language -- http://www.Zimbu.org ///
|
|
Karsten Hopp |
d27979 |
\\\ help me help AIDS victims -- http://ICCF-Holland.org ///
|