AUD_List.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418
  1. /*
  2. ** Command & Conquer Generals(tm)
  3. ** Copyright 2025 Electronic Arts Inc.
  4. **
  5. ** This program is free software: you can redistribute it and/or modify
  6. ** it under the terms of the GNU General Public License as published by
  7. ** the Free Software Foundation, either version 3 of the License, or
  8. ** (at your option) any later version.
  9. **
  10. ** This program is distributed in the hope that it will be useful,
  11. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. ** GNU General Public License for more details.
  14. **
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. /*****************************************************************************
  19. ** **
  20. ** Westwood Studios Pacific. **
  21. ** **
  22. ** Confidential Information **
  23. ** Copyright (C) 2000 - All Rights Reserved **
  24. ** **
  25. ******************************************************************************
  26. ** **
  27. ** Project: Dune Emperor **
  28. ** **
  29. ** Module: <module> (<prefix>_) **
  30. ** **
  31. ** Version: $ID$ **
  32. ** **
  33. ** File name: audlists.cpp **
  34. ** **
  35. ** Created by: 04/01/95 TR **
  36. ** **
  37. ** Description: <description> **
  38. ** **
  39. *****************************************************************************/
  40. /*****************************************************************************
  41. ** Includes **
  42. *****************************************************************************/
  43. #include <wpaudio/altypes.h>
  44. #include <wpaudio/list.h>
  45. // 'assignment within condition expression'.
  46. #pragma warning(disable : 4706)
  47. /*****************************************************************************
  48. ** Externals **
  49. *****************************************************************************/
  50. /*****************************************************************************
  51. ** Defines **
  52. *****************************************************************************/
  53. /*****************************************************************************
  54. ** Private Types **
  55. *****************************************************************************/
  56. /*****************************************************************************
  57. ** Private Data **
  58. *****************************************************************************/
  59. /*****************************************************************************
  60. ** Public Data **
  61. *****************************************************************************/
  62. /*****************************************************************************
  63. ** Private Prototypes **
  64. *****************************************************************************/
  65. /*****************************************************************************
  66. ** Private Functions **
  67. *****************************************************************************/
  68. /*****************************************************************************
  69. ** Public Functions **
  70. *****************************************************************************/
  71. /******************************************************************/
  72. /* */
  73. /* */
  74. /******************************************************************/
  75. void ListInit ( ListHead *head )
  76. {
  77. head->prev = head->next = head;
  78. head->pri = (Priority) head; // this identifies the node as a head node
  79. }
  80. /******************************************************************/
  81. /* */
  82. /* */
  83. /******************************************************************/
  84. void ListNodeInit ( ListNode *node )
  85. {
  86. node->prev = node->next= node;
  87. node->pri = 0;
  88. }
  89. /******************************************************************/
  90. /* */
  91. /* */
  92. /******************************************************************/
  93. int ListAddNodeSortAscending( ListHead *head, ListNode *new_node )
  94. {
  95. ListNode *node;
  96. Priority pri;
  97. int index;
  98. index = 0;
  99. pri = new_node->pri;
  100. node = (ListNode*) head;
  101. while( (node = ListNodeNext ( node )))
  102. {
  103. if ( pri <= node->pri )
  104. {
  105. ListNodeInsert ( node, new_node );
  106. return index;
  107. }
  108. index++;
  109. }
  110. ListNodeInsert ( head, new_node );
  111. return index;
  112. }
  113. /******************************************************************/
  114. /* */
  115. /* */
  116. /******************************************************************/
  117. void ListAddNode( ListHead *head, ListNode *new_node )
  118. {
  119. ListNode *node;
  120. Priority pri;
  121. pri = new_node->pri;
  122. node = (ListNode*) head;
  123. while( (node = ListNodeNext ( node )))
  124. {
  125. if (node->pri <= pri )
  126. {
  127. ListNodeInsert ( node, new_node );
  128. return;
  129. }
  130. }
  131. ListNodeInsert ( head, new_node );
  132. }
  133. /******************************************************************/
  134. /* */
  135. /* */
  136. /******************************************************************/
  137. void ListAddNodeAfter( ListHead *head, ListNode *new_node )
  138. {
  139. ListNode *node;
  140. Priority pri;
  141. pri = new_node->pri;
  142. node = (ListNode*) head;
  143. while( (node = ListNodeNext ( node )))
  144. {
  145. if (node->pri < pri )
  146. {
  147. ListNodeInsert ( node, new_node );
  148. return;
  149. }
  150. }
  151. ListNodeInsert ( head, new_node );
  152. }
  153. /******************************************************************/
  154. /* */
  155. /* */
  156. /******************************************************************/
  157. void ListMerge( ListHead *from, ListHead *to )
  158. {
  159. ListNode *first,
  160. *last,
  161. *node;
  162. first = from->next;
  163. last = from->prev;
  164. if ( first == (ListNode*) from )
  165. {
  166. /* the from list is empty so there is nothing to do */
  167. return;
  168. }
  169. node = to->prev;
  170. node->next = first;
  171. first->prev = node;
  172. last->next = (ListNode*) to;
  173. to->prev = last;
  174. ListInit ( from ); /* make the from list empty now */
  175. }
  176. /******************************************************************/
  177. /* */
  178. /* */
  179. /******************************************************************/
  180. int ListCountItems ( ListHead *head )
  181. {
  182. ListNode *node;
  183. int count = 0;
  184. node = head->next;
  185. while(node!=(ListNode*)head)
  186. {
  187. count++;
  188. node = node->next;
  189. }
  190. return count;
  191. }
  192. /******************************************************************/
  193. /* */
  194. /* */
  195. /******************************************************************/
  196. ListNode* ListFirstItem ( ListHead *head )
  197. {
  198. return ListNextItem ((ListNode*) head );
  199. }
  200. /******************************************************************/
  201. /* */
  202. /* */
  203. /******************************************************************/
  204. ListNode* ListNextItem ( ListNode *node )
  205. {
  206. if ( !node )
  207. {
  208. return NULL;
  209. }
  210. return ( ListNodeNext ( node ));
  211. }
  212. /******************************************************************/
  213. /* */
  214. /* */
  215. /******************************************************************/
  216. ListNode* ListGetItem( ListHead *head, int number )
  217. {
  218. ListNode *node;
  219. node = head->next;
  220. while( node != (ListNode*) head )
  221. {
  222. if ( number-- == 0 )
  223. {
  224. return node;
  225. }
  226. node = node->next;
  227. }
  228. return NULL;
  229. }
  230. /******************************************************************/
  231. /* */
  232. /* */
  233. /******************************************************************/
  234. void ListNodeInsert( ListNode *node, ListNode *new_node )
  235. {
  236. new_node->prev = node->prev;
  237. new_node->next = node;
  238. node->prev = new_node;
  239. new_node->prev->next = new_node;
  240. }
  241. /******************************************************************/
  242. /* */
  243. /* */
  244. /******************************************************************/
  245. void ListNodeAppend( ListNode *node, ListNode *new_node )
  246. {
  247. new_node->prev = node;
  248. new_node->next = node->next;
  249. node->next = new_node;
  250. new_node->next->prev = new_node;
  251. }
  252. /******************************************************************/
  253. /* */
  254. /* */
  255. /******************************************************************/
  256. void ListNodeRemove( ListNode *node )
  257. {
  258. node->prev->next = node->next;
  259. node->next->prev = node->prev;
  260. node->prev = node->next = node; // so we know that the node is not in a list
  261. }
  262. /******************************************************************/
  263. /* */
  264. /* */
  265. /******************************************************************/
  266. ListNode* ListNodeNext( ListNode *node )
  267. {
  268. ListNode *next;
  269. next = node->next;
  270. if ( next && ListNodeIsHead ( next ))
  271. {
  272. return NULL;
  273. }
  274. return next;
  275. }
  276. /******************************************************************/
  277. /* */
  278. /* */
  279. /******************************************************************/
  280. ListNode* ListNodePrev (ListNode *node)
  281. {
  282. ListNode *next;
  283. next = node->prev;
  284. if ( ListNodeIsHead ( next ))
  285. {
  286. return NULL;
  287. }
  288. return next;
  289. }
  290. /******************************************************************/
  291. /* */
  292. /* */
  293. /******************************************************************/
  294. ListNode* ListNodeLoopNext (ListNode *node)
  295. {
  296. ListNode *next;
  297. next = node->next;
  298. if ( ListNodeIsHead ( next ))
  299. {
  300. // skip head node
  301. next = next->next;
  302. if ( ListNodeIsHead ( next ))
  303. {
  304. return NULL; // it is an empty list
  305. }
  306. }
  307. return next;
  308. }
  309. /******************************************************************/
  310. /* */
  311. /* */
  312. /******************************************************************/
  313. ListNode* ListNodeLoopPrev (ListNode *node)
  314. {
  315. ListNode *next;
  316. next = node->prev;
  317. if ( ListNodeIsHead ( next ))
  318. {
  319. // skip head node
  320. next = next->prev;
  321. if ( ListNodeIsHead ( next ))
  322. {
  323. return NULL; // it is an empty list
  324. }
  325. }
  326. return next;
  327. }