xref: /aosp_15_r20/external/antlr/runtime/ObjC/Framework/Map.m (revision 16467b971bd3e2009fad32dd79016f2c7e421deb)
1*16467b97STreehugger Robot//
2*16467b97STreehugger Robot//  Map.m
3*16467b97STreehugger Robot//  ANTLR
4*16467b97STreehugger Robot//
5*16467b97STreehugger Robot//  Created by Alan Condit on 6/9/10.
6*16467b97STreehugger Robot// [The "BSD licence"]
7*16467b97STreehugger Robot// Copyright (c) 2010 Alan Condit
8*16467b97STreehugger Robot// All rights reserved.
9*16467b97STreehugger Robot//
10*16467b97STreehugger Robot// Redistribution and use in source and binary forms, with or without
11*16467b97STreehugger Robot// modification, are permitted provided that the following conditions
12*16467b97STreehugger Robot// are met:
13*16467b97STreehugger Robot// 1. Redistributions of source code must retain the above copyright
14*16467b97STreehugger Robot//    notice, this list of conditions and the following disclaimer.
15*16467b97STreehugger Robot// 2. Redistributions in binary form must reproduce the above copyright
16*16467b97STreehugger Robot//    notice, this list of conditions and the following disclaimer in the
17*16467b97STreehugger Robot//    documentation and/or other materials provided with the distribution.
18*16467b97STreehugger Robot// 3. The name of the author may not be used to endorse or promote products
19*16467b97STreehugger Robot//    derived from this software without specific prior written permission.
20*16467b97STreehugger Robot//
21*16467b97STreehugger Robot// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
22*16467b97STreehugger Robot// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
23*16467b97STreehugger Robot// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
24*16467b97STreehugger Robot// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
25*16467b97STreehugger Robot// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
26*16467b97STreehugger Robot// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27*16467b97STreehugger Robot// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
28*16467b97STreehugger Robot// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
29*16467b97STreehugger Robot// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
30*16467b97STreehugger Robot// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
31*16467b97STreehugger Robot
32*16467b97STreehugger Robot#define SUCCESS (0)
33*16467b97STreehugger Robot#define FAILURE (-1)
34*16467b97STreehugger Robot
35*16467b97STreehugger Robot#import "Map.h"
36*16467b97STreehugger Robot#import "BaseTree.h"
37*16467b97STreehugger Robot
38*16467b97STreehugger Robot/*
39*16467b97STreehugger Robot * Start of Map
40*16467b97STreehugger Robot */
41*16467b97STreehugger Robot@implementation Map
42*16467b97STreehugger Robot
43*16467b97STreehugger Robot@synthesize lastHash;
44*16467b97STreehugger Robot
45*16467b97STreehugger Robot+(id)newMap
46*16467b97STreehugger Robot{
47*16467b97STreehugger Robot    return [[Map alloc] init];
48*16467b97STreehugger Robot}
49*16467b97STreehugger Robot
50*16467b97STreehugger Robot+(id)newMapWithLen:(NSInteger)aBuffSize
51*16467b97STreehugger Robot{
52*16467b97STreehugger Robot    return [[Map alloc] initWithLen:aBuffSize];
53*16467b97STreehugger Robot}
54*16467b97STreehugger Robot
55*16467b97STreehugger Robot-(id)init
56*16467b97STreehugger Robot{
57*16467b97STreehugger Robot    NSInteger idx;
58*16467b97STreehugger Robot
59*16467b97STreehugger Robot	self = [super initWithLen:HASHSIZE];
60*16467b97STreehugger Robot    if ( self != nil ) {
61*16467b97STreehugger Robot		fNext = nil;
62*16467b97STreehugger Robot        for( idx = 0; idx < HASHSIZE; idx++ ) {
63*16467b97STreehugger Robot            ptrBuffer[idx] = nil;
64*16467b97STreehugger Robot        }
65*16467b97STreehugger Robot	}
66*16467b97STreehugger Robot    return( self );
67*16467b97STreehugger Robot}
68*16467b97STreehugger Robot
69*16467b97STreehugger Robot-(id)initWithLen:(NSInteger)aBuffSize
70*16467b97STreehugger Robot{
71*16467b97STreehugger Robot	self = [super initWithLen:aBuffSize];
72*16467b97STreehugger Robot    if ( self != nil ) {
73*16467b97STreehugger Robot	}
74*16467b97STreehugger Robot    return( self );
75*16467b97STreehugger Robot}
76*16467b97STreehugger Robot
77*16467b97STreehugger Robot-(void)dealloc
78*16467b97STreehugger Robot{
79*16467b97STreehugger Robot#ifdef DEBUG_DEALLOC
80*16467b97STreehugger Robot    NSLog( @"called dealloc in MMap" );
81*16467b97STreehugger Robot#endif
82*16467b97STreehugger Robot    MapElement *tmp, *rtmp;
83*16467b97STreehugger Robot    NSInteger idx;
84*16467b97STreehugger Robot
85*16467b97STreehugger Robot    if ( self.fNext != nil ) {
86*16467b97STreehugger Robot        for( idx = 0; idx < BuffSize; idx++ ) {
87*16467b97STreehugger Robot            tmp = ptrBuffer[idx];
88*16467b97STreehugger Robot            while ( tmp ) {
89*16467b97STreehugger Robot                rtmp = tmp;
90*16467b97STreehugger Robot                tmp = (MapElement *)tmp.fNext;
91*16467b97STreehugger Robot                [rtmp release];
92*16467b97STreehugger Robot            }
93*16467b97STreehugger Robot        }
94*16467b97STreehugger Robot    }
95*16467b97STreehugger Robot	[super dealloc];
96*16467b97STreehugger Robot}
97*16467b97STreehugger Robot
98*16467b97STreehugger Robot-(void)deleteMap:(MapElement *)np
99*16467b97STreehugger Robot{
100*16467b97STreehugger Robot    MapElement *tmp, *rtmp;
101*16467b97STreehugger Robot    NSInteger idx;
102*16467b97STreehugger Robot
103*16467b97STreehugger Robot    if ( self.fNext != nil ) {
104*16467b97STreehugger Robot        for( idx = 0; idx < BuffSize; idx++ ) {
105*16467b97STreehugger Robot            tmp = ptrBuffer[idx];
106*16467b97STreehugger Robot            while ( tmp ) {
107*16467b97STreehugger Robot                rtmp = tmp;
108*16467b97STreehugger Robot                tmp = [tmp getfNext];
109*16467b97STreehugger Robot                [rtmp release];
110*16467b97STreehugger Robot            }
111*16467b97STreehugger Robot        }
112*16467b97STreehugger Robot    }
113*16467b97STreehugger Robot}
114*16467b97STreehugger Robot
115*16467b97STreehugger Robot- (void)clear
116*16467b97STreehugger Robot{
117*16467b97STreehugger Robot    MapElement *tmp, *rtmp;
118*16467b97STreehugger Robot    NSInteger idx;
119*16467b97STreehugger Robot
120*16467b97STreehugger Robot    for( idx = 0; idx < BuffSize; idx++ ) {
121*16467b97STreehugger Robot        tmp = ptrBuffer[idx];
122*16467b97STreehugger Robot        while ( tmp ) {
123*16467b97STreehugger Robot            rtmp = tmp;
124*16467b97STreehugger Robot            tmp = [tmp getfNext];
125*16467b97STreehugger Robot            [rtmp dealloc];
126*16467b97STreehugger Robot        }
127*16467b97STreehugger Robot        ptrBuffer[idx] = nil;
128*16467b97STreehugger Robot    }
129*16467b97STreehugger Robot}
130*16467b97STreehugger Robot
131*16467b97STreehugger Robot- (NSInteger)count
132*16467b97STreehugger Robot{
133*16467b97STreehugger Robot    NSInteger aCnt = 0;
134*16467b97STreehugger Robot
135*16467b97STreehugger Robot    for (int i = 0; i < BuffSize; i++) {
136*16467b97STreehugger Robot        if (ptrBuffer[i] != nil) {
137*16467b97STreehugger Robot            aCnt++;
138*16467b97STreehugger Robot        }
139*16467b97STreehugger Robot    }
140*16467b97STreehugger Robot    return aCnt;
141*16467b97STreehugger Robot}
142*16467b97STreehugger Robot
143*16467b97STreehugger Robot- (NSInteger)length
144*16467b97STreehugger Robot{
145*16467b97STreehugger Robot    return BuffSize;
146*16467b97STreehugger Robot}
147*16467b97STreehugger Robot
148*16467b97STreehugger Robot- (NSInteger)size
149*16467b97STreehugger Robot{
150*16467b97STreehugger Robot    MapElement *anElement;
151*16467b97STreehugger Robot    NSInteger aSize = 0;
152*16467b97STreehugger Robot
153*16467b97STreehugger Robot    for (int i = 0; i < BuffSize; i++) {
154*16467b97STreehugger Robot        if ((anElement = ptrBuffer[i]) != nil) {
155*16467b97STreehugger Robot            aSize += (NSInteger)[anElement size];
156*16467b97STreehugger Robot        }
157*16467b97STreehugger Robot    }
158*16467b97STreehugger Robot    return aSize;
159*16467b97STreehugger Robot}
160*16467b97STreehugger Robot
161*16467b97STreehugger Robot#ifdef USERDOC
162*16467b97STreehugger Robot/*
163*16467b97STreehugger Robot *  HASH        hash entry to get index to table
164*16467b97STreehugger Robot *  NSInteger hash( Map *self, char *s );
165*16467b97STreehugger Robot *
166*16467b97STreehugger Robot *     Inputs:  NSString *s         string to find
167*16467b97STreehugger Robot *
168*16467b97STreehugger Robot *     Returns: NSInteger                 hashed value
169*16467b97STreehugger Robot *
170*16467b97STreehugger Robot *  Last Revision 9/03/90
171*16467b97STreehugger Robot */
172*16467b97STreehugger Robot#endif
173*16467b97STreehugger Robot-(NSInteger)hash:(NSString *)s       /*    form hash value for string s */
174*16467b97STreehugger Robot{
175*16467b97STreehugger Robot	NSInteger hashval;
176*16467b97STreehugger Robot	const char *tmp;
177*16467b97STreehugger Robot
178*16467b97STreehugger Robot	tmp = [s cStringUsingEncoding:NSASCIIStringEncoding];
179*16467b97STreehugger Robot	for( hashval = 0; *tmp != '\0'; )
180*16467b97STreehugger Robot        hashval += *tmp++;
181*16467b97STreehugger Robot	self->lastHash = hashval % HASHSIZE;
182*16467b97STreehugger Robot	return( self->lastHash );
183*16467b97STreehugger Robot}
184*16467b97STreehugger Robot
185*16467b97STreehugger Robot#ifdef USERDOC
186*16467b97STreehugger Robot/*
187*16467b97STreehugger Robot *  LOOKUP  search hashed list for entry
188*16467b97STreehugger Robot *  MapElement *lookup:(NSString *)s;
189*16467b97STreehugger Robot *
190*16467b97STreehugger Robot *     Inputs:  NSString  *s       string to find
191*16467b97STreehugger Robot *
192*16467b97STreehugger Robot *     Returns: MapElement  *        pointer to entry
193*16467b97STreehugger Robot *
194*16467b97STreehugger Robot *  Last Revision 9/03/90
195*16467b97STreehugger Robot */
196*16467b97STreehugger Robot#endif
197*16467b97STreehugger Robot-(id)lookup:(NSString *)s
198*16467b97STreehugger Robot{
199*16467b97STreehugger Robot    MapElement *np;
200*16467b97STreehugger Robot
201*16467b97STreehugger Robot    for( np = self->ptrBuffer[[self hash:s]]; np != nil; np = [np getfNext] ) {
202*16467b97STreehugger Robot        if ( [s isEqualToString:[np getName]] ) {
203*16467b97STreehugger Robot            return( np );        /*   found it       */
204*16467b97STreehugger Robot        }
205*16467b97STreehugger Robot    }
206*16467b97STreehugger Robot    return( nil );              /*   not found      */
207*16467b97STreehugger Robot}
208*16467b97STreehugger Robot
209*16467b97STreehugger Robot#ifdef USERDOC
210*16467b97STreehugger Robot/*
211*16467b97STreehugger Robot *  INSTALL search hashed list for entry
212*16467b97STreehugger Robot *  NSInteger install( Map *self, MapElement *sym );
213*16467b97STreehugger Robot *
214*16467b97STreehugger Robot *     Inputs:  MapElement    *sym   -- symbol ptr to install
215*16467b97STreehugger Robot *              NSInteger         scope -- level to find
216*16467b97STreehugger Robot *
217*16467b97STreehugger Robot *     Returns: Boolean     TRUE   if installed
218*16467b97STreehugger Robot *                          FALSE  if already in table
219*16467b97STreehugger Robot *
220*16467b97STreehugger Robot *  Last Revision 9/03/90
221*16467b97STreehugger Robot */
222*16467b97STreehugger Robot#endif
223*16467b97STreehugger Robot-(MapElement *)install:(MapElement *)sym
224*16467b97STreehugger Robot{
225*16467b97STreehugger Robot    MapElement *np;
226*16467b97STreehugger Robot
227*16467b97STreehugger Robot    np = [self lookup:[sym getName]];
228*16467b97STreehugger Robot    if ( np == nil ) {
229*16467b97STreehugger Robot        [sym setFNext:ptrBuffer[ lastHash ]];
230*16467b97STreehugger Robot        ptrBuffer[ lastHash ] = sym;
231*16467b97STreehugger Robot        [sym retain];
232*16467b97STreehugger Robot        return( ptrBuffer[ lastHash ] );
233*16467b97STreehugger Robot    }
234*16467b97STreehugger Robot    return( nil );            /*   not found      */
235*16467b97STreehugger Robot}
236*16467b97STreehugger Robot
237*16467b97STreehugger Robot#ifdef USERDOC
238*16467b97STreehugger Robot/*
239*16467b97STreehugger Robot *  RemoveSym  search hashed list for entry
240*16467b97STreehugger Robot *  NSInteger RemoveSym( Map *self, char *s );
241*16467b97STreehugger Robot *
242*16467b97STreehugger Robot *     Inputs:  char     *s          string to find
243*16467b97STreehugger Robot *
244*16467b97STreehugger Robot *     Returns: NSInteger      indicator of SUCCESS OR FAILURE
245*16467b97STreehugger Robot *
246*16467b97STreehugger Robot *  Last Revision 9/03/90
247*16467b97STreehugger Robot */
248*16467b97STreehugger Robot#endif
249*16467b97STreehugger Robot-(NSInteger)RemoveSym:(NSString *)s
250*16467b97STreehugger Robot{
251*16467b97STreehugger Robot    MapElement *np, *tmp;
252*16467b97STreehugger Robot    NSInteger idx;
253*16467b97STreehugger Robot
254*16467b97STreehugger Robot    idx = [self hash:s];
255*16467b97STreehugger Robot    for ( tmp = self->ptrBuffer[idx], np = self->ptrBuffer[idx]; np != nil; np = [np getfNext] ) {
256*16467b97STreehugger Robot        if ( [s isEqualToString:[np getName]] ) {
257*16467b97STreehugger Robot            tmp = [np getfNext];             /* get the next link  */
258*16467b97STreehugger Robot            [np release];
259*16467b97STreehugger Robot            return( SUCCESS );            /* report SUCCESS     */
260*16467b97STreehugger Robot        }
261*16467b97STreehugger Robot        tmp = [np getfNext];              //  BAD!!!!!!
262*16467b97STreehugger Robot    }
263*16467b97STreehugger Robot    return( FAILURE );                    /*   not found      */
264*16467b97STreehugger Robot}
265*16467b97STreehugger Robot
266*16467b97STreehugger Robot-(void)delete_chain:(MapElement *)np
267*16467b97STreehugger Robot{
268*16467b97STreehugger Robot    if ( [np getfNext] != nil )
269*16467b97STreehugger Robot		[self delete_chain:[np getfNext]];
270*16467b97STreehugger Robot	[np release];
271*16467b97STreehugger Robot}
272*16467b97STreehugger Robot
273*16467b97STreehugger Robot#ifdef DONTUSEYET
274*16467b97STreehugger Robot-(NSInteger)bld_symtab:(KW_TABLE *)toknams
275*16467b97STreehugger Robot{
276*16467b97STreehugger Robot    NSInteger i;
277*16467b97STreehugger Robot    MapElement *np;
278*16467b97STreehugger Robot
279*16467b97STreehugger Robot    for( i = 0; *(toknams[i].name) != '\0'; i++ ) {
280*16467b97STreehugger Robot        // install symbol in ptrBuffer
281*16467b97STreehugger Robot        np = [MapElement newMapElement:[NSString stringWithFormat:@"%s", toknams[i].name]];
282*16467b97STreehugger Robot        //        np->fType = toknams[i].toknum;
283*16467b97STreehugger Robot        [self install:np Scope:0];
284*16467b97STreehugger Robot    }
285*16467b97STreehugger Robot    return( SUCCESS );
286*16467b97STreehugger Robot}
287*16467b97STreehugger Robot#endif
288*16467b97STreehugger Robot
289*16467b97STreehugger Robot/*
290*16467b97STreehugger Robot * works only for maplist indexed not by name but by TokenNumber
291*16467b97STreehugger Robot */
292*16467b97STreehugger Robot- (MapElement *)getName:(NSInteger)ttype
293*16467b97STreehugger Robot{
294*16467b97STreehugger Robot    MapElement *np;
295*16467b97STreehugger Robot    NSInteger aTType;
296*16467b97STreehugger Robot
297*16467b97STreehugger Robot    aTType = ttype % HASHSIZE;
298*16467b97STreehugger Robot    for( np = self->ptrBuffer[ttype]; np != nil; np = [np getfNext] ) {
299*16467b97STreehugger Robot        if ( [(ACNumber *)np.node integerValue] == ttype ) {
300*16467b97STreehugger Robot            return( np );        /*   found it       */
301*16467b97STreehugger Robot        }
302*16467b97STreehugger Robot    }
303*16467b97STreehugger Robot    return( nil );              /*   not found      */
304*16467b97STreehugger Robot}
305*16467b97STreehugger Robot
306*16467b97STreehugger Robot- (NSInteger)getNode:(id<BaseTree>)aNode
307*16467b97STreehugger Robot{
308*16467b97STreehugger Robot    MapElement *np;
309*16467b97STreehugger Robot    NSInteger idx;
310*16467b97STreehugger Robot
311*16467b97STreehugger Robot    idx = [(id<BaseTree>)aNode type];
312*16467b97STreehugger Robot    idx %= HASHSIZE;
313*16467b97STreehugger Robot    np = ptrBuffer[idx];
314*16467b97STreehugger Robot    return( [(ACNumber *)np.node integerValue] );
315*16467b97STreehugger Robot}
316*16467b97STreehugger Robot
317*16467b97STreehugger Robot- (MapElement *)getTType:(NSString *)name
318*16467b97STreehugger Robot{
319*16467b97STreehugger Robot    return [self lookup:name];
320*16467b97STreehugger Robot}
321*16467b97STreehugger Robot
322*16467b97STreehugger Robot// create node and install node in ptrBuffer
323*16467b97STreehugger Robot- (void)putName:(NSString *)name TType:(NSInteger)ttype
324*16467b97STreehugger Robot{
325*16467b97STreehugger Robot    MapElement *np;
326*16467b97STreehugger Robot
327*16467b97STreehugger Robot    np = [MapElement newMapElementWithName:[NSString stringWithString:name] Type:ttype];
328*16467b97STreehugger Robot    [self install:np];
329*16467b97STreehugger Robot}
330*16467b97STreehugger Robot
331*16467b97STreehugger Robot// create node and install node in ptrBuffer
332*16467b97STreehugger Robot- (void)putName:(NSString *)name Node:(id)aNode
333*16467b97STreehugger Robot{
334*16467b97STreehugger Robot    MapElement *np, *np1;
335*16467b97STreehugger Robot    NSInteger idx;
336*16467b97STreehugger Robot
337*16467b97STreehugger Robot    idx = [self hash:name];
338*16467b97STreehugger Robot    np1 = [MapElement newMapElementWithName:[NSString stringWithString:name] Type:idx];
339*16467b97STreehugger Robot    np = [self lookup:name];
340*16467b97STreehugger Robot    if ( np == nil ) {
341*16467b97STreehugger Robot        [np1 setFNext:self->ptrBuffer[ self->lastHash ]];
342*16467b97STreehugger Robot        self->ptrBuffer[ self->lastHash ] = np1;
343*16467b97STreehugger Robot        [np1 retain];
344*16467b97STreehugger Robot    }
345*16467b97STreehugger Robot    else {
346*16467b97STreehugger Robot        // ptrBuffer[idx] = np;
347*16467b97STreehugger Robot    }
348*16467b97STreehugger Robot    return;
349*16467b97STreehugger Robot}
350*16467b97STreehugger Robot
351*16467b97STreehugger Robot// create node and install node in ptrBuffer
352*16467b97STreehugger Robot- (void)putNode:(NSInteger)aTType Node:(id)aNode
353*16467b97STreehugger Robot{
354*16467b97STreehugger Robot    MapElement *np;
355*16467b97STreehugger Robot    NSInteger ttype;
356*16467b97STreehugger Robot
357*16467b97STreehugger Robot    ttype = aTType % HASHSIZE;
358*16467b97STreehugger Robot    np = [MapElement newMapElementWithNode:ttype Node:(id)aNode];
359*16467b97STreehugger Robot    ptrBuffer[ttype] = np;
360*16467b97STreehugger Robot}
361*16467b97STreehugger Robot
362*16467b97STreehugger Robot@end
363