home *** CD-ROM | disk | FTP | other *** search
/ Softwarová Záchrana 3 / Softwarova-zachrana-3.bin / ArsClip / source.zip / UnitTWideChar.pas < prev   
Pascal/Delphi Source File  |  2003-07-30  |  5KB  |  241 lines

  1. unit UnitTWideChar;
  2. {///////////////}
  3. {//}interface{//}
  4. {///////////////}
  5.  
  6. uses SysUtils, Classes;
  7.  
  8. type TWideChar = class(TObject)
  9.     private
  10.         ms : TMemoryStream;
  11.     protected
  12.         procedure PositionForAppend;
  13.     public
  14.         constructor Create;
  15.         destructor Destroy; override;
  16.         procedure Append(s : string); overload;
  17.         procedure Append(wc : TWideChar); overload;
  18.         procedure Append(GlobalH: THandle; size : cardinal); overload;
  19.  
  20.         procedure TrimLeft(chars : cardinal);
  21.         procedure TrimRight(chars : cardinal);
  22.         procedure LeftStr(len : cardinal);
  23.         procedure RightStr(len : cardinal);
  24.         procedure Replace(find : widechar; replace : widechar; removenulls : boolean = true);
  25.  
  26.         function GetMemoryStream : TMemoryStream;
  27.         function Memory : Pointer;
  28.         function size : int64;
  29.         function StrLength : int64;
  30.  
  31.         procedure Clear;
  32. end;
  33.  
  34. {////////////////////}
  35. {//}implementation{//}
  36. {////////////////////}
  37.  
  38. uses UnitMisc, Windows;
  39.  
  40. { TWideChar }
  41.  
  42. procedure TWideChar.Append(s: string);
  43. var pwc2 : PWideChar;
  44.     c : Cardinal;
  45. begin
  46.     Windows.SetLastError(ERROR_SUCCESS);
  47.     if s = '' then EXIT;
  48.  
  49.     c := (length(s) + 1) * 2; // include null space
  50.     GetMem(pwc2, c);
  51.  
  52.     FillChar(pwc2^, c, #0);
  53.     StringToWideChar(s, pwc2, c);
  54.  
  55.     self.PositionForAppend;
  56.     ms.Write(pwc2^, c);
  57.     
  58.     FreeMem(pwc2);
  59. end;
  60.  
  61. // NOT TESTED
  62. procedure TWideChar.Append(wc: TWideChar);
  63. begin
  64.     if wc.Size = 0 then EXIT;
  65.  
  66.     self.PositionForAppend;
  67.     self.ms.Write(wc.Memory^, wc.size);
  68. end;
  69.  
  70. procedure TWideChar.Append(GlobalH: THandle; size : cardinal);
  71. var pwc : PWideChar;
  72. begin
  73.     Windows.SetLastError(ERROR_SUCCESS);
  74.     if size = 0 then EXIT;
  75.  
  76.     pwc := Windows.GlobalLock(GlobalH);
  77.     if (pwc <> nil) then begin
  78.         self.PositionForAppend;
  79.         self.ms.write(pwc^, size);
  80.         Windows.GlobalUnlock(GlobalH);
  81.     end;
  82. end;
  83.  
  84. constructor TWideChar.Create;
  85. begin
  86.     ms := TMemoryStream.Create;
  87. end;
  88.  
  89. destructor TWideChar.Destroy;
  90. begin
  91.   MyFree(ms);
  92.   inherited;
  93. end;
  94.  
  95. function TWideChar.GetMemoryStream: TMemoryStream;
  96. begin
  97.     result := self.ms;
  98. end;
  99.  
  100. function TWideChar.StrLength: int64;
  101. begin
  102.     result := trunc(ms.Size / 2);
  103. end;
  104.  
  105. function TWideChar.Memory: Pointer;
  106. begin
  107.     result := ms.Memory;
  108. end;
  109.  
  110. procedure TWideChar.PositionForAppend;
  111. begin
  112.     if ms.Size > 0 then begin
  113.         ms.Seek(ms.Size - 2, soFromBeginning); // get rid of null terminator
  114.     end else begin
  115.         ms.Seek(0, soFromBeginning);
  116.     end;
  117. end;
  118.  
  119. function TWideChar.size: int64;
  120. begin
  121.     result := ms.Size;
  122. end;
  123.  
  124. // NOT TESTED
  125. procedure TWideChar.TrimLeft(chars: cardinal);
  126. var ms2 : TMemoryStream;
  127.     pwc : PWideChar;
  128.     c : cardinal;
  129. begin
  130.  
  131.     if (chars > ms.Size) then begin
  132.         ms.Clear;
  133.     end else begin
  134.         ms2 := TMemoryStream.Create;
  135.         c := ms.size - (chars * 2);
  136.         GetMem(pwc, c);
  137.         ms.Seek(chars * 2, soFromBeginning);
  138.         ms.Read(pwc^, c);
  139.         ms2.Write(pwc^, c);
  140.  
  141.         MyFree(ms);
  142.         ms := ms2;
  143.     end;
  144. end;
  145.  
  146. // NOT TESTED
  147. procedure TWideChar.TrimRight(chars: cardinal);
  148. var ms2 : TMemoryStream;
  149.     pwc : PWideChar;
  150.     c : cardinal;
  151.     w : word;
  152. begin
  153.     chars := chars * 2;
  154.     if (chars = ms.Size) then begin
  155.         ms.Clear;
  156.     end else if (chars < ms.Size) then begin
  157.         ms2 := TMemoryStream.Create;
  158.         c := ms.size - chars;
  159.         GetMem(pwc, c);
  160.         ms.Seek(0, soFromBeginning);
  161.         ms.Read(pwc^, c);
  162.         ms2.Write(pwc^, c);
  163.         w := 0; // write null terminator
  164.         ms2.Write(w,2);
  165.  
  166.         MyFree(ms);
  167.         ms := ms2;
  168.     end;
  169.  
  170. end;
  171.  
  172.  
  173. procedure TWideChar.LeftStr(len: cardinal);
  174. var ms2 : TMemoryStream;
  175.     w : word;
  176. begin
  177.     len := len * 2;
  178.     if (ms.Size - 2) > len then begin
  179.         ms2 := TMemoryStream.Create;
  180.         ms2.Write(ms.Memory^, len);
  181.         w := 0;
  182.         ms2.write(w, 2);
  183.         MyFree(ms);
  184.         ms := ms2;
  185.     end;
  186. end;
  187.  
  188. // NOT TESTED
  189. procedure TWideChar.RightStr(len: cardinal);
  190. var ms2 : TMemoryStream;
  191.     pwc : PWideChar;
  192.     w : word;
  193. begin
  194.     len := len * 2;
  195.     if ms.Size > len then begin
  196.         ms2 := TMemoryStream.Create;
  197.         GetMem(pwc, len);
  198.         ms.Seek((ms.size - len) - 2, soFromBeginning); // don't include null
  199.  
  200.         ms2.Write(ms.Memory^, len);
  201.         w := 0;
  202.         ms2.write(w, 2); // write null
  203.  
  204.         MyFree(ms);
  205.         FreeMem(pwc);
  206.         ms := ms2;
  207.     end;
  208. end;
  209.  
  210. procedure TWideChar.Replace(find: widechar; replace: widechar; removenulls : boolean = true);
  211. var i : integer;
  212.     w : word;
  213.     ms2 : TMemoryStream;
  214. begin
  215.     ms.Seek(0, soFromBeginning);
  216.     ms2 := TMemoryStream.Create;
  217.     for i := 0 to trunc((ms.Size-1) / 2)  do begin
  218.         ms.read(w, 2);
  219.         if WideChar(w) <> find {little endian} then begin
  220.             ms2.Write(w, 2);
  221.         end else begin
  222.             if (replace <> #0) or (not removenulls) then begin
  223.                 ms2.Write(replace, 2)
  224.             end;
  225.         end;
  226.     end;
  227.     ms.Clear;
  228.     MyFree(ms);
  229.     ms := ms2;
  230.  
  231.     ms.Seek(0, soFromEnd);
  232. end;
  233.  
  234. procedure TWideChar.Clear;
  235. begin
  236.     self.Append(' ');
  237.     if ms.Size <> 0 then ms.Clear;
  238. end;
  239.  
  240. end.
  241.