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