aboutsummaryrefslogtreecommitdiff
path: root/antlr-3.4/runtime/ObjC/Framework/ANTLRReaderStream.m
diff options
context:
space:
mode:
Diffstat (limited to 'antlr-3.4/runtime/ObjC/Framework/ANTLRReaderStream.m')
-rw-r--r--antlr-3.4/runtime/ObjC/Framework/ANTLRReaderStream.m153
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