xref: /aosp_15_r20/external/antlr/runtime/ObjC/Framework/ANTLRReaderStream.m (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
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