ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libBASS/BASS_parse.c
Revision: 378
Committed: Fri Mar 21 17:42:12 2003 UTC (21 years, 3 months ago) by mmeineke
Content type: text/plain
File size: 7112 byte(s)
Log Message:
This commit was generated by cvs2svn to compensate for changes in r377,
which included commits to RCS files with non-trunk default branches.

File Contents

# User Rev Content
1 mmeineke 377 #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( "startIndex", START_INDEX );
78     add_res_element( "orientation", ORIENTATION );
79    
80     is_initialized = 1; // set the initialization boolean to true
81     }
82    
83    
84     /*
85     checks for reserved words.
86     If a reserved word is found, returns the token,
87     else returns 0.
88     */
89    
90     int res_word( char* text ){
91    
92     int matched = 0;
93     int key; // the hash key
94     struct res_element* current_ptr; // points to the current hash element
95     struct defined_element* def_ptr; // points to the current define element
96    
97     if( !is_initialized ){ // initialize the list if not already done
98    
99     initialize_res_list();
100     }
101    
102     // get the hash key
103    
104     key = hash( text );
105     current_ptr = reserved[key];
106    
107     // walk through possible mutiple entries
108    
109     while( current_ptr != NULL ){
110    
111     matched = !strcmp( text, current_ptr->word );
112     if( matched ) return current_ptr->token; // search successful
113    
114     current_ptr = current_ptr->next;
115     }
116    
117     // if no keywords turn up, check the word against the list of defines
118    
119     if( defined_list != NULL ){
120     def_ptr = defined_list[key];
121    
122     while( def_ptr != NULL ){
123    
124     matched = !strcmp( text, def_ptr->defined );
125     if( matched ) return DEFINED;
126    
127     def_ptr = def_ptr->next;
128     }
129     }
130    
131     return 0; //search failed
132     }
133    
134     /*
135     * This is used to test whether a given word is defined
136     * returns 1 if true, 0 if False.
137     */
138    
139     int is_defined( char* text ){
140    
141     int matched = 0;
142     int key;
143     struct defined_element* def_ptr; // points to the current define element
144    
145     key = hash( text );
146    
147     if( defined_list != NULL ){
148     def_ptr = defined_list[key];
149    
150     while( def_ptr != NULL ){
151    
152     matched = !strcmp( text, def_ptr->defined );
153     if( matched ) return 1; // search succesful
154    
155     def_ptr = def_ptr->next;
156     }
157     }
158    
159     return 0; //search failed
160     }
161    
162     /*
163     * The next bit returns the text to substitute for any given define.
164     */
165    
166     char* get_definition( char* defined ){
167     int key;
168     int matched = 0;
169     struct defined_element* def_ptr;
170    
171     if( defined_list != NULL ){
172    
173     key = hash( defined );
174     def_ptr = defined_list[key];
175    
176     while( def_ptr != NULL ){
177    
178     matched = !strcmp( defined, def_ptr->defined );
179     if( matched ) return def_ptr->definition;
180    
181     def_ptr = def_ptr->next;
182     }
183     }
184    
185     // search failed, therefore there is an error
186    
187     sprintf( painCave.errMsg, "%s was not found in the defined list\n",
188     defined );
189     painCave.isFatal = 1;
190     simError();
191     return NULL;
192     }
193    
194     /*
195     * Add a define statement to the hash table
196     */
197    
198     void insert_define( char* defined, char* definition ){
199    
200     int i, key;
201     struct defined_element* element;
202    
203     if( defined_list == NULL ){
204    
205     defined_list = ( struct defined_element** )
206     calloc( HASH_SIZE, sizeof( struct defined_element* ) );
207    
208     for( i=0; i<HASH_SIZE; i++ ){
209    
210     defined_list[i] = NULL;
211     }
212     }
213    
214     key = hash( defined );
215     element = (struct defined_element* )
216     malloc( sizeof( struct defined_element ) );
217    
218     // fill the element
219    
220     strcpy( element->defined, defined );
221     strcpy( element->definition, definition );
222    
223     // add the element to the table
224    
225     element->next = defined_list[key];
226     defined_list[key] = element;
227     }
228    
229     /*
230     * adds an element to the hash table
231     */
232    
233     void add_res_element( char* text, int the_token ){
234    
235     int key; // the calculated hash key;
236     struct res_element* element; // the element being added
237    
238     key = hash( text );
239     element = (struct res_element *) malloc( sizeof( struct res_element ) );
240    
241     // fill the element
242    
243     strcpy( element->word, text );
244     element->token = the_token;
245    
246     // add the element to the table
247    
248     element->next = reserved[key];
249     reserved[key] = element;
250     }
251    
252     /*
253     generartes the hash key from the given word.
254     */
255    
256     int hash ( char* text ){
257    
258     register unsigned short int i = 0; // loop counter
259     int key = 0; // the hash key
260    
261     while( text[i] != '\0' ){
262    
263     key = ( ( key << SHIFT ) + text[i] ) % HASH_SIZE;
264    
265     i++;
266     }
267    
268     if( key < 0 ){
269    
270     // if the key is less than zero, we've had an overflow error
271    
272     sprintf( painCave.errMsg,
273     "Bass Parse: There has been an overflow error in the hash key.");
274     painCave.isFatal =1;
275     simError();
276     }
277    
278     return key;
279     }
280    
281     /*
282     function to clean up the memory after we are finished with the lists
283     */
284    
285     void kill_lists( ){
286    
287     struct res_element* current_res_ptr;
288     struct res_element* temp_res_ptr;
289    
290     struct defined_element* current_def_ptr;
291     struct defined_element* temp_def_ptr;
292    
293     register unsigned short int i;
294    
295     if( reserved != NULL ){
296    
297     for( i=0; i < HASH_SIZE; i++){
298    
299     current_res_ptr = reserved[i];
300    
301     while( current_res_ptr != NULL ){
302    
303     temp_res_ptr = current_res_ptr->next;
304     free( current_res_ptr );
305     current_res_ptr = temp_res_ptr;
306     }
307     }
308    
309     free( reserved );
310     }
311    
312     if( defined_list != NULL ){
313    
314     for( i=0; i < HASH_SIZE; i++){
315    
316     current_def_ptr = defined_list[i];
317    
318     while( current_def_ptr != NULL ){
319    
320     temp_def_ptr = current_def_ptr->next;
321     free( current_def_ptr );
322     current_def_ptr = temp_def_ptr;
323     }
324     }
325    
326     free( defined_list );
327     }
328    
329     reserved = NULL;
330     defined_list = NULL;
331    
332     is_initialized = 0; // initialization is now false
333     }