1*16467b97STreehugger Robot// 2*16467b97STreehugger Robot// PtrStack.m 3*16467b97STreehugger Robot// ANTLR 4*16467b97STreehugger Robot// 5*16467b97STreehugger Robot// Created by Alan Condit on 6/9/10. 6*16467b97STreehugger Robot// Copyright 2010 Alan's MachineWorks. All rights reserved. 7*16467b97STreehugger Robot// 8*16467b97STreehugger Robot#define SUCCESS (0) 9*16467b97STreehugger Robot#define FAILURE (-1) 10*16467b97STreehugger Robot 11*16467b97STreehugger Robot#import "PtrStack.h" 12*16467b97STreehugger Robot#import "Tree.h" 13*16467b97STreehugger Robot 14*16467b97STreehugger Robot/* 15*16467b97STreehugger Robot * Start of PtrStack 16*16467b97STreehugger Robot */ 17*16467b97STreehugger Robot@implementation PtrStack 18*16467b97STreehugger Robot 19*16467b97STreehugger Robot+(PtrStack *)newPtrStack 20*16467b97STreehugger Robot{ 21*16467b97STreehugger Robot return [[PtrStack alloc] init]; 22*16467b97STreehugger Robot} 23*16467b97STreehugger Robot 24*16467b97STreehugger Robot+(PtrStack *)newPtrStack:(NSInteger)cnt 25*16467b97STreehugger Robot{ 26*16467b97STreehugger Robot return [[PtrStack alloc] initWithLen:cnt]; 27*16467b97STreehugger Robot} 28*16467b97STreehugger Robot 29*16467b97STreehugger Robot-(id)init 30*16467b97STreehugger Robot{ 31*16467b97STreehugger Robot self = [super initWithLen:HASHSIZE]; 32*16467b97STreehugger Robot if ( self != nil ) { 33*16467b97STreehugger Robot } 34*16467b97STreehugger Robot return( self ); 35*16467b97STreehugger Robot} 36*16467b97STreehugger Robot 37*16467b97STreehugger Robot-(id)initWithLen:(NSInteger)cnt 38*16467b97STreehugger Robot{ 39*16467b97STreehugger Robot self = [super initWithLen:cnt]; 40*16467b97STreehugger Robot if ( self != nil ) { 41*16467b97STreehugger Robot } 42*16467b97STreehugger Robot return( self ); 43*16467b97STreehugger Robot} 44*16467b97STreehugger Robot 45*16467b97STreehugger Robot-(void)dealloc 46*16467b97STreehugger Robot{ 47*16467b97STreehugger Robot#ifdef DEBUG_DEALLOC 48*16467b97STreehugger Robot NSLog( @"called dealloc in PtrStack" ); 49*16467b97STreehugger Robot#endif 50*16467b97STreehugger Robot [super dealloc]; 51*16467b97STreehugger Robot} 52*16467b97STreehugger Robot 53*16467b97STreehugger Robot-(void)deletePtrStack:(PtrStack *)np 54*16467b97STreehugger Robot{ 55*16467b97STreehugger Robot LinkBase *tmp, *rtmp; 56*16467b97STreehugger Robot NSInteger idx; 57*16467b97STreehugger Robot 58*16467b97STreehugger Robot if ( self.fNext != nil ) { 59*16467b97STreehugger Robot for( idx = 0; idx < BuffSize; idx++ ) { 60*16467b97STreehugger Robot tmp = ptrBuffer[idx]; 61*16467b97STreehugger Robot while ( tmp ) { 62*16467b97STreehugger Robot rtmp = tmp; 63*16467b97STreehugger Robot tmp = [tmp getfNext]; 64*16467b97STreehugger Robot [rtmp release]; 65*16467b97STreehugger Robot } 66*16467b97STreehugger Robot } 67*16467b97STreehugger Robot } 68*16467b97STreehugger Robot} 69*16467b97STreehugger Robot 70*16467b97STreehugger Robot#ifdef DONTUSENOMO 71*16467b97STreehugger Robot#ifdef USERDOC 72*16467b97STreehugger Robot/* 73*16467b97STreehugger Robot * HASH hash entry to get index to table 74*16467b97STreehugger Robot * NSInteger hash( PtrStack *self, char *s ); 75*16467b97STreehugger Robot * 76*16467b97STreehugger Robot * Inputs: NSString *s string to find 77*16467b97STreehugger Robot * 78*16467b97STreehugger Robot * Returns: NSInteger hashed value 79*16467b97STreehugger Robot * 80*16467b97STreehugger Robot * Last Revision 9/03/90 81*16467b97STreehugger Robot */ 82*16467b97STreehugger Robot#endif 83*16467b97STreehugger Robot-(NSInteger)hash:(NSString *)s /* form hash value for string s */ 84*16467b97STreehugger Robot{ 85*16467b97STreehugger Robot NSInteger hashval; 86*16467b97STreehugger Robot const char *tmp; 87*16467b97STreehugger Robot 88*16467b97STreehugger Robot tmp = [s cStringUsingEncoding:NSASCIIStringEncoding]; 89*16467b97STreehugger Robot for( hashval = 0; *tmp != '\0'; ) 90*16467b97STreehugger Robot hashval += *tmp++; 91*16467b97STreehugger Robot LastHash = hashval % HashSize; 92*16467b97STreehugger Robot return( LastHash ); 93*16467b97STreehugger Robot} 94*16467b97STreehugger Robot 95*16467b97STreehugger Robot#ifdef USERDOC 96*16467b97STreehugger Robot/* 97*16467b97STreehugger Robot * LOOKUP search hashed list for entry 98*16467b97STreehugger Robot * id lookup:(NSString *)s; 99*16467b97STreehugger Robot * 100*16467b97STreehugger Robot * Inputs: NSString *s string to find 101*16467b97STreehugger Robot * 102*16467b97STreehugger Robot * Returns: RuleMemo * pointer to entry 103*16467b97STreehugger Robot * 104*16467b97STreehugger Robot * Last Revision 9/03/90 105*16467b97STreehugger Robot */ 106*16467b97STreehugger Robot#endif 107*16467b97STreehugger Robot-(id)lookup:(NSString *)s 108*16467b97STreehugger Robot{ 109*16467b97STreehugger Robot LinkBase *np; 110*16467b97STreehugger Robot 111*16467b97STreehugger Robot for( np = ptrBuffer[[self hash:s]]; np != nil; np = [np getfNext] ) { 112*16467b97STreehugger Robot if ( [s isEqualToString:[np getName]] ) { 113*16467b97STreehugger Robot return( np ); /* found it */ 114*16467b97STreehugger Robot } 115*16467b97STreehugger Robot } 116*16467b97STreehugger Robot return( nil ); /* not found */ 117*16467b97STreehugger Robot} 118*16467b97STreehugger Robot 119*16467b97STreehugger Robot#ifdef USERDOC 120*16467b97STreehugger Robot/* 121*16467b97STreehugger Robot * INSTALL search hashed list for entry 122*16467b97STreehugger Robot * NSInteger install( PtrStack *self, id sym ); 123*16467b97STreehugger Robot * 124*16467b97STreehugger Robot * Inputs: RuleMemo *sym -- symbol ptr to install 125*16467b97STreehugger Robot * NSInteger scope -- level to find 126*16467b97STreehugger Robot * 127*16467b97STreehugger Robot * Returns: Boolean TRUE if installed 128*16467b97STreehugger Robot * FALSE if already in table 129*16467b97STreehugger Robot * 130*16467b97STreehugger Robot * Last Revision 9/03/90 131*16467b97STreehugger Robot */ 132*16467b97STreehugger Robot#endif 133*16467b97STreehugger Robot-(id)install:(id)sym 134*16467b97STreehugger Robot{ 135*16467b97STreehugger Robot LinkBase *np; 136*16467b97STreehugger Robot 137*16467b97STreehugger Robot np = [self lookup:[sym getName]]; 138*16467b97STreehugger Robot if ( np == nil ) { 139*16467b97STreehugger Robot [sym setFNext:ptrBuffer[ LastHash ]]; 140*16467b97STreehugger Robot ptrBuffer[ LastHash ] = [sym retain]; 141*16467b97STreehugger Robot return( ptrBuffer[ LastHash ] ); 142*16467b97STreehugger Robot } 143*16467b97STreehugger Robot return( nil ); /* not found */ 144*16467b97STreehugger Robot} 145*16467b97STreehugger Robot#endif 146*16467b97STreehugger Robot 147*16467b97STreehugger Robot-(id)getptrBufferEntry:(NSInteger)idx 148*16467b97STreehugger Robot{ 149*16467b97STreehugger Robot return( ptrBuffer[idx] ); 150*16467b97STreehugger Robot} 151*16467b97STreehugger Robot 152*16467b97STreehugger Robot-(id *)getptrBuffer 153*16467b97STreehugger Robot{ 154*16467b97STreehugger Robot return( ptrBuffer ); 155*16467b97STreehugger Robot} 156*16467b97STreehugger Robot 157*16467b97STreehugger Robot-(void)setptrBuffer:(id *)np 158*16467b97STreehugger Robot{ 159*16467b97STreehugger Robot ptrBuffer = np; 160*16467b97STreehugger Robot} 161*16467b97STreehugger Robot 162*16467b97STreehugger Robot#ifdef DONTUSENOMO 163*16467b97STreehugger Robot/* 164*16467b97STreehugger Robot * works only for maplist indexed not by name but by TokenNumber 165*16467b97STreehugger Robot */ 166*16467b97STreehugger Robot- (id)getName:(NSInteger)ttype 167*16467b97STreehugger Robot{ 168*16467b97STreehugger Robot id np; 169*16467b97STreehugger Robot NSInteger aTType; 170*16467b97STreehugger Robot 171*16467b97STreehugger Robot aTType = ttype % HashSize; 172*16467b97STreehugger Robot for( np = ptrBuffer[ttype]; np != nil; np = [np getfNext] ) { 173*16467b97STreehugger Robot if ( np.index == ttype ) { 174*16467b97STreehugger Robot return( np ); /* found it */ 175*16467b97STreehugger Robot } 176*16467b97STreehugger Robot } 177*16467b97STreehugger Robot return( nil ); /* not found */ 178*16467b97STreehugger Robot} 179*16467b97STreehugger Robot 180*16467b97STreehugger Robot- (id)getTType:(NSString *)name 181*16467b97STreehugger Robot{ 182*16467b97STreehugger Robot return [self lookup:name]; 183*16467b97STreehugger Robot} 184*16467b97STreehugger Robot#endif 185*16467b97STreehugger Robot 186*16467b97STreehugger Robot- (id) copyWithZone:(NSZone *)aZone 187*16467b97STreehugger Robot{ 188*16467b97STreehugger Robot return [super copyWithZone:aZone]; 189*16467b97STreehugger Robot} 190*16467b97STreehugger Robot 191*16467b97STreehugger Robot@end 192