source: trunk/dll/listutil.c@ 1856

Last change on this file since 1856 was 1856, checked in by Steven Levine, 10 years ago

Rework Flesh/Stubby etc. to avoid running on thread 1
Should be ready for release after spurious traps resolved
DbgMsg calls retained - delete/disable before release

File size: 2.6 KB
Line 
1
2/***********************************************************************
3
4 $Id: $
5
6 Linked list utilities
7
8 Copyright (c) 2015 Steven H. Levine
9
10 07 Aug 15 SHL Baseline
11
12***********************************************************************/
13
14#define INCL_DOS
15
16#include "fm3dll.h"
17#include "errutil.h" // Dos_Error...
18#include "listutil.h"
19
20// Data definitions
21#pragma data_seg(DATA1)
22
23static PSZ pszSrcFile = __FILE__;
24
25/**
26 * Append item to doubly linked list
27 */
28
29VOID List2Append(PLIST2HEADER header, PLIST2 item)
30{
31 item->next = NULL;
32 item->prev = header->last;
33 if (item->prev)
34 item->prev->next = item;
35 header->last = item;
36 if (!header->first)
37 header->first = item; // List empty
38}
39
40/**
41 * Get first item from doubly linked list
42 * @return item or NULL
43 */
44
45PLIST2 List2GetFirst(PLIST2HEADER header)
46{
47 return header->first;
48}
49
50/**
51 * Delete first item from doubly linked list
52 * @return deleted item or NULL
53 */
54
55PLIST2 List2DeleteFirst(PLIST2HEADER header)
56{
57 PLIST2 item = header->first;
58
59 // If list not empty
60 if (item) {
61 header->first = item->next;
62 if (header->first)
63 header->first->prev = NULL;
64 if (header->last == item)
65 header->last = NULL;
66 item->next = NULL; // Catch illegal accesses
67 item->prev = NULL; // Catch illegal accesses
68 }
69 return item;
70}
71
72/**
73 * Delete specified item from doubly linked list
74 * @param header is list header
75 * @param item point to item to be deleted
76 * @return deleted item or NULL
77 * @note item must be a member of list
78 */
79
80VOID List2Delete(PLIST2HEADER header, PLIST2 item)
81{
82 if (item->next) {
83 if (item->next->prev != item)
84 Runtime_Error(pszSrcFile, __LINE__, "item %u item->next->prev %p", item, item->next->prev);
85 item->next->prev = item->prev;
86 }
87 else
88 header->last = item->prev;
89
90 if (item->prev) {
91 if (item->prev->next != item)
92 Runtime_Error(pszSrcFile, __LINE__, "item %u item->prev->next%p", item, item->prev->next);
93 item->prev->next = item->next;
94 }
95 else
96 header->first = item->next;
97
98 item->prev = NULL; // Catch illegal accesses
99 item->next = NULL; // Catch illegal accesses
100}
101
102/**
103 * Search list for matching item
104 * @returns list pointer or NULL
105 */
106
107PLIST2 List2Search(PLIST2HEADER header, PLIST2MATCH matchFunc, PVOID data) {
108 PLIST2 item;
109 for (item = header->first; item; item = item->next) {
110 if (matchFunc(item, data))
111 break; // Matched
112 } // for
113 return item;
114}
115
116// #pragma alloc_text(LISTUTIL, FIXME)
Note: See TracBrowser for help on using the repository browser.