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