FreeCalypso > hg > freecalypso-sw
comparison gsm-fw/g23m-aci/aci/aci_lst.c @ 775:eedbf248bac0
gsm-fw/g23m-aci subtree: initial import from LoCosto source
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Sun, 12 Oct 2014 01:45:14 +0000 |
parents | |
children | 79ccc6a27a95 |
comparison
equal
deleted
inserted
replaced
774:40a721fd9854 | 775:eedbf248bac0 |
---|---|
1 /* | |
2 +----------------------------------------------------------------------------- | |
3 | Project : GSM-PS (6147) | |
4 | Modul : aci_lst | |
5 +----------------------------------------------------------------------------- | |
6 | Copyright 2002 Texas Instruments Berlin, AG | |
7 | All rights reserved. | |
8 | | |
9 | This file is confidential and a trade secret of Texas | |
10 | Instruments Berlin, AG | |
11 | The receipt of or possession of this file does not convey | |
12 | any rights to reproduce or disclose its contents or to | |
13 | manufacture, use, or sell anything it may describe, in | |
14 | whole, or in part, without the specific written consent of | |
15 | Texas Instruments Berlin, AG. | |
16 +----------------------------------------------------------------------------- | |
17 | Purpose : Process lists in ACI | |
18 +----------------------------------------------------------------------------- | |
19 */ | |
20 | |
21 #ifndef ACI_LST_C | |
22 #define ACI_LST_C | |
23 #endif | |
24 | |
25 #include "aci_all.h" | |
26 | |
27 /*==== INCLUDES ===================================================*/ | |
28 | |
29 #include "aci_lst.h" | |
30 #include "aci_mem.h" | |
31 | |
32 /*==== CONSTANTS ==================================================*/ | |
33 | |
34 /*==== EXPORT =====================================================*/ | |
35 | |
36 /*==== VARIABLES ==================================================*/ | |
37 | |
38 /*==== FUNCTIONS ==================================================*/ | |
39 | |
40 /*==== TYPES ======================================================*/ | |
41 | |
42 | |
43 /* | |
44 +--------------------------------------------------------------------+ | |
45 | PROJECT : GSM-F&D (8411) MODULE : ACI_LST | | |
46 | STATE : code ROUTINE : new_list | | |
47 +--------------------------------------------------------------------+ | |
48 | |
49 PURPOSE : create a new list. | |
50 */ | |
51 | |
52 GLOBAL T_ACI_LIST *new_list (void) | |
53 { | |
54 T_ACI_LIST *new_elem = NULL; | |
55 | |
56 ACI_MALLOC(new_elem, sizeof(T_ACI_LIST)); | |
57 new_elem->msg = NULL; | |
58 new_elem->next = NULL; | |
59 | |
60 return (new_elem); | |
61 } | |
62 | |
63 GLOBAL USHORT get_list_count (T_ACI_LIST *list) | |
64 { | |
65 T_ACI_LIST *curr; | |
66 USHORT count = 0; | |
67 | |
68 curr = list; | |
69 while (curr NEQ NULL) | |
70 { | |
71 if (curr->msg NEQ NULL) | |
72 count++; | |
73 | |
74 curr = curr->next; | |
75 } | |
76 | |
77 return (count); | |
78 } | |
79 | |
80 /* | |
81 +--------------------------------------------------------------------+ | |
82 | PROJECT : GSM-F&D (8411) MODULE : ACI_LST | | |
83 | STATE : code ROUTINE : insert_list | | |
84 +--------------------------------------------------------------------+ | |
85 | |
86 PURPOSE : insert a new element in an existing list. | |
87 - list: pointer to the list where the element is to be added | |
88 - buffer: pointer to the buffer containing the datas that are to | |
89 be written in the new element. | |
90 - buffer_len: length of the datas to be stored. | |
91 | |
92 */ | |
93 | |
94 GLOBAL BOOL insert_list (T_ACI_LIST *list, void *buffer) | |
95 { | |
96 T_ACI_LIST *current; | |
97 T_ACI_LIST *new_elem; | |
98 | |
99 if (list EQ NULL) | |
100 return (FALSE); | |
101 | |
102 if (list->msg EQ NULL) | |
103 { | |
104 list->msg = buffer; | |
105 return (TRUE); | |
106 } | |
107 | |
108 ACI_MALLOC(new_elem, sizeof(T_ACI_LIST)); | |
109 | |
110 new_elem->msg = buffer; | |
111 new_elem->next = NULL; | |
112 | |
113 current = list; | |
114 while (current->next NEQ NULL) | |
115 { | |
116 current = (T_ACI_LIST *)current->next; | |
117 } | |
118 current->next = new_elem; | |
119 | |
120 return TRUE; | |
121 } | |
122 | |
123 /* | |
124 +--------------------------------------------------------------------+ | |
125 | PROJECT : GSM-F&D (8411) MODULE : ACI_LST | | |
126 | STATE : code ROUTINE : find_element | | |
127 +--------------------------------------------------------------------+ | |
128 | |
129 PURPOSE : find an element in a list: | |
130 - search_list: list to be scanned. | |
131 - criterium: search criterium. (source Id for instance) | |
132 - test_criterium: function(criterium, element) that returns TRUE if | |
133 the criterium is found in the element. | |
134 | |
135 */ | |
136 | |
137 GLOBAL void *find_element (T_ACI_LIST *search_list, | |
138 UBYTE criterium, | |
139 T_LIST_FIND_FCT test_criterium) | |
140 { | |
141 T_ACI_LIST *current; | |
142 | |
143 if ((search_list EQ NULL) OR (search_list->msg EQ NULL)) | |
144 return NULL; | |
145 | |
146 current = search_list; | |
147 | |
148 do | |
149 { | |
150 if (current->msg NEQ NULL) | |
151 { | |
152 if (test_criterium(criterium, current->msg)) | |
153 return (current->msg); | |
154 else | |
155 current = current->next; | |
156 } | |
157 } | |
158 while( current NEQ NULL ); | |
159 | |
160 return NULL; | |
161 } | |
162 | |
163 /* | |
164 +--------------------------------------------------------------------+ | |
165 | PROJECT : GSM-F&D (8411) MODULE : ACI_LST | | |
166 | STATE : code ROUTINE : psi_find_element | | |
167 +--------------------------------------------------------------------+ | |
168 | |
169 PURPOSE : find an element in a list: | |
170 - search_list: list to be scanned. | |
171 - criterium: search criterium. (source Id for instance) | |
172 - test_criterium: function(criterium, element) that returns TRUE if | |
173 the criterium is found in the element. | |
174 | |
175 */ | |
176 #ifdef FF_PSI | |
177 GLOBAL void *psi_find_element (T_ACI_LIST *search_list, | |
178 U32 criterium, | |
179 T_LIST_FIND_FCT_PSI test_criterium) | |
180 { | |
181 T_ACI_LIST *current; | |
182 | |
183 if ((search_list EQ NULL) OR (search_list->msg EQ NULL)) | |
184 return NULL; | |
185 | |
186 current = search_list; | |
187 | |
188 do | |
189 { | |
190 if (current->msg NEQ NULL) | |
191 { | |
192 if (test_criterium(criterium, current->msg)) | |
193 return (current->msg); | |
194 else | |
195 current = current->next; | |
196 } | |
197 } | |
198 while( current NEQ NULL ); | |
199 | |
200 return NULL; | |
201 } | |
202 #endif /*FF_PSI*/ | |
203 | |
204 /* | |
205 +--------------------------------------------------------------------+ | |
206 | PROJECT : GSM-F&D (8411) MODULE : ACI_LST | | |
207 | STATE : code ROUTINE : find_next_element | | |
208 +--------------------------------------------------------------------+ | |
209 | |
210 PURPOSE : find the next element in a list: | |
211 - search_list: list to be scanned. | |
212 - previous element | |
213 - criterium: search criterium. (source Id for instance) | |
214 - test_criterium: function(criterium, element) that returns TRUE if | |
215 the criterium is found in the element. | |
216 | |
217 */ | |
218 GLOBAL void *find_next_element (T_ACI_LIST *search_list, | |
219 void *prev_elem, | |
220 UBYTE criterium, | |
221 T_LIST_FIND_FCT test_criterium) | |
222 { | |
223 T_ACI_LIST *current; | |
224 | |
225 if ((search_list EQ NULL) OR (search_list->msg EQ NULL)) | |
226 return NULL; | |
227 | |
228 current = search_list; | |
229 | |
230 if (prev_elem NEQ NULL) | |
231 { | |
232 while (current NEQ NULL) | |
233 { | |
234 if (current->msg EQ prev_elem) | |
235 break; | |
236 | |
237 current = current->next; | |
238 } | |
239 if ((current EQ NULL) OR (current->next EQ NULL)) | |
240 return (NULL); | |
241 | |
242 current = current->next; | |
243 } | |
244 | |
245 do | |
246 { | |
247 if( test_criterium(criterium, current->msg) ) | |
248 return (current->msg); | |
249 else | |
250 current = current->next; | |
251 } | |
252 while( current NEQ NULL ); | |
253 | |
254 return NULL; | |
255 } | |
256 | |
257 | |
258 /* | |
259 +--------------------------------------------------------------------+ | |
260 | PROJECT : GSM-F&D (8411) MODULE : ACI_LST | | |
261 | STATE : code ROUTINE : find_next_element | | |
262 +--------------------------------------------------------------------+ | |
263 | |
264 PURPOSE : find the next element in a list: | |
265 - search_list: list to be scanned. | |
266 - previous element | |
267 - criterium: search criterium. (source Id for instance) | |
268 - test_criterium: function(criterium, element) that returns TRUE if | |
269 the criterium is found in the element. | |
270 | |
271 */ | |
272 #ifdef FF_PSI | |
273 GLOBAL void *psi_find_next_element (T_ACI_LIST *search_list, | |
274 void *prev_elem, | |
275 U32 criterium, | |
276 T_LIST_FIND_FCT_PSI test_criterium) | |
277 { | |
278 T_ACI_LIST *current; | |
279 | |
280 if ((search_list EQ NULL) OR (search_list->msg EQ NULL)) | |
281 return NULL; | |
282 | |
283 current = search_list; | |
284 | |
285 if (prev_elem NEQ NULL) | |
286 { | |
287 while (current NEQ NULL) | |
288 { | |
289 if (current->msg EQ prev_elem) | |
290 break; | |
291 | |
292 current = current->next; | |
293 } | |
294 if ((current EQ NULL) OR (current->next EQ NULL)) | |
295 return (NULL); | |
296 | |
297 current = current->next; | |
298 } | |
299 | |
300 do | |
301 { | |
302 if( test_criterium(criterium, current->msg) ) | |
303 return (current->msg); | |
304 else | |
305 current = current->next; | |
306 } | |
307 while( current NEQ NULL ); | |
308 | |
309 return NULL; | |
310 } | |
311 #endif /*FF_PSI*/ | |
312 | |
313 /* | |
314 +--------------------------------------------------------------------+ | |
315 | PROJECT : GSM-F&D (8411) MODULE : ACI_LST | | |
316 | STATE : code ROUTINE : remove_element | | |
317 +--------------------------------------------------------------------+ | |
318 | |
319 PURPOSE : remove a element from the list. | |
320 | |
321 */ | |
322 GLOBAL void *remove_element (T_ACI_LIST *search_list, | |
323 UBYTE criterium, | |
324 T_LIST_FIND_FCT test_criterium) | |
325 { | |
326 T_ACI_LIST *previous = NULL, | |
327 *current = search_list, | |
328 *next = NULL; | |
329 void *msg = NULL; | |
330 | |
331 current = search_list; | |
332 while (current NEQ NULL) | |
333 { | |
334 if (test_criterium (criterium, current->msg)) | |
335 { | |
336 msg = current->msg; | |
337 break; | |
338 } | |
339 previous = current; | |
340 current = current->next; | |
341 } | |
342 | |
343 if (current EQ NULL) | |
344 return (NULL); | |
345 | |
346 if (msg EQ NULL) | |
347 return (NULL); | |
348 | |
349 /* the first element is to delete */ | |
350 if (previous EQ NULL) | |
351 { | |
352 /* the header contains the element */ | |
353 if (current->next EQ NULL) | |
354 { | |
355 /* one element in list */ | |
356 current->msg = NULL; | |
357 } | |
358 else | |
359 { | |
360 /* actually deletes the second element and redirects the pointers */ | |
361 next = current->next; | |
362 current->msg = next->msg; | |
363 current->next = next->next; | |
364 | |
365 ACI_MFREE (next); } | |
366 } | |
367 else | |
368 { | |
369 previous->next = current->next; | |
370 | |
371 ACI_MFREE (current); | |
372 } | |
373 | |
374 return (msg); | |
375 } | |
376 | |
377 #ifdef FF_PSI | |
378 GLOBAL void *psi_remove_element (T_ACI_LIST *search_list, | |
379 U32 criterium, | |
380 T_LIST_FIND_FCT_PSI test_criterium) | |
381 { | |
382 T_ACI_LIST *previous = NULL, | |
383 *current = search_list, | |
384 *next = NULL; | |
385 void *msg = NULL; | |
386 | |
387 current = search_list; | |
388 while (current NEQ NULL) | |
389 { | |
390 if (test_criterium (criterium, current->msg)) | |
391 { | |
392 msg = current->msg; | |
393 break; | |
394 } | |
395 previous = current; | |
396 current = current->next; | |
397 } | |
398 | |
399 if (current EQ NULL) | |
400 return (NULL); | |
401 | |
402 if (msg EQ NULL) | |
403 return (NULL); | |
404 | |
405 /* the first element is to delete */ | |
406 if (previous EQ NULL) | |
407 { | |
408 /* the header contains the element */ | |
409 if (current->next EQ NULL) | |
410 { | |
411 /* one element in list */ | |
412 current->msg = NULL; | |
413 } | |
414 else | |
415 { | |
416 /* actually deletes the second element and redirects the pointers */ | |
417 next = current->next; | |
418 current->msg = next->msg; | |
419 current->next = next->next; | |
420 | |
421 ACI_MFREE (next); } | |
422 } | |
423 else | |
424 { | |
425 previous->next = current->next; | |
426 | |
427 ACI_MFREE (current); | |
428 } | |
429 | |
430 return (msg); | |
431 } | |
432 | |
433 #endif /*FF_PSI*/ | |
434 | |
435 | |
436 /* | |
437 +--------------------------------------------------------------------+ | |
438 | PROJECT : GSM-F&D (8411) MODULE : ACI_LST | | |
439 | STATE : code ROUTINE : remove_first_element | | |
440 +--------------------------------------------------------------------+ | |
441 | |
442 PURPOSE : get and remove the first element from the list | |
443 | |
444 */ | |
445 GLOBAL void *remove_first_element (T_ACI_LIST *search_list) | |
446 { | |
447 T_ACI_LIST *next = NULL; | |
448 void *msg = NULL; | |
449 | |
450 if ((search_list EQ NULL) OR (search_list->msg EQ NULL)) | |
451 return (NULL); | |
452 | |
453 msg = search_list->msg; | |
454 search_list->msg = NULL; | |
455 | |
456 if (search_list->next EQ NULL) | |
457 return (msg); | |
458 | |
459 next = search_list->next; | |
460 search_list->next = next->next; | |
461 search_list->msg = next->msg; | |
462 | |
463 ACI_MFREE (next); | |
464 | |
465 return (msg); | |
466 } | |
467 | |
468 /* | |
469 +--------------------------------------------------------------------+ | |
470 | PROJECT : GSM-F&D (8411) MODULE : ACI_LST | | |
471 | STATE : code ROUTINE : get_first_element | | |
472 +--------------------------------------------------------------------+ | |
473 | |
474 PURPOSE : get the next element from the list | |
475 - search_list: list to be scanned. | |
476 - previous element | |
477 */ | |
478 | |
479 GLOBAL void *get_next_element (T_ACI_LIST *search_list, | |
480 void *prev_elem) | |
481 { | |
482 T_ACI_LIST *current; | |
483 | |
484 if ((search_list EQ NULL) OR (search_list->msg EQ NULL)) | |
485 return NULL; | |
486 | |
487 if (prev_elem EQ NULL) | |
488 { | |
489 /* return first element */ | |
490 return (search_list->msg); | |
491 } | |
492 | |
493 current = search_list; | |
494 | |
495 /* search the previous element */ | |
496 while (current NEQ NULL) | |
497 { | |
498 if (current->msg EQ prev_elem) | |
499 { | |
500 break; | |
501 } | |
502 current = current->next; | |
503 } | |
504 | |
505 /* last entry found or previous entry not found */ | |
506 if ((current EQ NULL) OR (current->next EQ NULL)) | |
507 { | |
508 return (NULL); | |
509 } | |
510 | |
511 return (current->next->msg); | |
512 } | |
513 | |
514 /* | |
515 +---------------------------------------------------------------------+ | |
516 | PROJECT : GSM-F&D (8411) MODULE : ACI_LST | | |
517 | STATE : code ROUTINE : insert_shift_list | | |
518 +---------------------------------------------------------------------+ | |
519 | |
520 PURPOSE : | |
521 */ | |
522 GLOBAL BOOL insert_shift_list (T_ACI_LIST *list, void *buffer) | |
523 { | |
524 T_ACI_LIST *current; | |
525 T_ACI_LIST *new_elem; | |
526 void *old_buf; | |
527 | |
528 if (list EQ NULL) | |
529 return (FALSE); | |
530 | |
531 if (list->msg EQ NULL) | |
532 { | |
533 list->msg = buffer; | |
534 return (TRUE); | |
535 } | |
536 else if (list->next EQ NULL) | |
537 return (FALSE); | |
538 | |
539 current = list; | |
540 | |
541 old_buf = list->msg; | |
542 list->msg = list->next->msg; | |
543 | |
544 new_elem = list->next; | |
545 list->next = list->next->next; | |
546 | |
547 | |
548 new_elem->msg = buffer; | |
549 new_elem->next = NULL; | |
550 | |
551 while (current->next NEQ NULL) | |
552 { | |
553 current = (T_ACI_LIST *)current->next; | |
554 } | |
555 current->next = new_elem; | |
556 | |
557 ACI_MFREE (old_buf); | |
558 | |
559 return TRUE; | |
560 } | |
561 /**********************************************************************/ |