ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-2.0/src/io/BASS_parse.c
Revision: 1930
Committed: Wed Jan 12 22:41:40 2005 UTC (19 years, 5 months ago) by gezelter
Content type: text/plain
File size: 9302 byte(s)
Log Message:
merging new_design branch into OOPSE-2.0

File Contents

# User Rev Content
1 gezelter 1930 /*
2     * Copyright (c) 2005 The University of Notre Dame. All Rights Reserved.
3     *
4     * The University of Notre Dame grants you ("Licensee") a
5     * non-exclusive, royalty free, license to use, modify and
6     * redistribute this software in source and binary code form, provided
7     * that the following conditions are met:
8     *
9     * 1. Acknowledgement of the program authors must be made in any
10     * publication of scientific results based in part on use of the
11     * program. An acceptable form of acknowledgement is citation of
12     * the article in which the program was described (Matthew
13     * A. Meineke, Charles F. Vardeman II, Teng Lin, Christopher
14     * J. Fennell and J. Daniel Gezelter, "OOPSE: An Object-Oriented
15     * Parallel Simulation Engine for Molecular Dynamics,"
16     * J. Comput. Chem. 26, pp. 252-271 (2005))
17     *
18     * 2. Redistributions of source code must retain the above copyright
19     * notice, this list of conditions and the following disclaimer.
20     *
21     * 3. Redistributions in binary form must reproduce the above copyright
22     * notice, this list of conditions and the following disclaimer in the
23     * documentation and/or other materials provided with the
24     * distribution.
25     *
26     * This software is provided "AS IS," without a warranty of any
27     * kind. All express or implied conditions, representations and
28     * warranties, including any implied warranty of merchantability,
29     * fitness for a particular purpose or non-infringement, are hereby
30     * excluded. The University of Notre Dame and its licensors shall not
31     * be liable for any damages suffered by licensee as a result of
32     * using, modifying or distributing the software or its
33     * derivatives. In no event will the University of Notre Dame or its
34     * licensors be liable for any lost revenue, profit or data, or for
35     * direct, indirect, special, consequential, incidental or punitive
36     * damages, however caused and regardless of the theory of liability,
37     * arising out of the use of or inability to use software, even if the
38     * University of Notre Dame has been advised of the possibility of
39     * such damages.
40     */
41    
42 gezelter 1490 #include <stdio.h>
43     #include <stdlib.h>
44     #include <string.h>
45    
46     #include "BASSyacc.h"
47 tim 1492 #include "io/BASS_parse.h"
48     #include "utils/simError.h"
49 gezelter 1490 #ifdef IS_MPI
50     #define __is_lex__
51 tim 1492 #include "io/mpiBASS.h"
52 gezelter 1490 #endif
53    
54     #define HASH_SIZE 211 // the size of the hash table
55     #define SHIFT 4 // the bit shift for the hash index
56    
57    
58     //*** Global functions, variables, and structures ************
59    
60     unsigned short is_initialized = 0; // tells whether to init the linked list
61    
62     // reserved word elements for the hash table
63     struct res_element{
64     char word[100]; //the reserved word
65     int token; //the token to return;
66     struct res_element* next;
67     };
68    
69     struct res_element** reserved = NULL; //the table of reserved words
70    
71     void initialize_res_list(void); // function to initialize the list
72    
73     int hash ( char* text ); // generates the hash key
74    
75     void add_res_element( char* text, int the_token ); //adds elements to the table
76    
77     // the elements of the defined Hash table
78     struct defined_element{
79     char defined[100];
80     char definition[DEFINED_BUFFER_SIZE];
81     struct defined_element* next;
82     };
83    
84     struct defined_element** defined_list = NULL; // the defined hash table
85    
86    
87    
88     //*** The Functions *******************************************
89    
90    
91     /*
92     function to initialize the list of reserved words into memory.
93     */
94    
95     void initialize_res_list(){
96    
97     register unsigned short i; // loop counter
98    
99     reserved = ( struct res_element ** )
100     calloc( HASH_SIZE, sizeof( struct hash__element* ) );
101    
102     for( i=0; i < HASH_SIZE; i++ ){
103    
104     reserved[i] = NULL;
105     }
106    
107     // add the reserved words
108    
109     add_res_element( "molecule", MOLECULE );
110     add_res_element( "atom", ATOM );
111     add_res_element( "bond", BOND );
112     add_res_element( "bend", BEND );
113     add_res_element( "torsion", TORSION );
114     add_res_element( "position", POSITION );
115     add_res_element( "members", MEMBERS );
116     add_res_element( "constraint", CONSTRAINT );
117     add_res_element( "component", COMPONENT );
118     add_res_element( "zConstraint", ZCONSTRAINT );
119     add_res_element( "orientation", ORIENTATION );
120     add_res_element( "rigidBody", RIGIDBODY );
121     add_res_element( "cutoffGroup", CUTOFFGROUP );
122    
123     is_initialized = 1; // set the initialization boolean to true
124     }
125    
126    
127     /*
128     checks for reserved words.
129     If a reserved word is found, returns the token,
130     else returns 0.
131     */
132    
133     int res_word( char* text ){
134    
135     int matched = 0;
136     int key; // the hash key
137     struct res_element* current_ptr; // points to the current hash element
138     struct defined_element* def_ptr; // points to the current define element
139    
140     if( !is_initialized ){ // initialize the list if not already done
141    
142     initialize_res_list();
143     }
144    
145     // get the hash key
146    
147     key = hash( text );
148     current_ptr = reserved[key];
149    
150     // walk through possible mutiple entries
151    
152     while( current_ptr != NULL ){
153    
154     matched = !strcmp( text, current_ptr->word );
155     if( matched ) return current_ptr->token; // search successful
156    
157     current_ptr = current_ptr->next;
158     }
159    
160     // if no keywords turn up, check the word against the list of defines
161    
162     if( defined_list != NULL ){
163    
164     def_ptr = defined_list[key];
165    
166     while( def_ptr != NULL ){
167    
168     matched = !strcmp( text, def_ptr->defined );
169     if( matched ) return DEFINED;
170    
171     def_ptr = def_ptr->next;
172     }
173     }
174    
175     return 0; //search failed
176     }
177    
178     /*
179     * This is used to test whether a given word is defined
180     * returns 1 if true, 0 if False.
181     */
182    
183     int is_defined( char* text ){
184    
185     int matched = 0;
186     int key;
187     struct defined_element* def_ptr; // points to the current define element
188    
189     key = hash( text );
190    
191     if( defined_list != NULL ){
192     def_ptr = defined_list[key];
193    
194     while( def_ptr != NULL ){
195    
196     matched = !strcmp( text, def_ptr->defined );
197     if( matched ) return 1; // search succesful
198    
199     def_ptr = def_ptr->next;
200     }
201     }
202    
203     return 0; //search failed
204     }
205    
206     /*
207     * The next bit returns the text to substitute for any given define.
208     */
209    
210     char* get_definition( char* defined ){
211     int key;
212     int matched = 0;
213     struct defined_element* def_ptr;
214    
215     if( defined_list != NULL ){
216    
217     key = hash( defined );
218     def_ptr = defined_list[key];
219    
220     while( def_ptr != NULL ){
221    
222     matched = !strcmp( defined, def_ptr->defined );
223     if( matched ) return def_ptr->definition;
224    
225     def_ptr = def_ptr->next;
226     }
227     }
228    
229     // search failed, therefore there is an error
230    
231     sprintf( painCave.errMsg, "%s was not found in the defined list\n",
232     defined );
233     painCave.isFatal = 1;
234     simError();
235     return NULL;
236     }
237    
238     /*
239     * Add a define statement to the hash table
240     */
241    
242     void insert_define( char* defined, char* definition ){
243    
244     int i, key;
245     struct defined_element* element;
246    
247     if( defined_list == NULL ){
248    
249     defined_list = ( struct defined_element** )
250     calloc( HASH_SIZE, sizeof( struct defined_element* ) );
251    
252     for( i=0; i<HASH_SIZE; i++ ){
253    
254     defined_list[i] = NULL;
255     }
256     }
257    
258     key = hash( defined );
259     element = (struct defined_element* )
260     malloc( sizeof( struct defined_element ) );
261    
262     // fill the element
263    
264     strcpy( element->defined, defined );
265     strcpy( element->definition, definition );
266    
267     // add the element to the table
268    
269     element->next = defined_list[key];
270     defined_list[key] = element;
271     }
272    
273     /*
274     * adds an element to the hash table
275     */
276    
277     void add_res_element( char* text, int the_token ){
278    
279     int key; // the calculated hash key;
280     struct res_element* element; // the element being added
281    
282     key = hash( text );
283     element = (struct res_element *) malloc( sizeof( struct res_element ) );
284    
285     // fill the element
286    
287     strcpy( element->word, text );
288     element->token = the_token;
289    
290     // add the element to the table
291    
292     element->next = reserved[key];
293     reserved[key] = element;
294     }
295    
296     /*
297     generartes the hash key from the given word.
298     */
299    
300     int hash ( char* text ){
301    
302     register unsigned short int i = 0; // loop counter
303     int key = 0; // the hash key
304    
305     while( text[i] != '\0' ){
306    
307     key = ( ( key << SHIFT ) + text[i] ) % HASH_SIZE;
308    
309     i++;
310     }
311    
312     if( key < 0 ){
313    
314     // if the key is less than zero, we've had an overflow error
315    
316     sprintf( painCave.errMsg,
317     "Meta-data parse error: There has been an overflow error in the hash key.");
318     painCave.isFatal =1;
319     simError();
320     }
321    
322     return key;
323     }
324    
325     /*
326     function to clean up the memory after we are finished with the lists
327     */
328    
329     void kill_lists( ){
330    
331     struct res_element* current_res_ptr;
332     struct res_element* temp_res_ptr;
333    
334     struct defined_element* current_def_ptr;
335     struct defined_element* temp_def_ptr;
336    
337     register unsigned short int i;
338    
339     if( reserved != NULL ){
340    
341     for( i=0; i < HASH_SIZE; i++){
342    
343     current_res_ptr = reserved[i];
344    
345     while( current_res_ptr != NULL ){
346    
347     temp_res_ptr = current_res_ptr->next;
348     free( current_res_ptr );
349     current_res_ptr = temp_res_ptr;
350     }
351     }
352    
353     free( reserved );
354     }
355    
356     if( defined_list != NULL ){
357    
358     for( i=0; i < HASH_SIZE; i++){
359    
360     current_def_ptr = defined_list[i];
361    
362     while( current_def_ptr != NULL ){
363    
364     temp_def_ptr = current_def_ptr->next;
365     free( current_def_ptr );
366     current_def_ptr = temp_def_ptr;
367     }
368     }
369    
370     free( defined_list );
371     }
372    
373     reserved = NULL;
374     defined_list = NULL;
375    
376     is_initialized = 0; // initialization is now false
377     }