diff options
Diffstat (limited to 'antlr-3.4/runtime/ObjC/Framework/ANTLRReaderStream.m')
-rw-r--r-- | antlr-3.4/runtime/ObjC/Framework/ANTLRReaderStream.m | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/antlr-3.4/runtime/ObjC/Framework/ANTLRReaderStream.m b/antlr-3.4/runtime/ObjC/Framework/ANTLRReaderStream.m new file mode 100644 index 0000000..a71b827 --- /dev/null +++ b/antlr-3.4/runtime/ObjC/Framework/ANTLRReaderStream.m @@ -0,0 +1,153 @@ +// +// ANTLRReaderStream.m +// ANTLR +// +// Created by Alan Condit on 2/21/11. +// Copyright 2011 Alan's MachineWorks. All rights reserved. +// + +#import "ANTLRReaderStream.h" + + +@implementation ANTLRReaderStream + +@synthesize fh; +@synthesize size; +@synthesize rbSize; + +static NSInteger READ_BUFFER_SIZE = 1024; +static NSInteger INITIAL_BUFFER_SIZE = 1024; + ++ (NSInteger) READ_BUFFER_SIZE +{ + return READ_BUFFER_SIZE; +} + ++ (NSInteger) INITIAL_BUFFER_SIZE +{ + return INITIAL_BUFFER_SIZE; +} + ++ (id) newANTLRReaderStream +{ + return [[ANTLRReaderStream alloc] init]; +} + ++ (id) newANTLRReaderStream:(NSFileHandle *)r +{ + return [[ANTLRReaderStream alloc] initWithReader:r size:INITIAL_BUFFER_SIZE readBufferSize:READ_BUFFER_SIZE]; +} + ++ (id) newANTLRReaderStream:(NSFileHandle *)r size:(NSInteger)aSize +{ + return [[ANTLRReaderStream alloc] initWithReader:r size:aSize readBufferSize:READ_BUFFER_SIZE]; +} + ++ (id) newANTLRReaderStream:(NSFileHandle *)r size:(NSInteger)aSize readBufferSize:(NSInteger)aReadChunkSize +{ +// load(r, aSize, aReadChunkSize); + return [[ANTLRReaderStream alloc] initWithReader:r size:aSize readBufferSize:aReadChunkSize]; +} + +- (id) init +{ + self = [super init]; + if ( self != nil ) { + fh = nil; + rbSize = READ_BUFFER_SIZE; + size = INITIAL_BUFFER_SIZE; + } + return self; +} + +- (id) initWithReader:(NSFileHandle *)r size:(NSInteger)aSize readBufferSize:(NSInteger)aReadChunkSize +{ + self = [super init]; + if ( self != nil ) { + fh = r; + rbSize = aSize; + size = aReadChunkSize; + [self load:aSize readBufferSize:aReadChunkSize]; + } + return self; +} + +- (void) load:(NSInteger)aSize readBufferSize:(NSInteger)aReadChunkSize +{ + NSData *retData = nil; + if ( fh==nil ) { + return; + } + if ( aSize<=0 ) { + aSize = INITIAL_BUFFER_SIZE; + } + if ( aReadChunkSize<=0 ) { + aReadChunkSize = READ_BUFFER_SIZE; + } +#pragma mark fix these NSLog calls + @try { + int numRead=0; + int p1 = 0; + retData = [fh readDataToEndOfFile]; + numRead = [retData length]; + NSLog( @"read %d chars; p was %d is now %d", n, p1, (p1+numRead) ); + p1 += numRead; + n = p1; + data = [[NSString alloc] initWithData:retData encoding:NSASCIIStringEncoding]; + NSLog( @"n=%d", n ); + } + @finally { + [fh closeFile]; + } +} + +- (void)setUpStreamForFile:(NSString *)path { + // iStream is NSInputStream instance variable + NSInputStream *iStream = [[NSInputStream alloc] initWithFileAtPath:path]; +// [iStream setDelegate:self]; + [iStream scheduleInRunLoop:[NSRunLoop currentRunLoop] + forMode:NSDefaultRunLoopMode]; + [iStream open]; +} + +- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode +{ + NSMutableData *myData = nil; + NSNumber *bytesRead = [NSNumber numberWithInteger:0]; + switch(eventCode) { + case NSStreamEventHasBytesAvailable: + { + if(!myData) { + myData = [[NSMutableData data] retain]; + } + uint8_t buf[1024]; + unsigned int len = 0; + len = [(NSInputStream *)stream read:buf maxLength:1024]; + if(len) { + [myData appendBytes:(const void *)buf length:len]; + // bytesRead is an instance variable of type NSNumber. + bytesRead = [NSNumber numberWithInteger:[bytesRead intValue]+len]; + } else { + NSLog(@"no buffer!"); + } + break; + } + case NSStreamEventEndEncountered: + { + [stream close]; + [stream removeFromRunLoop:[NSRunLoop currentRunLoop] + forMode:NSDefaultRunLoopMode]; + [stream release]; + stream = nil; // stream is ivar, so reinit it + break; + } + // continued + } +} + +- (void) close +{ + [fh closeFile]; +} + +@end |