1*16467b97STreehugger Robot// 2*16467b97STreehugger Robot// ANTLRReaderStream.m 3*16467b97STreehugger Robot// ANTLR 4*16467b97STreehugger Robot// 5*16467b97STreehugger Robot// Created by Alan Condit on 2/21/11. 6*16467b97STreehugger Robot// Copyright 2011 Alan's MachineWorks. All rights reserved. 7*16467b97STreehugger Robot// 8*16467b97STreehugger Robot 9*16467b97STreehugger Robot#import "ANTLRReaderStream.h" 10*16467b97STreehugger Robot#import "ACNumber.h" 11*16467b97STreehugger Robot 12*16467b97STreehugger Robot@implementation ANTLRReaderStream 13*16467b97STreehugger Robot 14*16467b97STreehugger Robot@synthesize is; 15*16467b97STreehugger Robot@synthesize size; 16*16467b97STreehugger Robot@synthesize rbSize; 17*16467b97STreehugger Robot 18*16467b97STreehugger Robotstatic NSInteger READ_BUFFER_SIZE = 1024; 19*16467b97STreehugger Robotstatic NSInteger INITIAL_BUFFER_SIZE = 1024; 20*16467b97STreehugger Robot 21*16467b97STreehugger Robot+ (NSInteger) READ_BUFFER_SIZE 22*16467b97STreehugger Robot{ 23*16467b97STreehugger Robot return READ_BUFFER_SIZE; 24*16467b97STreehugger Robot} 25*16467b97STreehugger Robot 26*16467b97STreehugger Robot+ (NSInteger) INITIAL_BUFFER_SIZE 27*16467b97STreehugger Robot{ 28*16467b97STreehugger Robot return INITIAL_BUFFER_SIZE; 29*16467b97STreehugger Robot} 30*16467b97STreehugger Robot 31*16467b97STreehugger Robot+ (id) newANTLRReaderStream 32*16467b97STreehugger Robot{ 33*16467b97STreehugger Robot return [[ANTLRReaderStream alloc] init]; 34*16467b97STreehugger Robot} 35*16467b97STreehugger Robot 36*16467b97STreehugger Robot+ (id) newANTLRReaderStream:(NSInputStream *)r 37*16467b97STreehugger Robot{ 38*16467b97STreehugger Robot return [[ANTLRReaderStream alloc] initWithReader:r size:INITIAL_BUFFER_SIZE readBufferSize:READ_BUFFER_SIZE]; 39*16467b97STreehugger Robot} 40*16467b97STreehugger Robot 41*16467b97STreehugger Robot+ (id) newANTLRReaderStream:(NSInputStream *)r size:(NSInteger)aSize 42*16467b97STreehugger Robot{ 43*16467b97STreehugger Robot return [[ANTLRReaderStream alloc] initWithReader:r size:aSize readBufferSize:READ_BUFFER_SIZE]; 44*16467b97STreehugger Robot} 45*16467b97STreehugger Robot 46*16467b97STreehugger Robot+ (id) newANTLRReaderStream:(NSInputStream *)r size:(NSInteger)aSize readBufferSize:(NSInteger)aReadChunkSize 47*16467b97STreehugger Robot{ 48*16467b97STreehugger Robot// load(r, aSize, aReadChunkSize); 49*16467b97STreehugger Robot return [[ANTLRReaderStream alloc] initWithReader:r size:aSize readBufferSize:aReadChunkSize]; 50*16467b97STreehugger Robot} 51*16467b97STreehugger Robot 52*16467b97STreehugger Robot- (id) init 53*16467b97STreehugger Robot{ 54*16467b97STreehugger Robot self = [super init]; 55*16467b97STreehugger Robot if ( self != nil ) { 56*16467b97STreehugger Robot int p1 = n; // init from ANTLRStringStream val 57*16467b97STreehugger Robot is = nil; 58*16467b97STreehugger Robot rbSize = READ_BUFFER_SIZE; 59*16467b97STreehugger Robot size = INITIAL_BUFFER_SIZE; 60*16467b97STreehugger Robot } 61*16467b97STreehugger Robot return self; 62*16467b97STreehugger Robot} 63*16467b97STreehugger Robot 64*16467b97STreehugger Robot- (id) initWithReader:(NSInputStream *)r size:(NSInteger)aSize readBufferSize:(NSInteger)aReadChunkSize 65*16467b97STreehugger Robot{ 66*16467b97STreehugger Robot self = [super init]; 67*16467b97STreehugger Robot if ( self != nil ) { 68*16467b97STreehugger Robot int p1 = n; // init from ANTLRStringStream val 69*16467b97STreehugger Robot is = r; 70*16467b97STreehugger Robot rbSize = aSize; 71*16467b97STreehugger Robot size = aReadChunkSize; 72*16467b97STreehugger Robot [is open]; 73*16467b97STreehugger Robot// [self setUpStreamForFile]; 74*16467b97STreehugger Robot if ( [is hasBytesAvailable] ) { 75*16467b97STreehugger Robot [self load:aSize readBufferSize:aReadChunkSize]; 76*16467b97STreehugger Robot } 77*16467b97STreehugger Robot } 78*16467b97STreehugger Robot return self; 79*16467b97STreehugger Robot} 80*16467b97STreehugger Robot 81*16467b97STreehugger Robot- (void) load:(NSInteger)aSize readBufferSize:(NSInteger)aReadChunkSize 82*16467b97STreehugger Robot{ 83*16467b97STreehugger Robot NSMutableData *retData = nil; 84*16467b97STreehugger Robot uint8_t buf[1024]; 85*16467b97STreehugger Robot if ( is==nil ) { 86*16467b97STreehugger Robot return; 87*16467b97STreehugger Robot } 88*16467b97STreehugger Robot if ( aSize<=0 ) { 89*16467b97STreehugger Robot aSize = INITIAL_BUFFER_SIZE; 90*16467b97STreehugger Robot } 91*16467b97STreehugger Robot if ( aReadChunkSize<=0 ) { 92*16467b97STreehugger Robot aReadChunkSize = READ_BUFFER_SIZE; 93*16467b97STreehugger Robot } 94*16467b97STreehugger Robot#pragma mark fix these NSLog calls 95*16467b97STreehugger Robot @try { 96*16467b97STreehugger Robot int numRead=0; 97*16467b97STreehugger Robot numRead = [is read:buf maxLength:aReadChunkSize]; 98*16467b97STreehugger Robot retData = [NSMutableData dataWithCapacity:numRead]; 99*16467b97STreehugger Robot [retData appendBytes:(const void *)buf length:numRead]; 100*16467b97STreehugger Robot NSLog( @"read %d chars; p was %d is now %d", n, p1, (p1+numRead) ); 101*16467b97STreehugger Robot p1 += numRead; 102*16467b97STreehugger Robot n = p1; 103*16467b97STreehugger Robot data = [[NSString alloc] initWithData:retData encoding:NSASCIIStringEncoding]; 104*16467b97STreehugger Robot NSLog( @"n=%d\n", n ); 105*16467b97STreehugger Robot } 106*16467b97STreehugger Robot @finally { 107*16467b97STreehugger Robot [self close]; 108*16467b97STreehugger Robot } 109*16467b97STreehugger Robot} 110*16467b97STreehugger Robot 111*16467b97STreehugger Robot- (void)setUpStreamForFile 112*16467b97STreehugger Robot{ 113*16467b97STreehugger Robot // iStream is NSInputStream instance variable 114*16467b97STreehugger Robot// if ( is == nil ) 115*16467b97STreehugger Robot// is = [[NSInputStream alloc] initWithFileAtPath:path]; 116*16467b97STreehugger Robot [is setDelegate:self]; 117*16467b97STreehugger Robot [is scheduleInRunLoop:[NSRunLoop currentRunLoop] 118*16467b97STreehugger Robot forMode:NSDefaultRunLoopMode]; 119*16467b97STreehugger Robot [is open]; 120*16467b97STreehugger Robot} 121*16467b97STreehugger Robot 122*16467b97STreehugger Robot- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode 123*16467b97STreehugger Robot{ 124*16467b97STreehugger Robot NSMutableData *myData = nil; 125*16467b97STreehugger Robot ACNumber *bytesRead = [ACNumber numberWithInteger:0]; 126*16467b97STreehugger Robot uint8_t buf[1024]; 127*16467b97STreehugger Robot switch(eventCode) { 128*16467b97STreehugger Robot case NSStreamEventHasBytesAvailable: 129*16467b97STreehugger Robot { 130*16467b97STreehugger Robot if(!myData) { 131*16467b97STreehugger Robot myData = [[NSMutableData data] retain]; 132*16467b97STreehugger Robot } 133*16467b97STreehugger Robot unsigned int len = 0; 134*16467b97STreehugger Robot len = [(NSInputStream *)stream read:buf maxLength:1024]; 135*16467b97STreehugger Robot if(len) { 136*16467b97STreehugger Robot [myData appendBytes:(const void *)buf length:len]; 137*16467b97STreehugger Robot // bytesRead is an instance variable of type ACNumber. 138*16467b97STreehugger Robot bytesRead = [ACNumber numberWithInteger:[bytesRead integerValue]+len]; 139*16467b97STreehugger Robot data = [[NSString alloc] initWithData:myData encoding:NSASCIIStringEncoding]; 140*16467b97STreehugger Robot } else { 141*16467b97STreehugger Robot NSLog(@"no buffer!"); 142*16467b97STreehugger Robot } 143*16467b97STreehugger Robot break; 144*16467b97STreehugger Robot } 145*16467b97STreehugger Robot case NSStreamEventEndEncountered: 146*16467b97STreehugger Robot { 147*16467b97STreehugger Robot [stream close]; 148*16467b97STreehugger Robot [stream removeFromRunLoop:[NSRunLoop currentRunLoop] 149*16467b97STreehugger Robot forMode:NSDefaultRunLoopMode]; 150*16467b97STreehugger Robot [stream release]; 151*16467b97STreehugger Robot stream = nil; // stream is ivar, so reinit it 152*16467b97STreehugger Robot break; 153*16467b97STreehugger Robot } 154*16467b97STreehugger Robot // continued 155*16467b97STreehugger Robot } 156*16467b97STreehugger Robot} 157*16467b97STreehugger Robot 158*16467b97STreehugger Robot- (void) close 159*16467b97STreehugger Robot{ 160*16467b97STreehugger Robot [is close]; 161*16467b97STreehugger Robot is = nil; 162*16467b97STreehugger Robot} 163*16467b97STreehugger Robot 164*16467b97STreehugger Robot@end 165