xref: /aosp_15_r20/external/antlr/runtime/ObjC/Framework/ANTLRStringStream.m (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
1*16467b97STreehugger Robot// [The "BSD licence"]
2*16467b97STreehugger Robot// Copyright (c) 2006-2007 Kay Roepke 2010 Alan Condit
3*16467b97STreehugger Robot// All rights reserved.
4*16467b97STreehugger Robot//
5*16467b97STreehugger Robot// Redistribution and use in source and binary forms, with or without
6*16467b97STreehugger Robot// modification, are permitted provided that the following conditions
7*16467b97STreehugger Robot// are met:
8*16467b97STreehugger Robot// 1. Redistributions of source code must retain the above copyright
9*16467b97STreehugger Robot//    notice, this list of conditions and the following disclaimer.
10*16467b97STreehugger Robot// 2. Redistributions in binary form must reproduce the above copyright
11*16467b97STreehugger Robot//    notice, this list of conditions and the following disclaimer in the
12*16467b97STreehugger Robot//    documentation and/or other materials provided with the distribution.
13*16467b97STreehugger Robot// 3. The name of the author may not be used to endorse or promote products
14*16467b97STreehugger Robot//    derived from this software without specific prior written permission.
15*16467b97STreehugger Robot//
16*16467b97STreehugger Robot// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17*16467b97STreehugger Robot// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18*16467b97STreehugger Robot// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19*16467b97STreehugger Robot// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20*16467b97STreehugger Robot// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21*16467b97STreehugger Robot// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22*16467b97STreehugger Robot// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23*16467b97STreehugger Robot// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24*16467b97STreehugger Robot// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25*16467b97STreehugger Robot// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26*16467b97STreehugger Robot
27*16467b97STreehugger Robot
28*16467b97STreehugger Robot#import "ANTLRStringStream.h"
29*16467b97STreehugger Robot
30*16467b97STreehugger Robotextern NSInteger debug;
31*16467b97STreehugger Robot
32*16467b97STreehugger Robot@implementation ANTLRStringStream
33*16467b97STreehugger Robot
34*16467b97STreehugger Robot@synthesize data;
35*16467b97STreehugger Robot@synthesize n;
36*16467b97STreehugger Robot@synthesize index;
37*16467b97STreehugger Robot@synthesize line;
38*16467b97STreehugger Robot@synthesize charPositionInLine;
39*16467b97STreehugger Robot@synthesize markDepth;
40*16467b97STreehugger Robot@synthesize markers;
41*16467b97STreehugger Robot@synthesize lastMarker;
42*16467b97STreehugger Robot@synthesize name;
43*16467b97STreehugger Robot@synthesize charState;
44*16467b97STreehugger Robot
45*16467b97STreehugger Robot+ newANTLRStringStream
46*16467b97STreehugger Robot{
47*16467b97STreehugger Robot    return [[ANTLRStringStream alloc] init];
48*16467b97STreehugger Robot}
49*16467b97STreehugger Robot
50*16467b97STreehugger Robot+ newANTLRStringStream:(NSString *)aString;
51*16467b97STreehugger Robot{
52*16467b97STreehugger Robot    return [[ANTLRStringStream alloc] initWithString:aString];
53*16467b97STreehugger Robot}
54*16467b97STreehugger Robot
55*16467b97STreehugger Robot
56*16467b97STreehugger Robot+ newANTLRStringStream:(char *)myData Count:(NSInteger)numBytes;
57*16467b97STreehugger Robot{
58*16467b97STreehugger Robot    return [[ANTLRStringStream alloc] initWithData:myData Count:numBytes];
59*16467b97STreehugger Robot}
60*16467b97STreehugger Robot
61*16467b97STreehugger Robot
62*16467b97STreehugger Robot- (id) init
63*16467b97STreehugger Robot{
64*16467b97STreehugger Robot	if ((self = [super init]) != nil) {
65*16467b97STreehugger Robot        n = 0;
66*16467b97STreehugger Robot        index = 0;
67*16467b97STreehugger Robot        line = 1;
68*16467b97STreehugger Robot        charPositionInLine = 0;
69*16467b97STreehugger Robot        markDepth = 0;
70*16467b97STreehugger Robot		markers = [PtrBuffer newPtrBufferWithLen:10];
71*16467b97STreehugger Robot        [markers retain];
72*16467b97STreehugger Robot        [markers addObject:[NSNull null]]; // ANTLR generates code that assumes markers to be 1-based,
73*16467b97STreehugger Robot        charState = [[CharStreamState newCharStreamState] retain];
74*16467b97STreehugger Robot	}
75*16467b97STreehugger Robot	return self;
76*16467b97STreehugger Robot}
77*16467b97STreehugger Robot
78*16467b97STreehugger Robot- (id) initWithString:(NSString *) theString
79*16467b97STreehugger Robot{
80*16467b97STreehugger Robot	if ((self = [super init]) != nil) {
81*16467b97STreehugger Robot		//[self setData:[NSString stringWithString:theString]];
82*16467b97STreehugger Robot        data = [theString retain];
83*16467b97STreehugger Robot        n = [data length];
84*16467b97STreehugger Robot        index = 0;
85*16467b97STreehugger Robot        line = 1;
86*16467b97STreehugger Robot        charPositionInLine = 0;
87*16467b97STreehugger Robot        markDepth = 0;
88*16467b97STreehugger Robot		markers = [[PtrBuffer newPtrBufferWithLen:10] retain];
89*16467b97STreehugger Robot        [markers addObject:[NSNull null]]; // ANTLR generates code that assumes markers to be 1-based,
90*16467b97STreehugger Robot        charState = [[CharStreamState newCharStreamState] retain];
91*16467b97STreehugger Robot	}
92*16467b97STreehugger Robot	return self;
93*16467b97STreehugger Robot}
94*16467b97STreehugger Robot
95*16467b97STreehugger Robot- (id) initWithStringNoCopy:(NSString *) theString
96*16467b97STreehugger Robot{
97*16467b97STreehugger Robot	if ((self = [super init]) != nil) {
98*16467b97STreehugger Robot		//[self setData:theString];
99*16467b97STreehugger Robot        data = [theString retain];
100*16467b97STreehugger Robot        n = [data length];
101*16467b97STreehugger Robot        index = 0;
102*16467b97STreehugger Robot        line = 1;
103*16467b97STreehugger Robot        charPositionInLine = 0;
104*16467b97STreehugger Robot        markDepth = 0;
105*16467b97STreehugger Robot		markers = [PtrBuffer newPtrBufferWithLen:100];
106*16467b97STreehugger Robot        [markers retain];
107*16467b97STreehugger Robot        [markers addObject:[NSNull null]]; // ANTLR generates code that assumes markers to be 1-based,
108*16467b97STreehugger Robot        charState = [[CharStreamState newCharStreamState] retain];
109*16467b97STreehugger Robot	}
110*16467b97STreehugger Robot	return self;
111*16467b97STreehugger Robot}
112*16467b97STreehugger Robot
113*16467b97STreehugger Robot- (id) initWithData:(char *)myData Count:(NSInteger)numBytes
114*16467b97STreehugger Robot{
115*16467b97STreehugger Robot    if ((self = [super init]) != nil) {
116*16467b97STreehugger Robot        data = [NSString stringWithCString:myData encoding:NSASCIIStringEncoding];
117*16467b97STreehugger Robot        n = numBytes;
118*16467b97STreehugger Robot        index = 0;
119*16467b97STreehugger Robot        line = 1;
120*16467b97STreehugger Robot        charPositionInLine = 0;
121*16467b97STreehugger Robot        markDepth = 0;
122*16467b97STreehugger Robot		markers = [PtrBuffer newPtrBufferWithLen:100];
123*16467b97STreehugger Robot        [markers retain];
124*16467b97STreehugger Robot        [markers addObject:[NSNull null]]; // ANTLR generates code that assumes markers to be 1-based,
125*16467b97STreehugger Robot        charState = [[CharStreamState newCharStreamState] retain];
126*16467b97STreehugger Robot    }
127*16467b97STreehugger Robot    return( self );
128*16467b97STreehugger Robot}
129*16467b97STreehugger Robot
130*16467b97STreehugger Robot- (void) dealloc
131*16467b97STreehugger Robot{
132*16467b97STreehugger Robot#ifdef DEBUG_DEALLOC
133*16467b97STreehugger Robot    NSLog( @"called dealloc in ANTLRStringStream" );
134*16467b97STreehugger Robot#endif
135*16467b97STreehugger Robot    if ( markers && [markers count] ) {
136*16467b97STreehugger Robot        [markers removeAllObjects];
137*16467b97STreehugger Robot        [markers release];
138*16467b97STreehugger Robot        markers = nil;
139*16467b97STreehugger Robot    }
140*16467b97STreehugger Robot    if ( data ) {
141*16467b97STreehugger Robot        [data release];
142*16467b97STreehugger Robot        data = nil;
143*16467b97STreehugger Robot    }
144*16467b97STreehugger Robot	[super dealloc];
145*16467b97STreehugger Robot}
146*16467b97STreehugger Robot
147*16467b97STreehugger Robot- (id) copyWithZone:(NSZone *)aZone
148*16467b97STreehugger Robot{
149*16467b97STreehugger Robot    ANTLRStringStream *copy;
150*16467b97STreehugger Robot
151*16467b97STreehugger Robot    copy = [[[self class] allocWithZone:aZone] init];
152*16467b97STreehugger Robot    //    copy = [super copyWithZone:aZone]; // allocation occurs here
153*16467b97STreehugger Robot    if ( data != nil )
154*16467b97STreehugger Robot        copy.data = [self.data copyWithZone:aZone];
155*16467b97STreehugger Robot    copy.n = n;
156*16467b97STreehugger Robot    copy.index = index;
157*16467b97STreehugger Robot    copy.line = line;
158*16467b97STreehugger Robot    copy.charPositionInLine = charPositionInLine;
159*16467b97STreehugger Robot    copy.markDepth = markDepth;
160*16467b97STreehugger Robot    if ( markers != nil )
161*16467b97STreehugger Robot        copy.markers = [markers copyWithZone:nil];
162*16467b97STreehugger Robot    copy.lastMarker = lastMarker;
163*16467b97STreehugger Robot    if ( name != nil )
164*16467b97STreehugger Robot        copy.name = [self.name copyWithZone:aZone];
165*16467b97STreehugger Robot    return copy;
166*16467b97STreehugger Robot}
167*16467b97STreehugger Robot
168*16467b97STreehugger Robot// reset the streams charState
169*16467b97STreehugger Robot// the streams content is not reset!
170*16467b97STreehugger Robot- (void) reset
171*16467b97STreehugger Robot{
172*16467b97STreehugger Robot	index = 0;
173*16467b97STreehugger Robot	line = 1;
174*16467b97STreehugger Robot	charPositionInLine = 0;
175*16467b97STreehugger Robot	markDepth = 0;
176*16467b97STreehugger Robot    if ( markers && [markers count] )
177*16467b97STreehugger Robot        [markers removeAllObjects];
178*16467b97STreehugger Robot    [markers addObject:[NSNull null]];  // ANTLR generates code that assumes markers to be 1-based,
179*16467b97STreehugger Robot                                        // thus the initial null in the array!
180*16467b97STreehugger Robot}
181*16467b97STreehugger Robot
182*16467b97STreehugger Robot// read one character off the stream, tracking line numbers and character positions
183*16467b97STreehugger Robot// automatically.
184*16467b97STreehugger Robot// Override this in subclasses if you want to avoid the overhead of automatic line/pos
185*16467b97STreehugger Robot// handling. Do not call super in that case.
186*16467b97STreehugger Robot- (void) consume
187*16467b97STreehugger Robot{
188*16467b97STreehugger Robot	if ( index < n ) {
189*16467b97STreehugger Robot		charPositionInLine++;
190*16467b97STreehugger Robot		if ( [data characterAtIndex:index] == '\n' ) {
191*16467b97STreehugger Robot			line++;
192*16467b97STreehugger Robot			charPositionInLine=0;
193*16467b97STreehugger Robot		}
194*16467b97STreehugger Robot		index++;
195*16467b97STreehugger Robot	}
196*16467b97STreehugger Robot}
197*16467b97STreehugger Robot
198*16467b97STreehugger Robot// implement the lookahead method used in lexers
199*16467b97STreehugger Robot- (NSInteger) LA:(NSInteger) i
200*16467b97STreehugger Robot{
201*16467b97STreehugger Robot    NSInteger c;
202*16467b97STreehugger Robot    if ( i == 0 )
203*16467b97STreehugger Robot        return 0; // undefined
204*16467b97STreehugger Robot    if ( i < 0 ) {
205*16467b97STreehugger Robot        i++;
206*16467b97STreehugger Robot        if ( index+i-1 < 0 ) {
207*16467b97STreehugger Robot		    return CharStreamEOF;
208*16467b97STreehugger Robot		}
209*16467b97STreehugger Robot	}
210*16467b97STreehugger Robot    if ( (index+i-1) >= n ) {
211*16467b97STreehugger Robot		return CharStreamEOF;
212*16467b97STreehugger Robot	}
213*16467b97STreehugger Robot    c = [data characterAtIndex:index+i-1];
214*16467b97STreehugger Robot	return (NSInteger)c;
215*16467b97STreehugger Robot}
216*16467b97STreehugger Robot
217*16467b97STreehugger Robot- (NSInteger) LT:(NSInteger)i
218*16467b97STreehugger Robot{
219*16467b97STreehugger Robot    return [self LA:i];
220*16467b97STreehugger Robot}
221*16467b97STreehugger Robot
222*16467b97STreehugger Robot- (NSInteger) size
223*16467b97STreehugger Robot{
224*16467b97STreehugger Robot	return n;
225*16467b97STreehugger Robot}
226*16467b97STreehugger Robot
227*16467b97STreehugger Robot// push the current charState of the stream onto a stack
228*16467b97STreehugger Robot// returns the depth of the stack, to be used as a marker to rewind the stream.
229*16467b97STreehugger Robot// Note: markers are 1-based!
230*16467b97STreehugger Robot- (NSInteger) mark
231*16467b97STreehugger Robot{
232*16467b97STreehugger Robot    if (debug > 1) NSLog(@"mark entry -- markers=%x, markDepth=%d\n", (int)markers, markDepth);
233*16467b97STreehugger Robot    if ( markers == nil ) {
234*16467b97STreehugger Robot        markers = [PtrBuffer newPtrBufferWithLen:100];
235*16467b97STreehugger Robot		[markers addObject:[NSNull null]]; // ANTLR generates code that assumes markers to be 1-based,
236*16467b97STreehugger Robot        markDepth = markers.ptr;
237*16467b97STreehugger Robot    }
238*16467b97STreehugger Robot    markDepth++;
239*16467b97STreehugger Robot	CharStreamState *State = nil;
240*16467b97STreehugger Robot	if ( (markDepth) >= [markers count] ) {
241*16467b97STreehugger Robot        if ( markDepth > 1 ) {
242*16467b97STreehugger Robot            State = [CharStreamState newCharStreamState];
243*16467b97STreehugger Robot            [State retain];
244*16467b97STreehugger Robot        }
245*16467b97STreehugger Robot        if ( markDepth == 1 )
246*16467b97STreehugger Robot            State = charState;
247*16467b97STreehugger Robot		[markers insertObject:State atIndex:markDepth];
248*16467b97STreehugger Robot        if (debug > 1) NSLog(@"mark save State %x at %d, index=%d, line=%d, charPositionInLine=%d\n", (NSUInteger)State, markDepth, State.index, State.line, State.charPositionInLine);
249*16467b97STreehugger Robot	}
250*16467b97STreehugger Robot	else {
251*16467b97STreehugger Robot        if (debug > 1) NSLog(@"mark retrieve markers=%x markDepth=%d\n", (NSUInteger)markers, markDepth);
252*16467b97STreehugger Robot        State = [markers objectAtIndex:markDepth];
253*16467b97STreehugger Robot        [State retain];
254*16467b97STreehugger Robot        State = (CharStreamState *)[markers objectAtIndex:markDepth];
255*16467b97STreehugger Robot        if (debug > 1) NSLog(@"mark retrieve charState %x from %d, index=%d, line=%d, charPositionInLine=%d\n", (NSUInteger)State, markDepth, State.index, State.line, State.charPositionInLine);
256*16467b97STreehugger Robot	}
257*16467b97STreehugger Robot    State.index = index;
258*16467b97STreehugger Robot	State.line = line;
259*16467b97STreehugger Robot	State.charPositionInLine = charPositionInLine;
260*16467b97STreehugger Robot	lastMarker = markDepth;
261*16467b97STreehugger Robot    if (debug > 1) NSLog(@"mark exit -- markers=%x, charState=%x, index=%d, line=%d, charPositionInLine=%d\n", (NSUInteger)markers, (NSUInteger)State, State.index, State.line, State.charPositionInLine);
262*16467b97STreehugger Robot	return markDepth;
263*16467b97STreehugger Robot}
264*16467b97STreehugger Robot
265*16467b97STreehugger Robot- (void) rewind:(NSInteger) marker
266*16467b97STreehugger Robot{
267*16467b97STreehugger Robot    CharStreamState *State;
268*16467b97STreehugger Robot    if (debug > 1) NSLog(@"rewind entry -- markers=%x marker=%d\n", (NSUInteger)markers, marker);
269*16467b97STreehugger Robot    if ( marker == 1 )
270*16467b97STreehugger Robot        State = charState;
271*16467b97STreehugger Robot    else
272*16467b97STreehugger Robot        State = (CharStreamState *)[markers objectAtIndex:marker];
273*16467b97STreehugger Robot    if (debug > 1) NSLog(@"rewind entry -- marker=%d charState=%x, index=%d, line=%d, charPositionInLine=%d\n", marker, (NSUInteger)charState, charState.index, charState.line, charState.charPositionInLine);
274*16467b97STreehugger Robot	// restore stream charState
275*16467b97STreehugger Robot	[self seek:State.index];
276*16467b97STreehugger Robot	line = State.line;
277*16467b97STreehugger Robot	charPositionInLine = charState.charPositionInLine;
278*16467b97STreehugger Robot	[self release:marker];
279*16467b97STreehugger Robot    if (debug > 1) NSLog(@"rewind exit -- marker=%d charState=%x, index=%d, line=%d, charPositionInLine=%d\n", marker, (NSUInteger)charState, charState.index, charState.line, charState.charPositionInLine);
280*16467b97STreehugger Robot}
281*16467b97STreehugger Robot
282*16467b97STreehugger Robot- (void) rewind
283*16467b97STreehugger Robot{
284*16467b97STreehugger Robot	[self rewind:lastMarker];
285*16467b97STreehugger Robot}
286*16467b97STreehugger Robot
287*16467b97STreehugger Robot// remove stream states on top of 'marker' from the marker stack
288*16467b97STreehugger Robot// returns the new markDepth of the stack.
289*16467b97STreehugger Robot// Note: unfortunate naming for Objective-C, but to keep close to the Java target this is named release:
290*16467b97STreehugger Robot- (void) release:(NSInteger) marker
291*16467b97STreehugger Robot{
292*16467b97STreehugger Robot	// unwind any other markers made after marker and release marker
293*16467b97STreehugger Robot	markDepth = marker;
294*16467b97STreehugger Robot	markDepth--;
295*16467b97STreehugger Robot    if (debug > 1) NSLog(@"release:marker= %d, markDepth = %d\n", marker, markDepth);
296*16467b97STreehugger Robot}
297*16467b97STreehugger Robot
298*16467b97STreehugger Robot// when seeking forward we must handle character position and line numbers.
299*16467b97STreehugger Robot// seeking backward already has the correct line information on the markers stack,
300*16467b97STreehugger Robot// so we just take it from there.
301*16467b97STreehugger Robot- (void) seek:(NSInteger) anIndex
302*16467b97STreehugger Robot{
303*16467b97STreehugger Robot    if (debug > 1) NSLog(@"seek entry -- seekIndex=%d index=%d\n", anIndex, index);
304*16467b97STreehugger Robot	if ( anIndex <= index ) {
305*16467b97STreehugger Robot		index = anIndex; // just jump; don't update stream charState (line, ...)
306*16467b97STreehugger Robot        if (debug > 1) NSLog(@"seek exit return -- index=%d index=%d\n", anIndex, index);
307*16467b97STreehugger Robot		return;
308*16467b97STreehugger Robot	}
309*16467b97STreehugger Robot	// seek forward, consume until index hits anIndex
310*16467b97STreehugger Robot	while ( index < anIndex ) {
311*16467b97STreehugger Robot		[self consume];
312*16467b97STreehugger Robot	}
313*16467b97STreehugger Robot    if (debug > 1) NSLog(@"seek exit end -- index=%d index=%d\n", anIndex, index);
314*16467b97STreehugger Robot}
315*16467b97STreehugger Robot
316*16467b97STreehugger Robot// get a substring from our raw data.
317*16467b97STreehugger Robot- (NSString *) substring:(NSInteger)startIndex To:(NSInteger)stopIndex
318*16467b97STreehugger Robot{
319*16467b97STreehugger Robot    NSRange theRange = NSMakeRange(startIndex, stopIndex-startIndex);
320*16467b97STreehugger Robot	return [data substringWithRange:theRange];
321*16467b97STreehugger Robot}
322*16467b97STreehugger Robot
323*16467b97STreehugger Robot// get a substring from our raw data.
324*16467b97STreehugger Robot- (NSString *) substringWithRange:(NSRange) theRange
325*16467b97STreehugger Robot{
326*16467b97STreehugger Robot	return [data substringWithRange:theRange];
327*16467b97STreehugger Robot}
328*16467b97STreehugger Robot
329*16467b97STreehugger Robot
330*16467b97STreehugger Robot- (NSUInteger) getLine
331*16467b97STreehugger Robot{
332*16467b97STreehugger Robot    return line;
333*16467b97STreehugger Robot}
334*16467b97STreehugger Robot
335*16467b97STreehugger Robot- (NSUInteger) getCharPositionInLine
336*16467b97STreehugger Robot{
337*16467b97STreehugger Robot    return charPositionInLine;
338*16467b97STreehugger Robot}
339*16467b97STreehugger Robot
340*16467b97STreehugger Robot- (void) setLine:(NSUInteger) aLine
341*16467b97STreehugger Robot{
342*16467b97STreehugger Robot    line = aLine;
343*16467b97STreehugger Robot}
344*16467b97STreehugger Robot
345*16467b97STreehugger Robot- (void) setCharPositionInLine:(NSUInteger) pos
346*16467b97STreehugger Robot{
347*16467b97STreehugger Robot    charPositionInLine = pos;
348*16467b97STreehugger Robot}
349*16467b97STreehugger Robot
350*16467b97STreehugger Robot- (PtrBuffer *)getMarkers
351*16467b97STreehugger Robot{
352*16467b97STreehugger Robot    return markers;
353*16467b97STreehugger Robot}
354*16467b97STreehugger Robot
355*16467b97STreehugger Robot- (void) setMarkers:(PtrBuffer *)aMarkerList
356*16467b97STreehugger Robot{
357*16467b97STreehugger Robot    markers = aMarkerList;
358*16467b97STreehugger Robot}
359*16467b97STreehugger Robot
360*16467b97STreehugger Robot- (NSString *)getSourceName
361*16467b97STreehugger Robot{
362*16467b97STreehugger Robot    return name;
363*16467b97STreehugger Robot}
364*16467b97STreehugger Robot
365*16467b97STreehugger Robot- (void) setSourceName:(NSString *)aName
366*16467b97STreehugger Robot{
367*16467b97STreehugger Robot    if ( name != aName ) {
368*16467b97STreehugger Robot        if ( name ) [name release];
369*16467b97STreehugger Robot        if ( aName ) [aName retain];
370*16467b97STreehugger Robot        name = aName;
371*16467b97STreehugger Robot    }
372*16467b97STreehugger Robot}
373*16467b97STreehugger Robot
374*16467b97STreehugger Robot
375*16467b97STreehugger Robot- (CharStreamState *)getCharState
376*16467b97STreehugger Robot{
377*16467b97STreehugger Robot    return charState;
378*16467b97STreehugger Robot}
379*16467b97STreehugger Robot
380*16467b97STreehugger Robot- (void) setCharState:(CharStreamState *)aCharState
381*16467b97STreehugger Robot{
382*16467b97STreehugger Robot    charState = aCharState;
383*16467b97STreehugger Robot}
384*16467b97STreehugger Robot
385*16467b97STreehugger Robot- (NSString *)toString
386*16467b97STreehugger Robot{
387*16467b97STreehugger Robot    return [NSString stringWithString:data];
388*16467b97STreehugger Robot}
389*16467b97STreehugger Robot
390*16467b97STreehugger Robot//----------------------------------------------------------
391*16467b97STreehugger Robot//  data
392*16467b97STreehugger Robot//----------------------------------------------------------
393*16467b97STreehugger Robot- (NSString *) getData
394*16467b97STreehugger Robot{
395*16467b97STreehugger Robot    return data;
396*16467b97STreehugger Robot}
397*16467b97STreehugger Robot
398*16467b97STreehugger Robot- (void) setData: (NSString *) aData
399*16467b97STreehugger Robot{
400*16467b97STreehugger Robot    if (data != aData) {
401*16467b97STreehugger Robot        if ( data ) [data release];
402*16467b97STreehugger Robot        data = [NSString stringWithString:aData];
403*16467b97STreehugger Robot        [data retain];
404*16467b97STreehugger Robot    }
405*16467b97STreehugger Robot}
406*16467b97STreehugger Robot
407*16467b97STreehugger Robot@end
408