- item = j = NULL;
- nitem = 0;
- for(i = allitems; i; i=i->next)
- if(!plen || !strncmp(pattern, i->text, plen)) {
- if(!j)
- item = i;
- else
- j->right = i;
- i->left = j;
- i->right = NULL;
- j = i;
- nitem++;
+ item = lexact = lprefix = lsubstr = itemend = exactend = prefixend = substrend = NULL;
+ for(i = allitems; i; i = i->next)
+ if(!fstrncmp(pattern, i->text, plen + 1))
+ appenditem(i, &lexact, &exactend);
+ else if(!fstrncmp(pattern, i->text, plen))
+ appenditem(i, &lprefix, &prefixend);
+ else if(fstrstr(i->text, pattern))
+ appenditem(i, &lsubstr, &substrend);
+ if(lexact) {
+ item = lexact;
+ itemend = exactend;
+ }
+ if(lprefix) {
+ if(itemend) {
+ itemend->right = lprefix;
+ lprefix->left = itemend;