1//
2//  ANTLRPtrStack.m
3//  ANTLR
4//
5//  Created by Alan Condit on 6/9/10.
6//  Copyright 2010 Alan's MachineWorks. All rights reserved.
7//
8#define SUCCESS (0)
9#define FAILURE (-1)
10
11#import "ANTLRPtrStack.h"
12#import "ANTLRTree.h"
13
14/*
15 * Start of ANTLRPtrStack
16 */
17@implementation ANTLRPtrStack
18
19+(ANTLRPtrStack *)newANTLRPtrStack
20{
21    return [[ANTLRPtrStack alloc] init];
22}
23
24+(ANTLRPtrStack *)newANTLRPtrStack:(NSInteger)cnt
25{
26    return [[ANTLRPtrStack alloc] initWithLen:cnt];
27}
28
29-(id)init
30{
31	self = [super initWithLen:HASHSIZE];
32	if ( self != nil ) {
33	}
34    return( self );
35}
36
37-(id)initWithLen:(NSInteger)cnt
38{
39	self = [super initWithLen:cnt];
40	if ( self != nil ) {
41	}
42    return( self );
43}
44
45-(void)dealloc
46{
47#ifdef DEBUG_DEALLOC
48    NSLog( @"called dealloc in ANTLRPtrStack" );
49#endif
50	[super dealloc];
51}
52
53-(void)deleteANTLRPtrStack:(ANTLRPtrStack *)np
54{
55    ANTLRLinkBase *tmp, *rtmp;
56    NSInteger idx;
57    
58    if ( self.fNext != nil ) {
59        for( idx = 0; idx < BuffSize; idx++ ) {
60            tmp = ptrBuffer[idx];
61            while ( tmp ) {
62                rtmp = tmp;
63                tmp = [tmp getfNext];
64                [rtmp release];
65            }
66        }
67    }
68}
69
70#ifdef DONTUSENOMO
71#ifdef USERDOC
72/*
73 *  HASH        hash entry to get index to table
74 *  NSInteger hash( ANTLRPtrStack *self, char *s );
75 *
76 *     Inputs:  NSString *s         string to find
77 *
78 *     Returns: NSInteger                 hashed value
79 *
80 *  Last Revision 9/03/90
81 */
82#endif
83-(NSInteger)hash:(NSString *)s       /*    form hash value for string s */
84{
85	NSInteger hashval;
86	const char *tmp;
87    
88	tmp = [s cStringUsingEncoding:NSASCIIStringEncoding];
89	for( hashval = 0; *tmp != '\0'; )
90        hashval += *tmp++;
91	LastHash = hashval % HashSize;
92	return( LastHash );
93}
94
95#ifdef USERDOC
96/*
97 *  LOOKUP  search hashed list for entry
98 *  id lookup:(NSString *)s;
99 *
100 *     Inputs:  NSString  *s       string to find
101 *
102 *     Returns: ANTLRRuleMemo  *        pointer to entry
103 *
104 *  Last Revision 9/03/90
105 */
106#endif
107-(id)lookup:(NSString *)s
108{
109    ANTLRLinkBase *np;
110    
111    for( np = ptrBuffer[[self hash:s]]; np != nil; np = [np getfNext] ) {
112        if ( [s isEqualToString:[np getName]] ) {
113            return( np );        /*   found it       */
114        }
115    }
116    return( nil );              /*   not found      */
117}
118
119#ifdef USERDOC
120/*
121 *  INSTALL search hashed list for entry
122 *  NSInteger install( ANTLRPtrStack *self, id sym );
123 *
124 *     Inputs:  ANTLRRuleMemo    *sym   -- symbol ptr to install
125 *              NSInteger         scope -- level to find
126 *
127 *     Returns: Boolean     TRUE   if installed
128 *                          FALSE  if already in table
129 *
130 *  Last Revision 9/03/90
131 */
132#endif
133-(id)install:(id)sym
134{
135    ANTLRLinkBase *np;
136    
137    np = [self lookup:[sym getName]];
138    if ( np == nil ) {
139        [sym setFNext:ptrBuffer[ LastHash ]];
140        ptrBuffer[ LastHash ] = [sym retain];
141        return( ptrBuffer[ LastHash ] );
142    }
143    return( nil );            /*   not found      */
144}
145#endif
146
147-(id)getptrBufferEntry:(NSInteger)idx
148{
149	return( ptrBuffer[idx] );
150}
151
152-(id *)getptrBuffer
153{
154	return( ptrBuffer );
155}
156
157-(void)setptrBuffer:(id *)np
158{
159    ptrBuffer = np;
160}
161
162#ifdef DONTUSENOMO
163/*
164 * works only for maplist indexed not by name but by TokenNumber
165 */
166- (id)getName:(NSInteger)ttype
167{
168    id np;
169    NSInteger aTType;
170
171    aTType = ttype % HashSize;
172    for( np = ptrBuffer[ttype]; np != nil; np = [np getfNext] ) {
173        if ( np.index == ttype ) {
174            return( np );        /*   found it       */
175        }
176    }
177    return( nil );              /*   not found      */
178}
179
180- (id)getTType:(NSString *)name
181{
182    return [self lookup:name];
183}
184#endif
185
186- (id) copyWithZone:(NSZone *)aZone
187{
188    return [super copyWithZone:aZone];
189}
190
191@end
192