1*16467b97STreehugger Robot// 2*16467b97STreehugger Robot// PtrBuffer.m 3*16467b97STreehugger Robot// ANTLR 4*16467b97STreehugger Robot// 5*16467b97STreehugger Robot// Created by Alan Condit on 6/9/10. 6*16467b97STreehugger Robot// [The "BSD licence"] 7*16467b97STreehugger Robot// Copyright (c) 2010 Alan Condit 8*16467b97STreehugger Robot// All rights reserved. 9*16467b97STreehugger Robot// 10*16467b97STreehugger Robot// Redistribution and use in source and binary forms, with or without 11*16467b97STreehugger Robot// modification, are permitted provided that the following conditions 12*16467b97STreehugger Robot// are met: 13*16467b97STreehugger Robot// 1. Redistributions of source code must retain the above copyright 14*16467b97STreehugger Robot// notice, this list of conditions and the following disclaimer. 15*16467b97STreehugger Robot// 2. Redistributions in binary form must reproduce the above copyright 16*16467b97STreehugger Robot// notice, this list of conditions and the following disclaimer in the 17*16467b97STreehugger Robot// documentation and/or other materials provided with the distribution. 18*16467b97STreehugger Robot// 3. The name of the author may not be used to endorse or promote products 19*16467b97STreehugger Robot// derived from this software without specific prior written permission. 20*16467b97STreehugger Robot// 21*16467b97STreehugger Robot// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 22*16467b97STreehugger Robot// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 23*16467b97STreehugger Robot// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 24*16467b97STreehugger Robot// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 25*16467b97STreehugger Robot// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 26*16467b97STreehugger Robot// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 27*16467b97STreehugger Robot// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 28*16467b97STreehugger Robot// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 29*16467b97STreehugger Robot// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 30*16467b97STreehugger Robot// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 31*16467b97STreehugger Robot 32*16467b97STreehugger Robot#define SUCCESS (0) 33*16467b97STreehugger Robot#define FAILURE (-1) 34*16467b97STreehugger Robot 35*16467b97STreehugger Robot#import "PtrBuffer.h" 36*16467b97STreehugger Robot#import "Tree.h" 37*16467b97STreehugger Robot 38*16467b97STreehugger Robot/* 39*16467b97STreehugger Robot * Start of PtrBuffer 40*16467b97STreehugger Robot */ 41*16467b97STreehugger Robot@implementation PtrBuffer 42*16467b97STreehugger Robot 43*16467b97STreehugger Robot@synthesize BuffSize; 44*16467b97STreehugger Robot@synthesize buffer; 45*16467b97STreehugger Robot@synthesize ptrBuffer; 46*16467b97STreehugger Robot@synthesize count; 47*16467b97STreehugger Robot@synthesize ptr; 48*16467b97STreehugger Robot 49*16467b97STreehugger Robot+(PtrBuffer *)newPtrBuffer 50*16467b97STreehugger Robot{ 51*16467b97STreehugger Robot return [[PtrBuffer alloc] init]; 52*16467b97STreehugger Robot} 53*16467b97STreehugger Robot 54*16467b97STreehugger Robot+(PtrBuffer *)newPtrBufferWithLen:(NSInteger)cnt 55*16467b97STreehugger Robot{ 56*16467b97STreehugger Robot return [[PtrBuffer alloc] initWithLen:cnt]; 57*16467b97STreehugger Robot} 58*16467b97STreehugger Robot 59*16467b97STreehugger Robot-(id)init 60*16467b97STreehugger Robot{ 61*16467b97STreehugger Robot NSUInteger idx; 62*16467b97STreehugger Robot 63*16467b97STreehugger Robot self = [super init]; 64*16467b97STreehugger Robot if ( self != nil ) { 65*16467b97STreehugger Robot BuffSize = BUFFSIZE; 66*16467b97STreehugger Robot ptr = 0; 67*16467b97STreehugger Robot buffer = [[NSMutableData dataWithLength:(NSUInteger)BuffSize * sizeof(id)] retain]; 68*16467b97STreehugger Robot ptrBuffer = (id *) [buffer mutableBytes]; 69*16467b97STreehugger Robot for( idx = 0; idx < BuffSize; idx++ ) { 70*16467b97STreehugger Robot ptrBuffer[idx] = nil; 71*16467b97STreehugger Robot } 72*16467b97STreehugger Robot count = 0; 73*16467b97STreehugger Robot } 74*16467b97STreehugger Robot return( self ); 75*16467b97STreehugger Robot} 76*16467b97STreehugger Robot 77*16467b97STreehugger Robot-(id)initWithLen:(NSUInteger)cnt 78*16467b97STreehugger Robot{ 79*16467b97STreehugger Robot NSUInteger idx; 80*16467b97STreehugger Robot 81*16467b97STreehugger Robot self = [super init]; 82*16467b97STreehugger Robot if ( self != nil ) { 83*16467b97STreehugger Robot BuffSize = cnt; 84*16467b97STreehugger Robot ptr = 0; 85*16467b97STreehugger Robot buffer = [[NSMutableData dataWithLength:(NSUInteger)BuffSize * sizeof(id)] retain]; 86*16467b97STreehugger Robot ptrBuffer = (id *)[buffer mutableBytes]; 87*16467b97STreehugger Robot for( idx = 0; idx < BuffSize; idx++ ) { 88*16467b97STreehugger Robot ptrBuffer[idx] = nil; 89*16467b97STreehugger Robot } 90*16467b97STreehugger Robot count = 0; 91*16467b97STreehugger Robot } 92*16467b97STreehugger Robot return( self ); 93*16467b97STreehugger Robot} 94*16467b97STreehugger Robot 95*16467b97STreehugger Robot-(void)dealloc 96*16467b97STreehugger Robot{ 97*16467b97STreehugger Robot#ifdef DEBUG_DEALLOC 98*16467b97STreehugger Robot NSLog( @"called dealloc in PtrBuffer" ); 99*16467b97STreehugger Robot#endif 100*16467b97STreehugger Robot LinkBase *tmp, *rtmp; 101*16467b97STreehugger Robot NSInteger idx; 102*16467b97STreehugger Robot 103*16467b97STreehugger Robot if ( self.fNext != nil ) { 104*16467b97STreehugger Robot for( idx = 0; idx < BuffSize; idx++ ) { 105*16467b97STreehugger Robot tmp = ptrBuffer[idx]; 106*16467b97STreehugger Robot while ( tmp ) { 107*16467b97STreehugger Robot rtmp = tmp; 108*16467b97STreehugger Robot if ([tmp isKindOfClass:[LinkBase class]]) 109*16467b97STreehugger Robot tmp = (id)tmp.fNext; 110*16467b97STreehugger Robot else 111*16467b97STreehugger Robot tmp = nil; 112*16467b97STreehugger Robot [rtmp release]; 113*16467b97STreehugger Robot } 114*16467b97STreehugger Robot } 115*16467b97STreehugger Robot } 116*16467b97STreehugger Robot [buffer release]; 117*16467b97STreehugger Robot [super dealloc]; 118*16467b97STreehugger Robot} 119*16467b97STreehugger Robot 120*16467b97STreehugger Robot- (id) copyWithZone:(NSZone *)aZone 121*16467b97STreehugger Robot{ 122*16467b97STreehugger Robot PtrBuffer *copy; 123*16467b97STreehugger Robot 124*16467b97STreehugger Robot copy = [[[self class] allocWithZone:aZone] init]; 125*16467b97STreehugger Robot if ( buffer ) 126*16467b97STreehugger Robot copy.buffer = [buffer copyWithZone:aZone]; 127*16467b97STreehugger Robot copy.ptrBuffer = ptrBuffer; 128*16467b97STreehugger Robot copy.ptr = ptr; 129*16467b97STreehugger Robot return copy; 130*16467b97STreehugger Robot} 131*16467b97STreehugger Robot 132*16467b97STreehugger Robot- (void)clear 133*16467b97STreehugger Robot{ 134*16467b97STreehugger Robot LinkBase *tmp, *rtmp; 135*16467b97STreehugger Robot NSInteger idx; 136*16467b97STreehugger Robot 137*16467b97STreehugger Robot for( idx = 0; idx < BuffSize; idx++ ) { 138*16467b97STreehugger Robot tmp = ptrBuffer[idx]; 139*16467b97STreehugger Robot while ( tmp ) { 140*16467b97STreehugger Robot rtmp = tmp; 141*16467b97STreehugger Robot if ([tmp isKindOfClass:[LinkBase class]]) 142*16467b97STreehugger Robot tmp = (id)tmp.fNext; 143*16467b97STreehugger Robot else 144*16467b97STreehugger Robot tmp = nil; 145*16467b97STreehugger Robot [rtmp dealloc]; 146*16467b97STreehugger Robot } 147*16467b97STreehugger Robot ptrBuffer[idx] = nil; 148*16467b97STreehugger Robot } 149*16467b97STreehugger Robot count = 0; 150*16467b97STreehugger Robot} 151*16467b97STreehugger Robot 152*16467b97STreehugger Robot- (NSMutableData *)getBuffer 153*16467b97STreehugger Robot{ 154*16467b97STreehugger Robot return( buffer ); 155*16467b97STreehugger Robot} 156*16467b97STreehugger Robot 157*16467b97STreehugger Robot- (void)setBuffer:(NSMutableData *)np 158*16467b97STreehugger Robot{ 159*16467b97STreehugger Robot buffer = np; 160*16467b97STreehugger Robot} 161*16467b97STreehugger Robot 162*16467b97STreehugger Robot- (NSUInteger)getCount 163*16467b97STreehugger Robot{ 164*16467b97STreehugger Robot return( count ); 165*16467b97STreehugger Robot} 166*16467b97STreehugger Robot 167*16467b97STreehugger Robot- (void)setCount:(NSUInteger)aCount 168*16467b97STreehugger Robot{ 169*16467b97STreehugger Robot count = aCount; 170*16467b97STreehugger Robot} 171*16467b97STreehugger Robot 172*16467b97STreehugger Robot- (id *)getPtrBuffer 173*16467b97STreehugger Robot{ 174*16467b97STreehugger Robot return( ptrBuffer ); 175*16467b97STreehugger Robot} 176*16467b97STreehugger Robot 177*16467b97STreehugger Robot- (void)setPtrBuffer:(id *)np 178*16467b97STreehugger Robot{ 179*16467b97STreehugger Robot ptrBuffer = np; 180*16467b97STreehugger Robot} 181*16467b97STreehugger Robot 182*16467b97STreehugger Robot- (NSUInteger)getPtr 183*16467b97STreehugger Robot{ 184*16467b97STreehugger Robot return( ptr ); 185*16467b97STreehugger Robot} 186*16467b97STreehugger Robot 187*16467b97STreehugger Robot- (void)setPtr:(NSUInteger)aPtr 188*16467b97STreehugger Robot{ 189*16467b97STreehugger Robot ptr = aPtr; 190*16467b97STreehugger Robot} 191*16467b97STreehugger Robot 192*16467b97STreehugger Robot- (void) addObject:(id) v 193*16467b97STreehugger Robot{ 194*16467b97STreehugger Robot [self ensureCapacity:ptr]; 195*16467b97STreehugger Robot if ( v ) [v retain]; 196*16467b97STreehugger Robot ptrBuffer[ptr++] = v; 197*16467b97STreehugger Robot count++; 198*16467b97STreehugger Robot} 199*16467b97STreehugger Robot 200*16467b97STreehugger Robot- (void) push:(id) v 201*16467b97STreehugger Robot{ 202*16467b97STreehugger Robot if ( ptr >= BuffSize - 1 ) { 203*16467b97STreehugger Robot [self ensureCapacity:ptr]; 204*16467b97STreehugger Robot } 205*16467b97STreehugger Robot if ( v ) [v retain]; 206*16467b97STreehugger Robot ptrBuffer[ptr++] = v; 207*16467b97STreehugger Robot count++; 208*16467b97STreehugger Robot} 209*16467b97STreehugger Robot 210*16467b97STreehugger Robot- (id) pop 211*16467b97STreehugger Robot{ 212*16467b97STreehugger Robot id v = nil; 213*16467b97STreehugger Robot if ( ptr > 0 ) { 214*16467b97STreehugger Robot v = ptrBuffer[--ptr]; 215*16467b97STreehugger Robot ptrBuffer[ptr] = nil; 216*16467b97STreehugger Robot } 217*16467b97STreehugger Robot count--; 218*16467b97STreehugger Robot if ( v ) [v release]; 219*16467b97STreehugger Robot return v; 220*16467b97STreehugger Robot} 221*16467b97STreehugger Robot 222*16467b97STreehugger Robot- (id) peek 223*16467b97STreehugger Robot{ 224*16467b97STreehugger Robot id v = nil; 225*16467b97STreehugger Robot if ( ptr > 0 ) { 226*16467b97STreehugger Robot v = ptrBuffer[ptr-1]; 227*16467b97STreehugger Robot } 228*16467b97STreehugger Robot return v; 229*16467b97STreehugger Robot} 230*16467b97STreehugger Robot 231*16467b97STreehugger Robot- (NSUInteger)count 232*16467b97STreehugger Robot{ 233*16467b97STreehugger Robot#ifdef DONTUSENOMO 234*16467b97STreehugger Robot int cnt = 0; 235*16467b97STreehugger Robot 236*16467b97STreehugger Robot for (NSInteger i = 0; i < BuffSize; i++ ) { 237*16467b97STreehugger Robot if ( ptrBuffer[i] != nil ) { 238*16467b97STreehugger Robot cnt++; 239*16467b97STreehugger Robot } 240*16467b97STreehugger Robot } 241*16467b97STreehugger Robot if ( cnt != count ) count = cnt; 242*16467b97STreehugger Robot#endif 243*16467b97STreehugger Robot return count; 244*16467b97STreehugger Robot} 245*16467b97STreehugger Robot 246*16467b97STreehugger Robot- (NSUInteger)length 247*16467b97STreehugger Robot{ 248*16467b97STreehugger Robot return BuffSize; 249*16467b97STreehugger Robot} 250*16467b97STreehugger Robot 251*16467b97STreehugger Robot- (NSUInteger)size 252*16467b97STreehugger Robot{ 253*16467b97STreehugger Robot NSUInteger aSize = 0; 254*16467b97STreehugger Robot for (int i = 0; i < BuffSize; i++ ) { 255*16467b97STreehugger Robot if (ptrBuffer[i] != nil) { 256*16467b97STreehugger Robot aSize += sizeof(id); 257*16467b97STreehugger Robot } 258*16467b97STreehugger Robot } 259*16467b97STreehugger Robot return aSize; 260*16467b97STreehugger Robot} 261*16467b97STreehugger Robot 262*16467b97STreehugger Robot- (void) insertObject:(id)aRule atIndex:(NSUInteger)idx 263*16467b97STreehugger Robot{ 264*16467b97STreehugger Robot if ( idx >= BuffSize ) { 265*16467b97STreehugger Robot [self ensureCapacity:idx]; 266*16467b97STreehugger Robot } 267*16467b97STreehugger Robot if ( aRule != ptrBuffer[idx] ) { 268*16467b97STreehugger Robot if ( ptrBuffer[idx] ) [ptrBuffer[idx] release]; 269*16467b97STreehugger Robot if ( aRule ) [aRule retain]; 270*16467b97STreehugger Robot } 271*16467b97STreehugger Robot ptrBuffer[idx] = aRule; 272*16467b97STreehugger Robot count++; 273*16467b97STreehugger Robot} 274*16467b97STreehugger Robot 275*16467b97STreehugger Robot- (id)objectAtIndex:(NSUInteger)idx 276*16467b97STreehugger Robot{ 277*16467b97STreehugger Robot if ( idx < BuffSize ) { 278*16467b97STreehugger Robot return ptrBuffer[idx]; 279*16467b97STreehugger Robot } 280*16467b97STreehugger Robot return nil; 281*16467b97STreehugger Robot} 282*16467b97STreehugger Robot 283*16467b97STreehugger Robot- (void)addObjectsFromArray:(PtrBuffer *)anArray 284*16467b97STreehugger Robot{ 285*16467b97STreehugger Robot NSInteger cnt, i; 286*16467b97STreehugger Robot cnt = [anArray count]; 287*16467b97STreehugger Robot for( i = 0; i < cnt; i++) { 288*16467b97STreehugger Robot id tmp = [anArray objectAtIndex:i]; 289*16467b97STreehugger Robot if ( tmp ) [tmp retain]; 290*16467b97STreehugger Robot [self insertObject:tmp atIndex:i]; 291*16467b97STreehugger Robot } 292*16467b97STreehugger Robot count += cnt; 293*16467b97STreehugger Robot return; 294*16467b97STreehugger Robot} 295*16467b97STreehugger Robot 296*16467b97STreehugger Robot- (void)removeAllObjects 297*16467b97STreehugger Robot{ 298*16467b97STreehugger Robot int i; 299*16467b97STreehugger Robot for ( i = 0; i < BuffSize; i++ ) { 300*16467b97STreehugger Robot if ( ptrBuffer[i] ) [ptrBuffer[i] release]; 301*16467b97STreehugger Robot ptrBuffer[i] = nil; 302*16467b97STreehugger Robot } 303*16467b97STreehugger Robot count = 0; 304*16467b97STreehugger Robot ptr = 0; 305*16467b97STreehugger Robot} 306*16467b97STreehugger Robot 307*16467b97STreehugger Robot- (void)removeObjectAtIndex:(NSInteger)idx 308*16467b97STreehugger Robot{ 309*16467b97STreehugger Robot int i; 310*16467b97STreehugger Robot if ( idx >= 0 && idx < count ) { 311*16467b97STreehugger Robot if ( ptrBuffer[idx] ) [ptrBuffer[idx] release]; 312*16467b97STreehugger Robot for ( i = idx; i < count-1; i++ ) { 313*16467b97STreehugger Robot ptrBuffer[i] = ptrBuffer[i+1]; 314*16467b97STreehugger Robot } 315*16467b97STreehugger Robot ptrBuffer[i] = nil; 316*16467b97STreehugger Robot count--; 317*16467b97STreehugger Robot } 318*16467b97STreehugger Robot} 319*16467b97STreehugger Robot 320*16467b97STreehugger Robot- (void) ensureCapacity:(NSUInteger) anIndex 321*16467b97STreehugger Robot{ 322*16467b97STreehugger Robot if ((anIndex * sizeof(id)) >= [buffer length]) 323*16467b97STreehugger Robot { 324*16467b97STreehugger Robot NSInteger newSize = ([buffer length] / sizeof(id)) * 2; 325*16467b97STreehugger Robot if (anIndex > newSize) { 326*16467b97STreehugger Robot newSize = anIndex + 1; 327*16467b97STreehugger Robot } 328*16467b97STreehugger Robot BuffSize = newSize; 329*16467b97STreehugger Robot [buffer setLength:(BuffSize * sizeof(id))]; 330*16467b97STreehugger Robot ptrBuffer = [buffer mutableBytes]; 331*16467b97STreehugger Robot } 332*16467b97STreehugger Robot} 333*16467b97STreehugger Robot 334*16467b97STreehugger Robot- (NSString *) description 335*16467b97STreehugger Robot{ 336*16467b97STreehugger Robot NSMutableString *str; 337*16467b97STreehugger Robot NSInteger idx, cnt; 338*16467b97STreehugger Robot cnt = [self count]; 339*16467b97STreehugger Robot str = [NSMutableString stringWithCapacity:30]; 340*16467b97STreehugger Robot [str appendString:@"["]; 341*16467b97STreehugger Robot for (idx = 0; idx < cnt; idx++ ) { 342*16467b97STreehugger Robot [str appendString:[[self objectAtIndex:idx] description]]; 343*16467b97STreehugger Robot } 344*16467b97STreehugger Robot [str appendString:@"]"]; 345*16467b97STreehugger Robot return str; 346*16467b97STreehugger Robot} 347*16467b97STreehugger Robot 348*16467b97STreehugger Robot- (NSString *) toString 349*16467b97STreehugger Robot{ 350*16467b97STreehugger Robot return [self description]; 351*16467b97STreehugger Robot} 352*16467b97STreehugger Robot 353*16467b97STreehugger Robot@end 354