xref: /aosp_15_r20/external/antlr/runtime/ObjC/Framework/HashRule.m (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
1*16467b97STreehugger Robot//
2*16467b97STreehugger Robot//  HashRule.m
3*16467b97STreehugger Robot//  ANTLR
4*16467b97STreehugger Robot//
5*16467b97STreehugger Robot// Copyright (c) 2010 Alan Condit
6*16467b97STreehugger Robot// All rights reserved.
7*16467b97STreehugger Robot//
8*16467b97STreehugger Robot// Redistribution and use in source and binary forms, with or without
9*16467b97STreehugger Robot// modification, are permitted provided that the following conditions
10*16467b97STreehugger Robot// are met:
11*16467b97STreehugger Robot// 1. Redistributions of source code must retain the above copyright
12*16467b97STreehugger Robot//    notice, this list of conditions and the following disclaimer.
13*16467b97STreehugger Robot// 2. Redistributions in binary form must reproduce the above copyright
14*16467b97STreehugger Robot//    notice, this list of conditions and the following disclaimer in the
15*16467b97STreehugger Robot//    documentation and/or other materials provided with the distribution.
16*16467b97STreehugger Robot// 3. The name of the author may not be used to endorse or promote products
17*16467b97STreehugger Robot//    derived from this software without specific prior written permission.
18*16467b97STreehugger Robot//
19*16467b97STreehugger Robot// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20*16467b97STreehugger Robot// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21*16467b97STreehugger Robot// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22*16467b97STreehugger Robot// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23*16467b97STreehugger Robot// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24*16467b97STreehugger Robot// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25*16467b97STreehugger Robot// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26*16467b97STreehugger Robot// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27*16467b97STreehugger Robot// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28*16467b97STreehugger Robot// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29*16467b97STreehugger Robot
30*16467b97STreehugger Robot#define SUCCESS (0)
31*16467b97STreehugger Robot#define FAILURE (-1)
32*16467b97STreehugger Robot#define ANTLR_MEMO_RULE_UNKNOWN -1
33*16467b97STreehugger Robot
34*16467b97STreehugger Robot#import "HashRule.h"
35*16467b97STreehugger Robot
36*16467b97STreehugger Robot/*
37*16467b97STreehugger Robot * Start of HashRule
38*16467b97STreehugger Robot */
39*16467b97STreehugger Robot@implementation HashRule
40*16467b97STreehugger Robot
41*16467b97STreehugger Robot@synthesize LastHash;
42*16467b97STreehugger Robot
43*16467b97STreehugger Robot+(id)newHashRule
44*16467b97STreehugger Robot{
45*16467b97STreehugger Robot    return [[HashRule alloc] init];
46*16467b97STreehugger Robot}
47*16467b97STreehugger Robot
48*16467b97STreehugger Robot+(id)newHashRuleWithLen:(NSInteger)aBuffSize
49*16467b97STreehugger Robot{
50*16467b97STreehugger Robot    return [[HashRule alloc] initWithLen:aBuffSize];
51*16467b97STreehugger Robot}
52*16467b97STreehugger Robot
53*16467b97STreehugger Robot-(id)init
54*16467b97STreehugger Robot{
55*16467b97STreehugger Robot    self = [super initWithLen:HASHSIZE];
56*16467b97STreehugger Robot    if ( self != nil ) {
57*16467b97STreehugger Robot    }
58*16467b97STreehugger Robot    return( self );
59*16467b97STreehugger Robot}
60*16467b97STreehugger Robot
61*16467b97STreehugger Robot-(id)initWithLen:(NSInteger)aBuffSize
62*16467b97STreehugger Robot{
63*16467b97STreehugger Robot    self = [super initWithLen:aBuffSize];
64*16467b97STreehugger Robot    if ( self != nil ) {
65*16467b97STreehugger Robot        mode = 0;
66*16467b97STreehugger Robot    }
67*16467b97STreehugger Robot    return( self );
68*16467b97STreehugger Robot}
69*16467b97STreehugger Robot
70*16467b97STreehugger Robot-(void)dealloc
71*16467b97STreehugger Robot{
72*16467b97STreehugger Robot#ifdef DEBUG_DEALLOC
73*16467b97STreehugger Robot    NSLog( @"called dealloc in HashRule" );
74*16467b97STreehugger Robot#endif
75*16467b97STreehugger Robot    RuleMemo *tmp, *rtmp;
76*16467b97STreehugger Robot    int Index;
77*16467b97STreehugger Robot
78*16467b97STreehugger Robot    if ( self.fNext != nil ) {
79*16467b97STreehugger Robot        for( Index = 0; Index < BuffSize; Index++ ) {
80*16467b97STreehugger Robot            tmp = ptrBuffer[Index];
81*16467b97STreehugger Robot            while ( tmp && tmp != ptrBuffer[Index] ) {
82*16467b97STreehugger Robot                rtmp = tmp;
83*16467b97STreehugger Robot                if ([tmp isKindOfClass:[LinkBase class]])
84*16467b97STreehugger Robot                    tmp = (RuleMemo *)tmp.fNext;
85*16467b97STreehugger Robot                else
86*16467b97STreehugger Robot                    tmp = nil;
87*16467b97STreehugger Robot                [rtmp release];
88*16467b97STreehugger Robot            }
89*16467b97STreehugger Robot        }
90*16467b97STreehugger Robot    }
91*16467b97STreehugger Robot    [super dealloc];
92*16467b97STreehugger Robot}
93*16467b97STreehugger Robot
94*16467b97STreehugger Robot- (NSInteger)count
95*16467b97STreehugger Robot{
96*16467b97STreehugger Robot    NSInteger aCnt = 0;
97*16467b97STreehugger Robot
98*16467b97STreehugger Robot    for (int i = 0; i < BuffSize; i++) {
99*16467b97STreehugger Robot        if ( ptrBuffer[i] != nil ) {
100*16467b97STreehugger Robot            aCnt++;
101*16467b97STreehugger Robot        }
102*16467b97STreehugger Robot    }
103*16467b97STreehugger Robot    return aCnt;
104*16467b97STreehugger Robot}
105*16467b97STreehugger Robot
106*16467b97STreehugger Robot- (NSInteger) length
107*16467b97STreehugger Robot{
108*16467b97STreehugger Robot    return BuffSize;
109*16467b97STreehugger Robot}
110*16467b97STreehugger Robot
111*16467b97STreehugger Robot- (NSInteger) size
112*16467b97STreehugger Robot{
113*16467b97STreehugger Robot    NSInteger aSize = 0;
114*16467b97STreehugger Robot
115*16467b97STreehugger Robot    for (int i = 0; i < BuffSize; i++) {
116*16467b97STreehugger Robot        if ( ptrBuffer[i] != nil ) {
117*16467b97STreehugger Robot            aSize += sizeof(id);
118*16467b97STreehugger Robot        }
119*16467b97STreehugger Robot    }
120*16467b97STreehugger Robot    return aSize;
121*16467b97STreehugger Robot}
122*16467b97STreehugger Robot
123*16467b97STreehugger Robot
124*16467b97STreehugger Robot-(void)deleteHashRule:(RuleMemo *)np
125*16467b97STreehugger Robot{
126*16467b97STreehugger Robot    RuleMemo *tmp, *rtmp;
127*16467b97STreehugger Robot    int Index;
128*16467b97STreehugger Robot
129*16467b97STreehugger Robot    if ( self.fNext != nil ) {
130*16467b97STreehugger Robot        for( Index = 0; Index < BuffSize; Index++ ) {
131*16467b97STreehugger Robot            tmp = ptrBuffer[Index];
132*16467b97STreehugger Robot            while ( tmp && tmp != ptrBuffer[Index ] ) {
133*16467b97STreehugger Robot                rtmp = tmp;
134*16467b97STreehugger Robot                if ([tmp isKindOfClass:[LinkBase class]])
135*16467b97STreehugger Robot                    tmp = (RuleMemo *)tmp.fNext;
136*16467b97STreehugger Robot                else
137*16467b97STreehugger Robot                    tmp = nil;
138*16467b97STreehugger Robot                [rtmp release];
139*16467b97STreehugger Robot            }
140*16467b97STreehugger Robot        }
141*16467b97STreehugger Robot    }
142*16467b97STreehugger Robot}
143*16467b97STreehugger Robot
144*16467b97STreehugger Robot-(void)delete_chain:(RuleMemo *)np
145*16467b97STreehugger Robot{
146*16467b97STreehugger Robot    if ( np.fNext != nil )
147*16467b97STreehugger Robot        [self delete_chain:np.fNext];
148*16467b97STreehugger Robot    [np release];
149*16467b97STreehugger Robot}
150*16467b97STreehugger Robot
151*16467b97STreehugger Robot-(RuleMemo **)getPtrBuffer
152*16467b97STreehugger Robot{
153*16467b97STreehugger Robot    return( ptrBuffer );
154*16467b97STreehugger Robot}
155*16467b97STreehugger Robot
156*16467b97STreehugger Robot-(void)setPtrBuffer:(RuleMemo **)np
157*16467b97STreehugger Robot{
158*16467b97STreehugger Robot    ptrBuffer = np;
159*16467b97STreehugger Robot}
160*16467b97STreehugger Robot
161*16467b97STreehugger Robot- (ACNumber *)getRuleMemoStopIndex:(NSInteger)aStartIndex
162*16467b97STreehugger Robot{
163*16467b97STreehugger Robot    RuleMemo *aRule;
164*16467b97STreehugger Robot    ACNumber *stopIndex;
165*16467b97STreehugger Robot    NSInteger anIndex;
166*16467b97STreehugger Robot
167*16467b97STreehugger Robot    anIndex = ( aStartIndex >= BuffSize ) ? aStartIndex % BuffSize : aStartIndex;
168*16467b97STreehugger Robot    if ((aRule = ptrBuffer[anIndex]) == nil) {
169*16467b97STreehugger Robot        return nil;
170*16467b97STreehugger Robot    }
171*16467b97STreehugger Robot    stopIndex = [aRule getStopIndex:aStartIndex];
172*16467b97STreehugger Robot    return stopIndex;
173*16467b97STreehugger Robot}
174*16467b97STreehugger Robot
175*16467b97STreehugger Robot- (void)putRuleMemo:(RuleMemo *)aRule AtStartIndex:(NSInteger)aStartIndex
176*16467b97STreehugger Robot{
177*16467b97STreehugger Robot    NSInteger anIndex;
178*16467b97STreehugger Robot
179*16467b97STreehugger Robot    anIndex = (aStartIndex >= BuffSize) ? aStartIndex %= BuffSize : aStartIndex;
180*16467b97STreehugger Robot    if ( ptrBuffer[anIndex] == nil ) {
181*16467b97STreehugger Robot        ptrBuffer[anIndex] = aRule;
182*16467b97STreehugger Robot        [aRule retain];
183*16467b97STreehugger Robot    }
184*16467b97STreehugger Robot    else {
185*16467b97STreehugger Robot        do {
186*16467b97STreehugger Robot            if ( [aRule.startIndex integerValue] == aStartIndex ) {
187*16467b97STreehugger Robot                [aRule setStartIndex:aRule.stopIndex];
188*16467b97STreehugger Robot                return;
189*16467b97STreehugger Robot            }
190*16467b97STreehugger Robot            aRule = aRule.fNext;
191*16467b97STreehugger Robot        } while ( aRule != nil );
192*16467b97STreehugger Robot    }
193*16467b97STreehugger Robot}
194*16467b97STreehugger Robot
195*16467b97STreehugger Robot- (void)putRuleMemoAtStartIndex:(NSInteger)aStartIndex StopIndex:(NSInteger)aStopIndex
196*16467b97STreehugger Robot{
197*16467b97STreehugger Robot    RuleMemo *aRule, *newRule;
198*16467b97STreehugger Robot    NSInteger anIndex;
199*16467b97STreehugger Robot    NSInteger aMatchIndex;
200*16467b97STreehugger Robot
201*16467b97STreehugger Robot    anIndex = (aStartIndex >= BuffSize) ? aStartIndex % BuffSize : aStartIndex;
202*16467b97STreehugger Robot    aRule = ptrBuffer[anIndex];
203*16467b97STreehugger Robot    if ( aRule == nil ) {
204*16467b97STreehugger Robot        aRule = [RuleMemo newRuleMemoWithStartIndex:[ACNumber numberWithInteger:aStartIndex]
205*16467b97STreehugger Robot                                                    StopIndex:[ACNumber numberWithInteger:aStopIndex]];
206*16467b97STreehugger Robot        [aRule retain];
207*16467b97STreehugger Robot        ptrBuffer[anIndex] = aRule;
208*16467b97STreehugger Robot    }
209*16467b97STreehugger Robot    else {
210*16467b97STreehugger Robot        aMatchIndex = [aRule.startIndex integerValue];
211*16467b97STreehugger Robot        if ( aStartIndex > aMatchIndex ) {
212*16467b97STreehugger Robot            if ( aRule != ptrBuffer[anIndex] ) {
213*16467b97STreehugger Robot                [aRule retain];
214*16467b97STreehugger Robot            }
215*16467b97STreehugger Robot            aRule.fNext = ptrBuffer[anIndex];
216*16467b97STreehugger Robot            ptrBuffer[anIndex] = aRule;
217*16467b97STreehugger Robot            return;
218*16467b97STreehugger Robot        }
219*16467b97STreehugger Robot        while (aRule.fNext != nil) {
220*16467b97STreehugger Robot            aMatchIndex = [((RuleMemo *)aRule.fNext).startIndex integerValue];
221*16467b97STreehugger Robot            if ( aStartIndex > aMatchIndex ) {
222*16467b97STreehugger Robot                newRule = [RuleMemo newRuleMemoWithStartIndex:[ACNumber numberWithInteger:aStartIndex]
223*16467b97STreehugger Robot                                                              StopIndex:[ACNumber numberWithInteger:aStopIndex]];
224*16467b97STreehugger Robot                [newRule retain];
225*16467b97STreehugger Robot                newRule.fNext = aRule.fNext;
226*16467b97STreehugger Robot                aRule.fNext = newRule;
227*16467b97STreehugger Robot                return;
228*16467b97STreehugger Robot            }
229*16467b97STreehugger Robot            if ( aMatchIndex == aStartIndex ) {
230*16467b97STreehugger Robot                [aRule setStartIndex:aRule.stopIndex];
231*16467b97STreehugger Robot                return;
232*16467b97STreehugger Robot            }
233*16467b97STreehugger Robot            aRule = aRule.fNext;
234*16467b97STreehugger Robot        }
235*16467b97STreehugger Robot    }
236*16467b97STreehugger Robot}
237*16467b97STreehugger Robot
238*16467b97STreehugger Robot- (NSInteger)getLastHash
239*16467b97STreehugger Robot{
240*16467b97STreehugger Robot    return LastHash;
241*16467b97STreehugger Robot}
242*16467b97STreehugger Robot
243*16467b97STreehugger Robot- (void)setLastHash:(NSInteger)aHash
244*16467b97STreehugger Robot{
245*16467b97STreehugger Robot    LastHash = aHash;
246*16467b97STreehugger Robot}
247*16467b97STreehugger Robot
248*16467b97STreehugger Robot- (NSInteger)getMode
249*16467b97STreehugger Robot{
250*16467b97STreehugger Robot    return mode;
251*16467b97STreehugger Robot}
252*16467b97STreehugger Robot
253*16467b97STreehugger Robot- (void)setMode:(NSInteger)aMode
254*16467b97STreehugger Robot{
255*16467b97STreehugger Robot    mode = aMode;
256*16467b97STreehugger Robot}
257*16467b97STreehugger Robot
258*16467b97STreehugger Robot- (void) insertObject:(RuleMemo *)aRule atIndex:(NSInteger)anIndex
259*16467b97STreehugger Robot{
260*16467b97STreehugger Robot    NSInteger Index;
261*16467b97STreehugger Robot
262*16467b97STreehugger Robot    Index = ( anIndex >= BuffSize ) ? anIndex % BuffSize : anIndex;
263*16467b97STreehugger Robot    if (aRule != ptrBuffer[Index]) {
264*16467b97STreehugger Robot        if ( ptrBuffer[Index] ) [ptrBuffer[Index] release];
265*16467b97STreehugger Robot        [aRule retain];
266*16467b97STreehugger Robot    }
267*16467b97STreehugger Robot    ptrBuffer[Index] = aRule;
268*16467b97STreehugger Robot}
269*16467b97STreehugger Robot
270*16467b97STreehugger Robot- (RuleMemo *)objectAtIndex:(NSInteger)anIndex
271*16467b97STreehugger Robot{
272*16467b97STreehugger Robot    NSInteger anIdx;
273*16467b97STreehugger Robot
274*16467b97STreehugger Robot    anIdx = ( anIndex >= BuffSize ) ? anIndex % BuffSize : anIndex;
275*16467b97STreehugger Robot    return ptrBuffer[anIdx];
276*16467b97STreehugger Robot}
277*16467b97STreehugger Robot
278*16467b97STreehugger Robot
279*16467b97STreehugger Robot@end
280