Subversion Repositories oidplus

Rev

Rev 733 | Rev 737 | Go to most recent revision | Details | Compare with Previous | 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                   *)
735 daniel-mar 6
(* Revision: 2022-02-14                         *)
733 daniel-mar 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
 
735 daniel-mar 22
procedure CreateList(var list: PStringList);
733 daniel-mar 23
procedure FreeList(list: PStringList);
24
function ListContains(list: PStringList; val: string): boolean;
25
procedure ListClear(list: PStringList);
735 daniel-mar 26
function ListAppend(list: PStringList; str: string): integer;
733 daniel-mar 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
 
735 daniel-mar 42
procedure CreateList(var list: PStringList);
733 daniel-mar 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
 
735 daniel-mar 80
function ListAppend(list: PStringList; str: string): integer;
733 daniel-mar 81
var
82
  new: PStringList;
83
  tmp: PStringList;
735 daniel-mar 84
  cnt: integer;
733 daniel-mar 85
begin
735 daniel-mar 86
  cnt := 0;
733 daniel-mar 87
  if not list^.init then
88
  begin
89
   list^.element := str;
90
   list^.init := true;
91
  end
92
  else
93
  begin
735 daniel-mar 94
    Inc(cnt);
733 daniel-mar 95
    GetMem(new, sizeof(TStringList));
96
    new^.element := str;
97
    new^.next := nil;
98
    new^.init := true;
99
 
100
    tmp := list;
101
    while tmp^.next <> nil do
102
    begin
103
      tmp := tmp^.next;
735 daniel-mar 104
      Inc(cnt);
733 daniel-mar 105
    end;
106
 
107
    tmp^.next := new;
108
  end;
735 daniel-mar 109
 
110
  ListAppend := cnt; (* Return the index where the new element was put *)
733 daniel-mar 111
end;
112
 
113
function ListCount(list: PStringList): integer;
114
var
115
  cnt: integer;
116
  tmp: PStringList;
117
begin
118
  tmp := list;
119
  cnt := 0;
120
 
121
  if tmp^.init then
122
  begin
123
    repeat
124
      Inc(cnt);
125
      tmp := tmp^.next;
126
    until tmp = nil;
127
  end;
128
 
129
  ListCount := cnt;
130
end;
131
 
132
procedure ListDeleteElement(list: PStringlist; idx: integer);
133
var
134
  tmp, tmp2, prev: PStringList;
135
  i: integer;
136
begin
137
  if idx < 0 then exit;
138
  if idx > ListCount(list)-1 then exit;
139
 
140
  tmp := list;
141
  prev := nil;
142
  i := 0;
143
  while i < idx do
144
  begin
145
    prev := tmp;
146
    tmp := tmp^.next;
147
    inc(i);
148
  end;
149
  if prev = nil then
150
  begin
151
    if tmp^.next = nil then
152
    begin
153
      tmp^.init := false;
154
    end
155
    else
156
    begin
157
      tmp^.init := true;
158
      tmp^.element := tmp^.next^.element;
159
      tmp2 := tmp^.next;
160
      tmp^.next := tmp^.next^.next;
161
      FreeMem(tmp2, SizeOf(TStringList));
162
    end;
163
  end
164
  else
165
  begin
166
    prev^.next := tmp^.next;
167
    FreeMem(tmp, SizeOf(TStringList));
168
  end;
169
end;
170
 
171
function ListGetElement(list: PStringList; idx: integer): string;
172
var
173
  tmp: PStringList;
174
  i: integer;
175
begin
176
  if idx < 0 then exit;
177
  if idx > ListCount(list)-1 then exit;
178
 
179
  tmp := list;
180
  i := 0;
181
  while i < idx do
182
  begin
183
    tmp := tmp^.next;
184
    inc(i);
185
  end;
186
 
187
  ListGetElement := tmp^.element;
188
end;
189
 
190
procedure ListSetElement(list: PStringList; idx: integer; value: string);
191
var
192
  tmp: PStringList;
193
  i: integer;
194
begin
195
  if idx < 0 then exit;
196
  if idx > ListCount(list)-1 then exit;
197
 
198
  tmp := list;
199
  i := 0;
200
  while i < idx do
201
  begin
202
    tmp := tmp^.next;
203
    inc(i);
204
  end;
205
 
206
  tmp^.element := value;
207
end;
208
 
209
procedure ListInsert(list: PStringlist; str: string; idx: integer);
210
var
211
  tmp, new: PStringList;
212
  i: integer;
213
begin
214
  if idx < 0 then exit;
215
  if idx > ListCount(list)-1 then exit;
216
 
217
  tmp := list;
218
  i := 0;
219
  while i < idx do
220
  begin
221
    tmp := tmp^.next;
222
    inc(i);
223
  end;
224
 
225
  GetMem(new, sizeof(TStringList));
226
  new^.init := true;
227
  new^.next := tmp^.next;
228
  new^.element := tmp^.element;
229
 
230
  tmp^.element := str;
231
  tmp^.next := new;
232
  tmp^.init := true;
233
end;
234
 
235
procedure ListSwapElement(list: PStringList; i, j: integer);
236
var
237
  a, b: string;
238
begin
239
  a := ListGetElement(list, i);
240
  b := ListGetElement(list, j);
241
  ListSetElement(list, i, b);
242
  ListSetElement(list, j, a);
243
end;
244
 
245
procedure SplitStrToList(str: string; list: PStringList; separator: string);
246
var
247
  p: integer;
248
begin
249
  str := str + separator;
250
  repeat
251
    p := Pos(separator, str);
252
    ListAppend(list, Copy(str, 1, p-1));
253
    str := copy(str, p+Length(separator), Length(str)-p);
254
  until str = '';
255
end;
256
 
257
procedure OIDtoArcList(oid: string; list: PStringList);
258
begin
259
  SplitStrToList(oid, list, '.');
260
end;
261
 
262
procedure ListBubbleSortNumericString(list: PStringList);
263
var
264
  n, i: integer;
265
  a, b: string;
266
begin
267
  n := ListCount(list);
268
  while n>1 do
269
  begin
270
    i := 0;
271
    while i<n-1 do
272
    begin
273
      a := ListGetElement(list, i);
274
      b := ListGetElement(list, i+1);
275
      if CompareNumericString(a, b) > 0 then
276
      begin
277
        ListSwapElement(list, i, i+1);
278
      end;
279
      Inc(i);
280
    end;
281
    Dec(n);
282
  end;
283
end;
284
 
285
end.