Subversion Repositories oidplus

Rev

Rev 735 | 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: 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.
  280.