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