Subversion Repositories oidplus

Rev

Rev 733 | Rev 737 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

  1. unit STRLIST;
  2.  
  3. (************************************************)
  4. (* STRLIST.PAS                                  *)
  5. (* Author:   Daniel Marschall                   *)
  6. (* Revision: 2022-02-14                         *)
  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 CreateList(var list: PStringList);
  23. procedure FreeList(list: PStringList);
  24. function ListContains(list: PStringList; val: string): boolean;
  25. procedure ListClear(list: PStringList);
  26. function ListAppend(list: PStringList; str: string): integer;
  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 CreateList(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. function ListAppend(list: PStringList; str: string): integer;
  81. var
  82.   new: PStringList;
  83.   tmp: PStringList;
  84.   cnt: integer;
  85. begin
  86.   cnt := 0;
  87.   if not list^.init then
  88.   begin
  89.    list^.element := str;
  90.    list^.init := true;
  91.   end
  92.   else
  93.   begin
  94.     Inc(cnt);
  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;
  104.       Inc(cnt);
  105.     end;
  106.  
  107.     tmp^.next := new;
  108.   end;
  109.  
  110.   ListAppend := cnt; (* Return the index where the new element was put *)
  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.
  286.