xref: /aosp_15_r20/external/antlr/runtime/ObjC/Framework/ANTLRFileStream.m (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
1*16467b97STreehugger Robot/*
2*16467b97STreehugger Robot [The "BSD license"]
3*16467b97STreehugger Robot Copyright (c) 2005-2009 Terence Parr
4*16467b97STreehugger Robot All rights reserved.
5*16467b97STreehugger Robot
6*16467b97STreehugger Robot Redistribution and use in source and binary forms, with or without
7*16467b97STreehugger Robot modification, are permitted provided that the following conditions
8*16467b97STreehugger Robot are met:
9*16467b97STreehugger Robot 1. Redistributions of source code must retain the above copyright
10*16467b97STreehugger Robot notice, this list of conditions and the following disclaimer.
11*16467b97STreehugger Robot 2. Redistributions in binary form must reproduce the above copyright
12*16467b97STreehugger Robot notice, this list of conditions and the following disclaimer in the
13*16467b97STreehugger Robot documentation and/or other materials provided with the distribution.
14*16467b97STreehugger Robot 3. The name of the author may not be used to endorse or promote products
15*16467b97STreehugger Robot derived from this software without specific prior written permission.
16*16467b97STreehugger Robot
17*16467b97STreehugger Robot THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18*16467b97STreehugger Robot IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19*16467b97STreehugger Robot OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20*16467b97STreehugger Robot IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21*16467b97STreehugger Robot INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22*16467b97STreehugger Robot NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23*16467b97STreehugger Robot DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24*16467b97STreehugger Robot THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25*16467b97STreehugger Robot (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26*16467b97STreehugger Robot THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27*16467b97STreehugger Robot */
28*16467b97STreehugger Robot
29*16467b97STreehugger Robot/** This is a char buffer stream that is loaded from a file
30*16467b97STreehugger Robot *  all at once when you construct the object.  This looks very
31*16467b97STreehugger Robot *  much like an ANTLRReader or ANTLRInputStream, but it's a special case
32*16467b97STreehugger Robot *  since we know the exact size of the object to load.  We can avoid lots
33*16467b97STreehugger Robot *  of data copying.
34*16467b97STreehugger Robot */
35*16467b97STreehugger Robot
36*16467b97STreehugger Robot#import "ANTLRFileStream.h"
37*16467b97STreehugger Robot
38*16467b97STreehugger Robot@implementation ANTLRFileStream
39*16467b97STreehugger Robot
40*16467b97STreehugger Robot@synthesize fileName;
41*16467b97STreehugger Robot
42*16467b97STreehugger Robot+ (id) newANTLRFileStream:(NSString*)fileName
43*16467b97STreehugger Robot{
44*16467b97STreehugger Robot    return [[ANTLRFileStream alloc] init:fileName];
45*16467b97STreehugger Robot}
46*16467b97STreehugger Robot
47*16467b97STreehugger Robot+ (id) newANTLRFileStream:(NSString *)aFileName encoding:(NSStringEncoding)encoding
48*16467b97STreehugger Robot{
49*16467b97STreehugger Robot    return [[ANTLRFileStream alloc] init:aFileName encoding:encoding];
50*16467b97STreehugger Robot}
51*16467b97STreehugger Robot
52*16467b97STreehugger Robot- (id) init:(NSString *)aFileName
53*16467b97STreehugger Robot{
54*16467b97STreehugger Robot    self = [super init];
55*16467b97STreehugger Robot    if ( self != nil ) {
56*16467b97STreehugger Robot        fileName = aFileName;
57*16467b97STreehugger Robot        [self load:aFileName encoding:NSUTF8StringEncoding];
58*16467b97STreehugger Robot    }
59*16467b97STreehugger Robot    return self;
60*16467b97STreehugger Robot}
61*16467b97STreehugger Robot
62*16467b97STreehugger Robot- (id) init:(NSString *) aFileName encoding:(NSStringEncoding)encoding
63*16467b97STreehugger Robot{
64*16467b97STreehugger Robot    self = [super init];
65*16467b97STreehugger Robot    if ( self != nil ) {
66*16467b97STreehugger Robot        fileName = aFileName;
67*16467b97STreehugger Robot        [self load:aFileName encoding:encoding];
68*16467b97STreehugger Robot    }
69*16467b97STreehugger Robot    return self;
70*16467b97STreehugger Robot}
71*16467b97STreehugger Robot
72*16467b97STreehugger Robot- (NSString *) getSourceName
73*16467b97STreehugger Robot{
74*16467b97STreehugger Robot    return fileName;
75*16467b97STreehugger Robot}
76*16467b97STreehugger Robot
77*16467b97STreehugger Robot- (void) load:(NSString *)aFileName encoding:(NSStringEncoding)encoding
78*16467b97STreehugger Robot{
79*16467b97STreehugger Robot    if ( aFileName==nil ) {
80*16467b97STreehugger Robot        return;
81*16467b97STreehugger Robot    }
82*16467b97STreehugger Robot    NSError *error;
83*16467b97STreehugger Robot    NSData *retData = nil;
84*16467b97STreehugger Robot    NSFileHandle *fh;
85*16467b97STreehugger Robot    @try {
86*16467b97STreehugger Robot        NSString *fn = [aFileName stringByStandardizingPath];
87*16467b97STreehugger Robot        NSURL *f = [NSURL fileURLWithPath:fn];
88*16467b97STreehugger Robot        fh = [NSFileHandle fileHandleForReadingFromURL:f error:&error];
89*16467b97STreehugger Robot        if ( fh==nil ) {
90*16467b97STreehugger Robot            return;
91*16467b97STreehugger Robot        }
92*16467b97STreehugger Robot        int numRead=0;
93*16467b97STreehugger Robot        int p1 = 0;
94*16467b97STreehugger Robot        retData = [fh readDataToEndOfFile];
95*16467b97STreehugger Robot        numRead = [retData length];
96*16467b97STreehugger Robot#pragma mark fix these NSLog calls
97*16467b97STreehugger Robot        NSLog( @"read %d chars; p was %d is now %d", n, p1, (p1+numRead) );
98*16467b97STreehugger Robot        p1 += numRead;
99*16467b97STreehugger Robot        n = p1;
100*16467b97STreehugger Robot        data = [[NSString alloc] initWithData:retData encoding:NSASCIIStringEncoding];
101*16467b97STreehugger Robot#pragma mark fix these NSLog calls
102*16467b97STreehugger Robot        NSLog( @"n=%d", n );
103*16467b97STreehugger Robot    }
104*16467b97STreehugger Robot    @finally {
105*16467b97STreehugger Robot        [fh closeFile];
106*16467b97STreehugger Robot    }
107*16467b97STreehugger Robot}
108*16467b97STreehugger Robot
109*16467b97STreehugger Robot@end
110