Home | History | Annotate | Download | only in Framework
      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