source: project/release/4/agrep/tags/1.1/skeleton.h @ 20320

Last change on this file since 20320 was 20320, checked in by Ivan Raikov, 9 years ago

agrep release 1.1

File size: 2.4 KB
RevLine 
[17899]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
[20318]13#ifndef ulong
14#define ulong unsigned long
15#endif
[17899]16
17static unsigned int FUNCTION_NAME(uint * table, size_t pattern_length,
18                                  uchar * text, size_t length)
19{
20  ulong R0;
21#if NERRS >= 1
22  ulong R1, R0before;
23#endif
24#if NERRS >= 2
25  ulong R2, R1before;
26#endif
27#if NERRS == 3
28  ulong R3, R2before;
29#endif
30  ulong Found, Ssharp;
31#ifdef WHOLE_WORD
32  ulong word_boundary;
33#endif
34
35  Ssharp = table[256];
36  Found = 1UL << pattern_length;
37  R0 = 1;
38#if NERRS >= 1
39  R1 = 3;
40#endif
41#if NERRS >= 2
42  R2 = 7;
43#endif
44#if NERRS == 3
45  R3 = 0xF;
46#endif
47  for (/*nothing*/; length > 0; length--, text++) {
48    ulong S = table[*text];
49#if NERRS >= 1
50    R0before = R0;
51#endif
52#if NERRS >= 2
53    R1before = R1;
54#endif
55#if NERRS == 3
56    R2before = R2;
57#endif
58#ifdef WHOLE_WORD
59    word_boundary = word_constituent[text[0]] ^ word_constituent[text[1]];
60#  define MATCH_EMPTY word_boundary
61#else
62#  define MATCH_EMPTY 1
63#endif
64    R0 = ((R0 & S) << 1) | (R0 & Ssharp) | MATCH_EMPTY;
65#if NERRS >= 1
66    R1 = (((R1 & S) | R0before | R0) << 1) 
67         | R0before
68         | (R1 & Ssharp)
69         | MATCH_EMPTY;
70#endif
71#if NERRS >= 2
72    R2 = (((R2 & S) | R1before | R1) << 1) 
73         | R1before
74         | (R2 & Ssharp)
75         | MATCH_EMPTY;
76#endif
77#if NERRS == 3
78    R3 = (((R3 & S) | R2before | R2) << 1) 
79         | R2before
80         | (R3 & Ssharp)
81         | MATCH_EMPTY;
82#endif
83    if ((R0 & Found) && MATCH_EMPTY) return (0);
84#if NERRS >= 1
85    if ((R1 & Found) && MATCH_EMPTY) return (1);
86#endif
87#if NERRS >= 2
88    if ((R2 & Found) && MATCH_EMPTY) return (2);
89#endif
90#if NERRS == 3
91    if ((R3 & Found) && MATCH_EMPTY) return (3);
92#endif
93  }
94  return (C_WORD_MAX);
95}
96
97#undef MATCH_EMPTY
Note: See TracBrowser for help on using the repository browser.