ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libBASS/BASS_parse.c
Revision: 998
Committed: Thu Jan 29 23:01:17 2004 UTC (20 years, 5 months ago) by gezelter
Content type: text/plain
File size: 7158 byte(s)
Log Message:
member list fixes for rigid bodies

File Contents

# Content
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4
5 #include "BASSyacc.h"
6 #include "BASS_parse.h"
7 #include "simError.h"
8 #ifdef IS_MPI
9 #define __is_lex__
10 #include "mpiBASS.h"
11 #endif
12
13 #define HASH_SIZE 211 // the size of the hash table
14 #define SHIFT 4 // the bit shift for the hash index
15
16
17 //*** Global functions, variables, and structures ************
18
19 unsigned short is_initialized = 0; // tells whether to init the linked list
20
21 // reserved word elements for the hash table
22 struct res_element{
23 char word[100]; //the reserved word
24 int token; //the token to return;
25 struct res_element* next;
26 };
27
28 struct res_element** reserved = NULL; //the table of reserved words
29
30 void initialize_res_list(void); // function to initialize the list
31
32 int hash ( char* text ); // generates the hash key
33
34 void add_res_element( char* text, int the_token ); //adds elements to the table
35
36 // the elements of the defined Hash table
37 struct defined_element{
38 char defined[100];
39 char definition[DEFINED_BUFFER_SIZE];
40 struct defined_element* next;
41 };
42
43 struct defined_element** defined_list = NULL; // the defined hash table
44
45
46
47 //*** The Functions *******************************************
48
49
50 /*
51 function to initialize the list of reserved words into memory.
52 */
53
54 void initialize_res_list(){
55
56 register unsigned short i; // loop counter
57
58 reserved = ( struct res_element ** )
59 calloc( HASH_SIZE, sizeof( struct hash__element* ) );
60
61 for( i=0; i < HASH_SIZE; i++ ){
62
63 reserved[i] = NULL;
64 }
65
66 // add the reserved words
67
68 add_res_element( "molecule", MOLECULE );
69 add_res_element( "atom", ATOM );
70 add_res_element( "bond", BOND );
71 add_res_element( "bend", BEND );
72 add_res_element( "torsion", TORSION );
73 add_res_element( "position", POSITION );
74 add_res_element( "members", MEMBERS );
75 add_res_element( "constraint", CONSTRAINT );
76 add_res_element( "component", COMPONENT );
77 add_res_element( "zConstraint", ZCONSTRAINT );
78 add_res_element( "orientation", ORIENTATION );
79 add_res_element( "rigidBody", RIGIDBODY );
80
81 is_initialized = 1; // set the initialization boolean to true
82 }
83
84
85 /*
86 checks for reserved words.
87 If a reserved word is found, returns the token,
88 else returns 0.
89 */
90
91 int res_word( char* text ){
92
93 int matched = 0;
94 int key; // the hash key
95 struct res_element* current_ptr; // points to the current hash element
96 struct defined_element* def_ptr; // points to the current define element
97
98 if( !is_initialized ){ // initialize the list if not already done
99
100 initialize_res_list();
101 }
102
103 // get the hash key
104
105 key = hash( text );
106 current_ptr = reserved[key];
107
108 // walk through possible mutiple entries
109
110 while( current_ptr != NULL ){
111
112 matched = !strcmp( text, current_ptr->word );
113 if( matched ) return current_ptr->token; // search successful
114
115 current_ptr = current_ptr->next;
116 }
117
118 // if no keywords turn up, check the word against the list of defines
119
120 if( defined_list != NULL ){
121 def_ptr = defined_list[key];
122
123 while( def_ptr != NULL ){
124
125 matched = !strcmp( text, def_ptr->defined );
126 if( matched ) return DEFINED;
127
128 def_ptr = def_ptr->next;
129 }
130 }
131
132 return 0; //search failed
133 }
134
135 /*
136 * This is used to test whether a given word is defined
137 * returns 1 if true, 0 if False.
138 */
139
140 int is_defined( char* text ){
141
142 int matched = 0;
143 int key;
144 struct defined_element* def_ptr; // points to the current define element
145
146 key = hash( text );
147
148 if( defined_list != NULL ){
149 def_ptr = defined_list[key];
150
151 while( def_ptr != NULL ){
152
153 matched = !strcmp( text, def_ptr->defined );
154 if( matched ) return 1; // search succesful
155
156 def_ptr = def_ptr->next;
157 }
158 }
159
160 return 0; //search failed
161 }
162
163 /*
164 * The next bit returns the text to substitute for any given define.
165 */
166
167 char* get_definition( char* defined ){
168 int key;
169 int matched = 0;
170 struct defined_element* def_ptr;
171
172 if( defined_list != NULL ){
173
174 key = hash( defined );
175 def_ptr = defined_list[key];
176
177 while( def_ptr != NULL ){
178
179 matched = !strcmp( defined, def_ptr->defined );
180 if( matched ) return def_ptr->definition;
181
182 def_ptr = def_ptr->next;
183 }
184 }
185
186 // search failed, therefore there is an error
187
188 sprintf( painCave.errMsg, "%s was not found in the defined list\n",
189 defined );
190 painCave.isFatal = 1;
191 simError();
192 return NULL;
193 }
194
195 /*
196 * Add a define statement to the hash table
197 */
198
199 void insert_define( char* defined, char* definition ){
200
201 int i, key;
202 struct defined_element* element;
203
204 if( defined_list == NULL ){
205
206 defined_list = ( struct defined_element** )
207 calloc( HASH_SIZE, sizeof( struct defined_element* ) );
208
209 for( i=0; i<HASH_SIZE; i++ ){
210
211 defined_list[i] = NULL;
212 }
213 }
214
215 key = hash( defined );
216 element = (struct defined_element* )
217 malloc( sizeof( struct defined_element ) );
218
219 // fill the element
220
221 strcpy( element->defined, defined );
222 strcpy( element->definition, definition );
223
224 // add the element to the table
225
226 element->next = defined_list[key];
227 defined_list[key] = element;
228 }
229
230 /*
231 * adds an element to the hash table
232 */
233
234 void add_res_element( char* text, int the_token ){
235
236 int key; // the calculated hash key;
237 struct res_element* element; // the element being added
238
239 key = hash( text );
240 element = (struct res_element *) malloc( sizeof( struct res_element ) );
241
242 // fill the element
243
244 strcpy( element->word, text );
245 element->token = the_token;
246
247 // add the element to the table
248
249 element->next = reserved[key];
250 reserved[key] = element;
251 }
252
253 /*
254 generartes the hash key from the given word.
255 */
256
257 int hash ( char* text ){
258
259 register unsigned short int i = 0; // loop counter
260 int key = 0; // the hash key
261
262 while( text[i] != '\0' ){
263
264 key = ( ( key << SHIFT ) + text[i] ) % HASH_SIZE;
265
266 i++;
267 }
268
269 if( key < 0 ){
270
271 // if the key is less than zero, we've had an overflow error
272
273 sprintf( painCave.errMsg,
274 "Bass Parse: There has been an overflow error in the hash key.");
275 painCave.isFatal =1;
276 simError();
277 }
278
279 return key;
280 }
281
282 /*
283 function to clean up the memory after we are finished with the lists
284 */
285
286 void kill_lists( ){
287
288 struct res_element* current_res_ptr;
289 struct res_element* temp_res_ptr;
290
291 struct defined_element* current_def_ptr;
292 struct defined_element* temp_def_ptr;
293
294 register unsigned short int i;
295
296 if( reserved != NULL ){
297
298 for( i=0; i < HASH_SIZE; i++){
299
300 current_res_ptr = reserved[i];
301
302 while( current_res_ptr != NULL ){
303
304 temp_res_ptr = current_res_ptr->next;
305 free( current_res_ptr );
306 current_res_ptr = temp_res_ptr;
307 }
308 }
309
310 free( reserved );
311 }
312
313 if( defined_list != NULL ){
314
315 for( i=0; i < HASH_SIZE; i++){
316
317 current_def_ptr = defined_list[i];
318
319 while( current_def_ptr != NULL ){
320
321 temp_def_ptr = current_def_ptr->next;
322 free( current_def_ptr );
323 current_def_ptr = temp_def_ptr;
324 }
325 }
326
327 free( defined_list );
328 }
329
330 reserved = NULL;
331 defined_list = NULL;
332
333 is_initialized = 0; // initialization is now false
334 }