convert line ends
[canaan.git] / prj / tech / libsrc / mp / mplist.c
blob650d4e99ea8ee7d412fd221f8693e53532172e4e
1 //
2 // mplist.c - Multiped motion list management.
3 //
5 #include <multiped.h>
8 extern mps_motion_state_callback mp_motion_start_callback;
9 extern mps_motion_state_callback mp_motion_end_callback;
13 void mp_list_init(mps_motion_list * list)
15 list->count = 0;
16 list->head = NULL;
17 list->tail = NULL;
18 list->flags = 0;
23 void mp_list_free(mps_motion_list * list)
25 mps_stack_node * node = list->head, * temp;
27 while (node)
29 temp = node->next;
30 if (node->type == MN_MOTION)
32 mps_motion_node * m = (mps_motion_node *) node;
33 if (m->targets)
35 mp_free(m->targets);
36 m->targets = NULL;
38 if(mp_motion_end_callback)
40 int mnum=MP_MOTNUM_FROM_NODE_HANDLE(m->handle);
42 // check motion is not a pose
43 if(mnum!=MP_MOTNUM_FROM_NODE_HANDLE(-1))
44 mp_motion_end_callback(mnum);
48 mp_free(node);
49 node = temp;
52 list->head = NULL;
53 list->tail = NULL;
54 list->count = 0;
59 void mp_list_add(mps_motion_list * list, mps_stack_node * node)
61 if(node->type==MN_MOTION && mp_motion_start_callback)
63 mps_motion_node *m=(mps_motion_node *)node;
64 int mnum=MP_MOTNUM_FROM_NODE_HANDLE(m->handle);
66 // check motion is not a pose
67 if(mnum!=MP_MOTNUM_FROM_NODE_HANDLE(-1))
68 mp_motion_start_callback(mnum);
70 if (list->tail)
72 list->tail->next = node;
73 node->prev = list->tail;
74 node->next = NULL;
75 list->tail = node;
77 else
79 // Empty list.
80 list->head =
81 list->tail = node;
82 node->prev =
83 node->next = NULL;
86 list->count++;
91 void mp_list_remove(mps_motion_list * list, mps_stack_node * node)
93 mps_stack_node * p = node->prev;
94 mps_stack_node * n = node->next;
96 if(node->type==MN_MOTION && mp_motion_end_callback)
98 mps_motion_node *m=(mps_motion_node *)node;
99 int mnum=MP_MOTNUM_FROM_NODE_HANDLE(m->handle);
101 // check motion is not a pose
102 if(mnum!=MP_MOTNUM_FROM_NODE_HANDLE(-1))
103 mp_motion_end_callback(mnum);
105 if (p)
107 p->next = n;
109 else
111 // Node is head of list.
112 list->head = n;
115 if (n)
117 n->prev = p;
119 else
121 // Node is tail of list.
122 list->tail = p;
125 if (node->type == MN_MOTION)
127 mps_motion_node * m = (mps_motion_node *) node;
128 if (m->targets)
130 mp_free(m->targets);
131 m->targets = NULL;
135 mp_free(node);
137 list->count--;
142 mps_stack_node * mp_list_traverse(mps_motion_list * list, mps_stack_node * node)
144 mps_stack_node * result;
145 if (node)
147 result = node->next;
149 else
151 result = list->head;
153 return result;
158 BOOL mp_list_clone(mps_motion_list *dst, mps_motion_list *src)
160 mps_stack_node *node=NULL,*newnode;
162 mp_list_init(dst);
164 while(node=mp_list_traverse(src,node))
166 if(node->type==MN_MOTION)
168 if(!(newnode=mp_alloc(sizeof(mps_motion_node),__FILE__, __LINE__)))
170 mp_list_free(dst);
171 return FALSE;
173 memcpy(newnode,node,sizeof(mps_motion_node));
174 if(((mps_motion_node *)node)->targets)
176 ((mps_motion_node *)newnode)->targets=Malloc(MSize(((mps_motion_node *)node)->targets)); // XXX this may copy more than necessary
177 memcpy(((mps_motion_node *)newnode)->targets,((mps_motion_node *)node)->targets,MSize(((mps_motion_node *)node)->targets));
179 } else
181 if(!(newnode=mp_alloc(sizeof(mps_transition_node),__FILE__, __LINE__)))
183 mp_list_free(dst);
184 return FALSE;
186 memcpy(newnode,node,sizeof(mps_transition_node));
188 mp_list_add(dst,newnode);
190 return TRUE;