home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Shareware BBS: 5 Edit
/
05-Edit.zip
/
NOTEPAD2.ZIP
/
NPKMP.C
< prev
next >
Wrap
C/C++ Source or Header
|
1989-02-08
|
2KB
|
72 lines
/***************************************************************************\
* npkmp.c - notepad Knuth-Morris-Pratt pattern matching
*
* Created by Microsoft Corporation, 1989
\***************************************************************************/
#define INCL_WIN
#include <os2.h>
#include <stdio.h>
#include <string.h>
#include <opendlg.h>
#include "notepad.h"
#include "npkmp.h"
/************* PROCEDURE DECLARATIONS */
VOID KMPCompileKey(char str[], PCOMPILEDKEY pck)
{
STATE i,j;
pck->key[0] = ' ';
lstrcpy(&(pck->key[1]),str);
pck->fail[0] = 0;
pck->fail[1] = 0;
for (j = 2; pck->key[j]; j++) {
i = pck->fail[j-1];
while ((pck->key[j] != pck->key[i+1]) && (i > 0))
i = pck->fail[i];
if ((pck->key[j] != pck->key[i+1]) && (i == 0))
pck->fail[j] = 0;
else
pck->fail[j] = i+1;
}
pck->final = j-1;
}
static STATE delta(STATE j, char b, PCOMPILEDKEY pck)
{
if (b == pck->key[j+1])
return j+1;
else if (j == 0)
return 0;
else
return delta(pck->fail[j], b, pck);
}
BOOL KMPMatchKey(PFNNEXT next, PCOMPILEDKEY pck, PULONG pcChar)
{
STATE j;
ULONG pos;
char c;
pos = 0;
j = 0;
do {
c = next();
j = delta(j,c,pck);
pos++;
} while ((c) && (j != pck->final));
if (j == pck->final) {
*pcChar = pos;
return TRUE;
} else {
*pcChar = 0;
return FALSE;
}
}