Subversion Repositories oidplus

Rev

Rev 735 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
733 daniel-mar 1
unit STRLIST;
2
 
3
(************************************************)
4
(* STRLIST.PAS                                  *)
5
(* Author:   Daniel Marschall                   *)
6
(* Revision: 2020-09-11                         *)
7
(* License:  Apache 2.0                         *)
8
(* This file contains:                          *)
9
(* - StringList implementation for Turbo Pascal *)
10
(************************************************)
11
 
12
interface
13
 
14
type
15
  PStringList = ^TStringList;
16
  TStringList = record
17
    init: boolean;
18
    element: string;
19
    next: PStringList;
20
  end;
21
 
22
procedure InitList(var list: PStringList);
23
procedure FreeList(list: PStringList);
24
function ListContains(list: PStringList; val: string): boolean;
25
procedure ListClear(list: PStringList);
26
procedure ListAppend(list: PStringList; str: string);
27
function ListCount(list: PStringList): integer;
28
procedure ListDeleteElement(list: PStringlist; idx: integer);
29
function ListGetElement(list: PStringList; idx: integer): string;
30
procedure ListSetElement(list: PStringList; idx: integer; value: string);
31
procedure ListInsert(list: PStringlist; str: string; idx: integer);
32
procedure ListSwapElement(list: PStringList; i, j: integer);
33
procedure SplitStrToList(str: string; list: PStringList; separator: string);
34
procedure OIDtoArcList(oid: string; list: PStringList);
35
procedure ListBubbleSortNumericString(list: PStringList);
36
 
37
implementation
38
 
39
uses
40
  VtsFuncs;
41
 
42
procedure InitList(var list: PStringList);
43
begin
44
  GetMem(list, SizeOf(TStringList));
45
  list^.init := false;
46
  list^.element := '';
47
  list^.next := nil;
48
end;
49
 
50
procedure FreeList(list: PStringList);
51
begin
52
  if list^.next <> nil then
53
    FreeMem(list^.next, SizeOf(TStringList));
54
  FreeMem(list, SizeOf(TStringList));
55
end;
56
 
57
function ListContains(list: PStringList; val: string): boolean;
58
var
59
  i: integer;
60
begin
61
  ListContains := false;
62
  for i := 0 to ListCount(list)-1 do
63
  begin
64
    if ListGetElement(list, i) = val then
65
    begin
66
      ListContains := true;
67
      break;
68
    end;
69
  end;
70
end;
71
 
72
procedure ListClear(list: PStringList);
73
begin
74
  while ListCount(list) > 0 do
75
  begin
76
    ListDeleteElement(list, 0);
77
  end;
78
end;
79
 
80
procedure ListAppend(list: PStringList; str: string);
81
var
82
  new: PStringList;
83
  tmp: PStringList;
84
begin
85
  if not list^.init then
86
  begin
87
   list^.element := str;
88
   list^.init := true;
89
  end
90
  else
91
  begin
92
    GetMem(new, sizeof(TStringList));
93
    new^.element := str;
94
    new^.next := nil;
95
    new^.init := true;
96
 
97
    tmp := list;
98
    while tmp^.next <> nil do
99
    begin
100
      tmp := tmp^.next;
101
    end;
102
 
103
    tmp^.next := new;
104
  end;
105
end;
106
 
107
function ListCount(list: PStringList): integer;
108
var
109
  cnt: integer;
110
  tmp: PStringList;
111
begin
112
  tmp := list;
113
  cnt := 0;
114
 
115
  if tmp^.init then
116
  begin
117
    repeat
118
      Inc(cnt);
119
      tmp := tmp^.next;
120
    until tmp = nil;
121
  end;
122
 
123
  ListCount := cnt;
124
end;
125
 
126
procedure ListDeleteElement(list: PStringlist; idx: integer);
127
var
128
  tmp, tmp2, prev: PStringList;
129
  i: integer;
130
begin
131
  if idx < 0 then exit;
132
  if idx > ListCount(list)-1 then exit;
133
 
134
  tmp := list;
135
  prev := nil;
136
  i := 0;
137
  while i < idx do
138
  begin
139
    prev := tmp;
140
    tmp := tmp^.next;
141
    inc(i);
142
  end;
143
  if prev = nil then
144
  begin
145
    if tmp^.next = nil then
146
    begin
147
      tmp^.init := false;
148
    end
149
    else
150
    begin
151
      tmp^.init := true;
152
      tmp^.element := tmp^.next^.element;
153
      tmp2 := tmp^.next;
154
      tmp^.next := tmp^.next^.next;
155
      FreeMem(tmp2, SizeOf(TStringList));
156
    end;
157
  end
158
  else
159
  begin
160
    prev^.next := tmp^.next;
161
    FreeMem(tmp, SizeOf(TStringList));
162
  end;
163
end;
164
 
165
function ListGetElement(list: PStringList; idx: integer): string;
166
var
167
  tmp: PStringList;
168
  i: integer;
169
begin
170
  if idx < 0 then exit;
171
  if idx > ListCount(list)-1 then exit;
172
 
173
  tmp := list;
174
  i := 0;
175
  while i < idx do
176
  begin
177
    tmp := tmp^.next;
178
    inc(i);
179
  end;
180
 
181
  ListGetElement := tmp^.element;
182
end;
183
 
184
procedure ListSetElement(list: PStringList; idx: integer; value: string);
185
var
186
  tmp: PStringList;
187
  i: integer;
188
begin
189
  if idx < 0 then exit;
190
  if idx > ListCount(list)-1 then exit;
191
 
192
  tmp := list;
193
  i := 0;
194
  while i < idx do
195
  begin
196
    tmp := tmp^.next;
197
    inc(i);
198
  end;
199
 
200
  tmp^.element := value;
201
end;
202
 
203
procedure ListInsert(list: PStringlist; str: string; idx: integer);
204
var
205
  tmp, new: PStringList;
206
  i: integer;
207
begin
208
  if idx < 0 then exit;
209
  if idx > ListCount(list)-1 then exit;
210
 
211
  tmp := list;
212
  i := 0;
213
  while i < idx do
214
  begin
215
    tmp := tmp^.next;
216
    inc(i);
217
  end;
218
 
219
  GetMem(new, sizeof(TStringList));
220
  new^.init := true;
221
  new^.next := tmp^.next;
222
  new^.element := tmp^.element;
223
 
224
  tmp^.element := str;
225
  tmp^.next := new;
226
  tmp^.init := true;
227
end;
228
 
229
procedure ListSwapElement(list: PStringList; i, j: integer);
230
var
231
  a, b: string;
232
begin
233
  a := ListGetElement(list, i);
234
  b := ListGetElement(list, j);
235
  ListSetElement(list, i, b);
236
  ListSetElement(list, j, a);
237
end;
238
 
239
procedure SplitStrToList(str: string; list: PStringList; separator: string);
240
var
241
  p: integer;
242
begin
243
  str := str + separator;
244
  repeat
245
    p := Pos(separator, str);
246
    ListAppend(list, Copy(str, 1, p-1));
247
    str := copy(str, p+Length(separator), Length(str)-p);
248
  until str = '';
249
end;
250
 
251
procedure OIDtoArcList(oid: string; list: PStringList);
252
begin
253
  SplitStrToList(oid, list, '.');
254
end;
255
 
256
procedure ListBubbleSortNumericString(list: PStringList);
257
var
258
  n, i: integer;
259
  a, b: string;
260
begin
261
  n := ListCount(list);
262
  while n>1 do
263
  begin
264
    i := 0;
265
    while i<n-1 do
266
    begin
267
      a := ListGetElement(list, i);
268
      b := ListGetElement(list, i+1);
269
      if CompareNumericString(a, b) > 0 then
270
      begin
271
        ListSwapElement(list, i, i+1);
272
      end;
273
      Inc(i);
274
    end;
275
    Dec(n);
276
  end;
277
end;
278
 
279
end.