ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE/libBASS/make_nodes.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: 8482 byte(s)
Log Message:
member list fixes for rigid bodies

File Contents

# User Rev Content
1 mmeineke 377 #include <stdio.h>
2     #include <stdlib.h>
3     #include <string.h>
4    
5 mmeineke 854 #include "node_list.h"
6     #include "make_nodes.h"
7     #include "simError.h"
8 mmeineke 377
9     /*
10     walks to to the top of a stmt_list. Needed when assigning the
11     statment list to a block of code.
12     */
13    
14     struct node_tag* walk_to_top( struct node_tag* walk_me ){
15    
16     while( walk_me->prev_stmt != NULL ){
17     walk_me = walk_me->prev_stmt;
18     }
19     return walk_me;
20     }
21    
22     /*
23 mmeineke 675 the next three functions are for creating and initializing the
24 mmeineke 377 assignment statements.
25     */
26    
27     struct node_tag* assign_i( char* lhs, int rhs ){
28    
29     struct node_tag* the_node;
30     the_node = ( struct node_tag* )malloc( sizeof( node ) );
31    
32     the_node->type = ASSIGNMENT_STMT;
33     the_node->index = 0;
34     the_node->next_stmt = NULL;
35     the_node->prev_stmt = NULL;
36     the_node->stmt_list = NULL;
37    
38     the_node->the_data.asmt.type = INT_ASSN;
39     the_node->the_data.asmt.identifier = lhs;
40     the_node->the_data.asmt.rhs.i_val = rhs;
41    
42     return the_node;
43     }
44    
45     struct node_tag* assign_d( char* lhs, double rhs ){
46    
47     struct node_tag* the_node;
48     the_node = ( struct node_tag* )malloc( sizeof( node ) );
49    
50     the_node->type = ASSIGNMENT_STMT;
51     the_node->index = 0;
52     the_node->next_stmt = NULL;
53     the_node->prev_stmt = NULL;
54     the_node->stmt_list = NULL;
55    
56     the_node->the_data.asmt.type = DOUBLE_ASSN;
57     the_node->the_data.asmt.identifier = lhs;
58     the_node->the_data.asmt.rhs.d_val = rhs;
59    
60     return the_node;
61     }
62    
63     struct node_tag* assign_s( char* lhs, char* rhs ){
64    
65     struct node_tag* the_node;
66     the_node = ( struct node_tag* )malloc( sizeof( node ) );
67    
68     the_node->type = ASSIGNMENT_STMT;
69     the_node->index = 0;
70     the_node->next_stmt = NULL;
71     the_node->prev_stmt = NULL;
72     the_node->stmt_list = NULL;
73    
74     the_node->the_data.asmt.type = STR_ASSN;
75     the_node->the_data.asmt.identifier = lhs;
76     the_node->the_data.asmt.rhs.str_ptr = rhs;
77    
78     return the_node;
79     }
80    
81     /*
82 gezelter 998 The next function deals with creating and initializing of the
83     members statements used by the bonds, bends, torsions, and rigid bodies.
84 mmeineke 377 */
85    
86 gezelter 998 struct node_tag* members( char* list_str ){
87 mmeineke 377
88     struct node_tag* the_node;
89     the_node = ( struct node_tag* )malloc( sizeof( node ) );
90    
91 gezelter 988 the_node->type = MEMBERS_STMT;
92 mmeineke 377 the_node->index = 0;
93     the_node->next_stmt = NULL;
94     the_node->prev_stmt = NULL;
95     the_node->stmt_list = NULL;
96    
97 gezelter 998 int nTokens, i;
98     char *foo;
99 mmeineke 377
100 gezelter 998 nTokens = count_tokens(list_str, " ,;\t");
101 mmeineke 377
102 gezelter 998 if (nTokens < 1) {
103     yyerror("can't find any members in this members statement");
104     }
105 mmeineke 377
106 gezelter 998 the_node->the_data.mbrs.nMembers = nTokens;
107 mmeineke 377
108 gezelter 998 the_node->the_data.mbrs.memberList = (int *) calloc(nTokens, sizeof(int));
109 mmeineke 377
110 gezelter 998 foo = strtok(list_str, " ,;\t");
111     the_node->the_data.mbrs.memberList[0] = atoi( foo );
112 mmeineke 377
113 gezelter 998 for (i = 1; i < nTokens; i++) {
114     foo = strtok(NULL, " ,;\t");
115     the_node->the_data.mbrs.memberList[i] = atoi( foo );
116     }
117 mmeineke 377
118     return the_node;
119     }
120    
121     /*
122     This function does the C & I of the constraint statements
123     */
124    
125 gezelter 998 struct node_tag* constraint( char* list_str ){
126 mmeineke 377
127     struct node_tag* the_node;
128     the_node = ( struct node_tag* )malloc( sizeof( node ) );
129    
130     the_node->type = CONSTRAINT_STMT;
131     the_node->index = 0;
132     the_node->next_stmt = NULL;
133     the_node->prev_stmt = NULL;
134     the_node->stmt_list = NULL;
135    
136 gezelter 998 int nTokens;
137     char *foo;
138 mmeineke 377
139 gezelter 998 nTokens = count_tokens(list_str, " ,;\t");
140     if (nTokens != 1) {
141     yyerror("wrong number of arguments given in constraint statement");
142     }
143    
144     foo = strtok(list_str, " ,;\t");
145     the_node->the_data.cnstr.constraint_val = atof( foo );
146    
147 mmeineke 377 return the_node;
148     }
149    
150     /*
151     This function does the C & I for the orientation statements
152     */
153    
154 gezelter 998 struct node_tag* orientation( char* list_str ){
155 mmeineke 377
156     struct node_tag* the_node;
157     the_node = ( struct node_tag* )malloc( sizeof( node ) );
158    
159     the_node->type = ORIENTATION_STMT;
160     the_node->index = 0;
161     the_node->next_stmt = NULL;
162     the_node->prev_stmt = NULL;
163     the_node->stmt_list = NULL;
164 gezelter 998
165     int nTokens;
166     char *foo;
167    
168     nTokens = count_tokens(list_str, " ,;\t");
169     if (nTokens != 3) {
170     yyerror("wrong number of arguments given in orientation");
171     }
172    
173     foo = strtok(list_str, " ,;\t");
174     the_node->the_data.ort.phi = atof( foo );
175    
176     foo = strtok(NULL, " ,;\t");
177     the_node->the_data.ort.theta = atof( foo );
178    
179     foo = strtok(NULL, " ,;\t");
180     the_node->the_data.ort.psi = atof( foo );
181    
182 mmeineke 377 return the_node;
183     }
184    
185     /*
186     This function does the C & I for the position statements
187     */
188    
189 gezelter 998 struct node_tag* position( char* list_str ){
190 mmeineke 377
191     struct node_tag* the_node;
192     the_node = ( struct node_tag* )malloc( sizeof( node ) );
193    
194     the_node->type = POSITION_STMT;
195     the_node->index = 0;
196     the_node->next_stmt = NULL;
197     the_node->prev_stmt = NULL;
198     the_node->stmt_list = NULL;
199 gezelter 998
200     int nTokens;
201     char *foo;
202    
203     nTokens = count_tokens(list_str, " ,;\t");
204     if (nTokens != 3) {
205     yyerror("wrong number of arguments given in position");
206     }
207    
208     foo = strtok(list_str, " ,;\t");
209     the_node->the_data.pos.x = atof( foo );
210    
211     foo = strtok(NULL, " ,;\t");
212     the_node->the_data.pos.y = atof( foo );
213    
214     foo = strtok(NULL, " ,;\t");
215     the_node->the_data.pos.z = atof( foo );
216    
217 mmeineke 377
218     return the_node;
219     }
220    
221     /*
222     The following six functions initialize the statement nodes
223     coresponding to the different code block types.
224     */
225    
226     struct node_tag* molecule_blk( struct node_tag* stmt_list ){
227    
228     struct node_tag* the_node;
229     the_node = ( struct node_tag* )malloc( sizeof( node ) );
230    
231     the_node->type = MOLECULE_HEAD;
232     the_node->index = 0;
233     the_node->next_stmt = NULL;
234     the_node->prev_stmt = NULL;
235     the_node->stmt_list = walk_to_top( stmt_list );
236    
237     return the_node;
238     }
239    
240 gezelter 957 struct node_tag* rigidbody_blk( int index, struct node_tag* stmt_list ){
241    
242     struct node_tag* the_node;
243     the_node = ( struct node_tag* )malloc( sizeof( node ) );
244    
245     the_node->type = RIGIDBODY_HEAD;
246     the_node->index = 0;
247     the_node->next_stmt = NULL;
248     the_node->prev_stmt = NULL;
249     the_node->stmt_list = walk_to_top( stmt_list );
250    
251     return the_node;
252     }
253    
254 mmeineke 377 struct node_tag* atom_blk( int index, struct node_tag* stmt_list ){
255    
256     struct node_tag* the_node;
257     the_node = ( struct node_tag* )malloc( sizeof( node ) );
258    
259     the_node->type = ATOM_HEAD;
260     the_node->index = index;
261     the_node->next_stmt = NULL;
262     the_node->prev_stmt = NULL;
263     the_node->stmt_list = walk_to_top( stmt_list );
264    
265     return the_node;
266     }
267    
268     struct node_tag* bond_blk( int index, struct node_tag* stmt_list ){
269    
270     struct node_tag* the_node;
271     the_node = ( struct node_tag* )malloc( sizeof( node ) );
272    
273     the_node->type = BOND_HEAD;
274     the_node->index = index;
275     the_node->next_stmt = NULL;
276     the_node->prev_stmt = NULL;
277     the_node->stmt_list = walk_to_top( stmt_list );
278    
279     return the_node;
280     }
281    
282     struct node_tag* bend_blk( int index, struct node_tag* stmt_list ){
283    
284     struct node_tag* the_node;
285     the_node = ( struct node_tag* )malloc( sizeof( node ) );
286    
287     the_node->type = BEND_HEAD;
288     the_node->index = index;
289     the_node->next_stmt = NULL;
290     the_node->prev_stmt = NULL;
291     the_node->stmt_list = walk_to_top( stmt_list );
292    
293     return the_node;
294     }
295    
296     struct node_tag* torsion_blk( int index, struct node_tag* stmt_list ){
297    
298     struct node_tag* the_node;
299     the_node = ( struct node_tag* )malloc( sizeof( node ) );
300    
301     the_node->type = TORSION_HEAD;
302     the_node->index = index;
303     the_node->next_stmt = NULL;
304     the_node->prev_stmt = NULL;
305     the_node->stmt_list = walk_to_top( stmt_list );
306    
307     return the_node;
308     }
309 mmeineke 675
310     struct node_tag* zconstraint_blk( int index, struct node_tag* stmt_list ){
311    
312     struct node_tag* the_node;
313     the_node = ( struct node_tag* )malloc( sizeof( node ) );
314    
315     the_node->type = ZCONSTRAINT_HEAD;
316     the_node->index = index;
317     the_node->next_stmt = NULL;
318     the_node->prev_stmt = NULL;
319     the_node->stmt_list = walk_to_top( stmt_list );
320    
321     return the_node;
322     }
323 mmeineke 377
324     struct node_tag* component_blk( struct node_tag* stmt_list ){
325    
326     struct node_tag* the_node;
327     the_node = ( struct node_tag* )malloc( sizeof( node ) );
328    
329     the_node->type = COMPONENT_HEAD;
330     the_node->index = 0;
331     the_node->next_stmt = NULL;
332     the_node->prev_stmt = NULL;
333     the_node->stmt_list = walk_to_top( stmt_list );
334    
335     return the_node;
336     }
337 gezelter 998
338    
339     int count_tokens(char *line, char *delimiters) {
340     /* PURPOSE: RETURN A COUNT OF THE NUMBER OF TOKENS ON THE LINE. */
341    
342     char *working_line; /* WORKING COPY OF LINE. */
343     int ntokens; /* NUMBER OF TOKENS FOUND IN LINE. */
344     char *strtok_ptr; /* POINTER FOR STRTOK. */
345    
346     strtok_ptr= working_line= strdup(line);
347    
348     ntokens=0;
349     while (strtok(strtok_ptr,delimiters)!=NULL)
350     {
351     ntokens++;
352     strtok_ptr=NULL;
353     }
354    
355     free(working_line);
356     return(ntokens);
357     }