You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
165 lines
4.3 KiB
165 lines
4.3 KiB
//
|
|
// ANTLRReaderStream.m
|
|
// ANTLR
|
|
//
|
|
// Created by Alan Condit on 2/21/11.
|
|
// Copyright 2011 Alan's MachineWorks. All rights reserved.
|
|
//
|
|
|
|
#import "ANTLRReaderStream.h"
|
|
#import "ACNumber.h"
|
|
|
|
@implementation ANTLRReaderStream
|
|
|
|
@synthesize is;
|
|
@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:(NSInputStream *)r
|
|
{
|
|
return [[ANTLRReaderStream alloc] initWithReader:r size:INITIAL_BUFFER_SIZE readBufferSize:READ_BUFFER_SIZE];
|
|
}
|
|
|
|
+ (id) newANTLRReaderStream:(NSInputStream *)r size:(NSInteger)aSize
|
|
{
|
|
return [[ANTLRReaderStream alloc] initWithReader:r size:aSize readBufferSize:READ_BUFFER_SIZE];
|
|
}
|
|
|
|
+ (id) newANTLRReaderStream:(NSInputStream *)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 ) {
|
|
int p1 = n; // init from ANTLRStringStream val
|
|
is = nil;
|
|
rbSize = READ_BUFFER_SIZE;
|
|
size = INITIAL_BUFFER_SIZE;
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (id) initWithReader:(NSInputStream *)r size:(NSInteger)aSize readBufferSize:(NSInteger)aReadChunkSize
|
|
{
|
|
self = [super init];
|
|
if ( self != nil ) {
|
|
int p1 = n; // init from ANTLRStringStream val
|
|
is = r;
|
|
rbSize = aSize;
|
|
size = aReadChunkSize;
|
|
[is open];
|
|
// [self setUpStreamForFile];
|
|
if ( [is hasBytesAvailable] ) {
|
|
[self load:aSize readBufferSize:aReadChunkSize];
|
|
}
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void) load:(NSInteger)aSize readBufferSize:(NSInteger)aReadChunkSize
|
|
{
|
|
NSMutableData *retData = nil;
|
|
uint8_t buf[1024];
|
|
if ( is==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;
|
|
numRead = [is read:buf maxLength:aReadChunkSize];
|
|
retData = [NSMutableData dataWithCapacity:numRead];
|
|
[retData appendBytes:(const void *)buf length:numRead];
|
|
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", n );
|
|
}
|
|
@finally {
|
|
[self close];
|
|
}
|
|
}
|
|
|
|
- (void)setUpStreamForFile
|
|
{
|
|
// iStream is NSInputStream instance variable
|
|
// if ( is == nil )
|
|
// is = [[NSInputStream alloc] initWithFileAtPath:path];
|
|
[is setDelegate:self];
|
|
[is scheduleInRunLoop:[NSRunLoop currentRunLoop]
|
|
forMode:NSDefaultRunLoopMode];
|
|
[is open];
|
|
}
|
|
|
|
- (void)stream:(NSStream *)stream handleEvent:(NSStreamEvent)eventCode
|
|
{
|
|
NSMutableData *myData = nil;
|
|
ACNumber *bytesRead = [ACNumber numberWithInteger:0];
|
|
uint8_t buf[1024];
|
|
switch(eventCode) {
|
|
case NSStreamEventHasBytesAvailable:
|
|
{
|
|
if(!myData) {
|
|
myData = [[NSMutableData data] retain];
|
|
}
|
|
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 ACNumber.
|
|
bytesRead = [ACNumber numberWithInteger:[bytesRead integerValue]+len];
|
|
data = [[NSString alloc] initWithData:myData encoding:NSASCIIStringEncoding];
|
|
} 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
|
|
{
|
|
[is close];
|
|
is = nil;
|
|
}
|
|
|
|
@end
|