-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathSLLMan.pas
119 lines (111 loc) · 2.35 KB
/
SLLMan.pas
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
unit SLLMan;
interface
uses
Windows;
type
LLData = ^TLLData;
TLLData = record
Info: TProcessInformation;
blocca: boolean;
end;
PSLLItem = ^TSLLItem;
TSLLItem = record
Next: pointer;
Data: LLData;
end;
function llsGetItem(id: cardinal; var start: PSLLItem): PSLLItem;
function llsTakeOutItem(id: cardinal; var start: PSLLItem): PSLLItem;
procedure llsInsertItem(item: PSLLItem; var start: PSLLItem);
function llsGetItemCount(start: PSLLItem): cardinal;
function llsNewSLLHeader: PSLLItem;
procedure llsKillSLLHeader(hdr: PSLLItem);
// These ids are numbered from 0
implementation
function malloc(size: cardinal): pointer;
begin
GetMem(result,size);
end;
function llsGetItemCount(start: pointer): cardinal;
var
cur: PSLLItem;
tmp: cardinal;
begin
if start = nil then begin llsGetItemCount := 0; Exit; end;
tmp := 1; cur := start;
while (cur^.Next <> nil) do
begin
Inc(tmp);
cur := cur^.Next;
end;
llsGetItemCount := tmp;
end;
procedure llsKillSLLHeader(hdr: pointer);
begin
if hdr = nil then Exit;
FreeMem(hdr);
end;
function llsNewSLLHeader: PSLLItem;
var
tmp: PSLLItem;
begin
tmp := malloc(sizeof(TSLLItem));
tmp^.Next := nil;
tmp^.Data := nil;
llsNewSLLHeader := tmp;
end;
function llsGetItem(id: cardinal; var start: pointer): pointer;
var
cur: PSLLItem;
begin
if start = nil then begin llsGetItem := nil; Exit; end;
cur := start;
while (id<>0) do
begin
if cur^.Next <> nil then
begin
Dec(id);
cur := cur^.Next;
end else
begin
llsGetItem := nil;
Exit;
end;
end;
llsGetItem := cur;
end;
function llsTakeOutItem(id: cardinal; var start: pointer): pointer;
var
tmp: PSLLItem;
last: PSLLItem;
begin
if start = nil then begin llsTakeOutItem := nil; Exit; end;
if (id = 0) then
begin
tmp := start;
if tmp^.Next = nil then start := nil else start := tmp^.Next;
llsTakeOutItem := tmp;
Exit;
end;
tmp := start;
repeat
dec(id);
last := tmp;
tmp := tmp^.Next;
until (id = 0);
last^.Next := tmp^.Next;
llsTakeOutitem := tmp;
end;
procedure llsInsertItem(item: PSLLItem; var start: PSLLItem);
var
cur: PSLLItem;
begin
if start = nil then
begin
start := item;
exit;
end;
cur := start;
while (cur^.Next<>nil) do cur := cur^.Next;
cur^.Next := item;
end;
end.