source: project/release/4/agrep/trunk/skeleton.h @ 17899

Last change on this file since 17899 was 17899, checked in by Ivan Raikov, 10 years ago

initial import of approximate grep library

File size: 2.5 KB
Line 
1/***********************************************************************/
2/*                                                                     */
3/*            The "agrep" library for Objective Caml                   */
4/*                                                                     */
5/*         Xavier Leroy, projet Cristal, INRIA Rocquencourt            */
6/*                                                                     */
7/*  Copyright 2002 Institut National de Recherche en Informatique et   */
8/*  en Automatique.  All rights reserved.  This file is distributed    */
9/*  under the terms of the GNU Library General Public License.         */
10/*                                                                     */
11/***********************************************************************/
12
13/* $Id: skeleton.h,v 1.2 2002/02/02 09:29:02 xleroy Exp $ */
14
15static unsigned int FUNCTION_NAME(uint * table, size_t pattern_length,
16                                  uchar * text, size_t length)
17{
18  ulong R0;
19#if NERRS >= 1
20  ulong R1, R0before;
21#endif
22#if NERRS >= 2
23  ulong R2, R1before;
24#endif
25#if NERRS == 3
26  ulong R3, R2before;
27#endif
28  ulong Found, Ssharp;
29#ifdef WHOLE_WORD
30  ulong word_boundary;
31#endif
32
33  Ssharp = table[256];
34  Found = 1UL << pattern_length;
35  R0 = 1;
36#if NERRS >= 1
37  R1 = 3;
38#endif
39#if NERRS >= 2
40  R2 = 7;
41#endif
42#if NERRS == 3
43  R3 = 0xF;
44#endif
45  for (/*nothing*/; length > 0; length--, text++) {
46    ulong S = table[*text];
47#if NERRS >= 1
48    R0before = R0;
49#endif
50#if NERRS >= 2
51    R1before = R1;
52#endif
53#if NERRS == 3
54    R2before = R2;
55#endif
56#ifdef WHOLE_WORD
57    word_boundary = word_constituent[text[0]] ^ word_constituent[text[1]];
58#  define MATCH_EMPTY word_boundary
59#else
60#  define MATCH_EMPTY 1
61#endif
62    R0 = ((R0 & S) << 1) | (R0 & Ssharp) | MATCH_EMPTY;
63#if NERRS >= 1
64    R1 = (((R1 & S) | R0before | R0) << 1) 
65         | R0before
66         | (R1 & Ssharp)
67         | MATCH_EMPTY;
68#endif
69#if NERRS >= 2
70    R2 = (((R2 & S) | R1before | R1) << 1) 
71         | R1before
72         | (R2 & Ssharp)
73         | MATCH_EMPTY;
74#endif
75#if NERRS == 3
76    R3 = (((R3 & S) | R2before | R2) << 1) 
77         | R2before
78         | (R3 & Ssharp)
79         | MATCH_EMPTY;
80#endif
81    if ((R0 & Found) && MATCH_EMPTY) return (0);
82#if NERRS >= 1
83    if ((R1 & Found) && MATCH_EMPTY) return (1);
84#endif
85#if NERRS >= 2
86    if ((R2 & Found) && MATCH_EMPTY) return (2);
87#endif
88#if NERRS == 3
89    if ((R3 & Found) && MATCH_EMPTY) return (3);
90#endif
91  }
92  return (C_WORD_MAX);
93}
94
95#undef MATCH_EMPTY
Note: See TracBrowser for help on using the repository browser.