MMString.pas
上传用户:hylc_2004
上传日期:2014-01-23
资源大小:46800k
文件大小:17k
源码类别:

Delphi控件源码

开发平台:

Delphi

  1. {========================================================================}
  2. {=                (c) 1995-98 SwiftSoft Ronald Dittrich                 =}
  3. {========================================================================}
  4. {=                          All Rights Reserved                         =}
  5. {========================================================================}
  6. {=  D 01099 Dresden             = Fax.: +49 (0)351-8037944              =}
  7. {=  Loewenstr.7a                = info@swiftsoft.de                     =}
  8. {========================================================================}
  9. {=  Actual versions on http://www.swiftsoft.de/mmtools.html             =}
  10. {========================================================================}
  11. {=  This code is for reference purposes only and may not be copied or   =}
  12. {=  distributed in any format electronic or otherwise except one copy   =}
  13. {=  for backup purposes.                                                =}
  14. {=                                                                      =}
  15. {=  No Delphi Component Kit or Component individually or in a collection=}
  16. {=  subclassed or otherwise from the code in this unit, or associated   =}
  17. {=  .pas, .dfm, .dcu, .asm or .obj files may be sold or distributed     =}
  18. {=  without express permission from SwiftSoft.                          =}
  19. {=                                                                      =}
  20. {=  For more licence informations please refer to the associated        =}
  21. {=  HelpFile.                                                           =}
  22. {========================================================================}
  23. {=  $Date: 01.04.98 - 21:05:04 $                                        =}
  24. {========================================================================}
  25. unit  MMString;
  26. {$I COMPILER.INC}
  27. interface
  28. uses
  29.     {$IFDEF WIN32}
  30.     Windows,
  31.     Messages,
  32.     {$ELSE}
  33.     WinProcs,
  34.     WinTypes,
  35.     {$ENDIF}
  36.     SysUtils;
  37. {$IFNDEF WIN32}
  38. procedure SetLength(var StrX: string; Len: integer);
  39. procedure SetString(var StrX: string; Buffer: PChar; Len: integer);
  40. function  Trim(const StrX: string): string;
  41. function  TrimLeft(const StrX: string): string;
  42. function  TrimRight(const StrX: string): string;
  43. {$ENDIF}
  44. function  Replicate(const StrX: string; NoTimes: Byte): string;
  45. procedure DeleteLeft(var strX: string; Border: Char);
  46. procedure DeleteRight(var strX: string; Border: Char);
  47. function  PadEnds(const StrX: string; ch: Char; Len: integer): string;
  48. function  PadLeft(const StrX: string; ch: Char; Len: integer): string;
  49. function  PadRight(const StrX: string; ch: Char; Len: integer): string;
  50. function  LeftEnd(const StrX: string; Border: Char): string;
  51. function  RightEnd(const StrX: string; Border: Char): string;
  52. function  LeftStr(const StrX: string; Len: integer): string;
  53. function  RightStr(const StrX: string; Len: integer): string;
  54. function  Equal(const StrX1, StrX2: string): Boolean;
  55. function  Encrypt(const StrX: string; Key: Word): string;
  56. function  Decrypt(const StrX: string; Key: Word): string;
  57. function  DUpCase(const C: Char): Char;
  58. function  DUpperCase(const S: string): string;
  59. function  PosEx(Start: integer; SubStr, S: string): integer;
  60. function  PosRight(Substr: string; S: string): integer;
  61. function  Replace(const S: string; OldChar, NewChar: Char): string;
  62. {$IFDEF WIN32}
  63. function  StrPosEx(const SubStr: AnsiString; const S: AnsiString; nPos: integer): Integer;
  64. {$ENDIF}
  65. function HexToInt(S: string): Longint;
  66. function IntToBin(Value, Bits: integer): string;
  67. implementation
  68. {$IFNDEF WIN32}
  69. {-------------------------------------------------------------------------}
  70. procedure SetLength(var StrX: string; Len: integer);
  71. begin
  72.      StrX[0] := Char(Len);
  73. end;
  74. {-------------------------------------------------------------------------}
  75. procedure SetString(var StrX: string; Buffer: PChar; Len: integer);
  76. begin
  77.      StrX := StrPas(Buffer);
  78.      StrX[0] := Char(Len);
  79. end;
  80. {-------------------------------------------------------------------------}
  81. function Trim(const StrX: string): string;
  82. var
  83.   i, l: integer;
  84. begin
  85.    l := Length(StrX);
  86.    i := 1;
  87.    while (i <= l) and (StrX[i] <= ' ') do inc(i);
  88.    if i > l then Result := ''
  89.    else
  90.    begin
  91.       while StrX[l] <= ' ' do dec(l);
  92.       Result := Copy(StrX, i, l - i + 1);
  93.    end;
  94. end;
  95. {-------------------------------------------------------------------------}
  96. function TrimLeft(const StrX: string): string;
  97. var
  98.   i, l: integer;
  99. begin
  100.    l := Length(StrX);
  101.    i := 1;
  102.    while (i <= l) and (StrX[i] <= ' ') do inc(i);
  103.    Result := Copy(StrX, i, MaxInt);
  104. end;
  105. {-------------------------------------------------------------------------}
  106. function TrimRight(const StrX: string): string;
  107. var
  108.   i: integer;
  109. begin
  110.    i := Length(StrX);
  111.    while (i > 0) and (StrX[i] <= ' ') do dec(i);
  112.    Result := Copy(StrX, 1, i);
  113. end;
  114. {$ELSE}
  115. type
  116.     StrRec = record
  117.        allocSiz:       Longint;
  118.        refCnt: Longint;
  119.        length: Longint;
  120.     end;
  121. const
  122.      skew = sizeof(StrRec);
  123.      rOff = sizeof(StrRec) - sizeof(Longint);
  124.      overHead = sizeof(StrRec) + 1;
  125. {-------------------------------------------------------------------------}
  126. function StrPosEx(const SubStr: AnsiString; const S: AnsiString; nPos: integer): Integer;
  127. asm
  128. { returns the index of nPos position in S       }
  129. {     ->EAX     Pointer to substr               }
  130. {       EDX     Pointer to string               }
  131. {       ECX     nPos                            }
  132. {     <-EAX     Position of substr in s or 0    }
  133.         TEST    EAX,EAX
  134.         JE      @@noWork
  135.         TEST    ECX,ECX
  136.         JE      @@invalidCount
  137.         TEST    EDX,EDX
  138.         JE      @@stringEmpty
  139.         PUSH    EBP
  140.         PUSH    EBX
  141.         PUSH    ESI
  142.         PUSH    EDI
  143.         MOV     ESI,EAX                         { Point ESI to substr           }
  144.         MOV     EDI,EDX                         { Point EDI to s                }
  145.         MOV     EBP,ECX                         { EBP = nPos                    }
  146.         MOV     ECX,[EDI-skew].StrRec.length    { ECX = Length(s)               }
  147.         PUSH    EDI                             { remember s position to calculate index        }
  148.         MOV     EDX,[ESI-skew].StrRec.length    { EDX = Length(substr)          }
  149.         DEC     EDX                             { EDX = Length(substr) - 1              }
  150.         JS      @@fail                          { < 0 ? return 0                        }
  151.         MOV     AL,[ESI]                        { AL = first char of substr             }
  152.         INC     ESI                             { Point ESI to 2'nd char of substr      }
  153.         SUB     ECX,EDX                         { #positions in s to look at    }
  154.                                                 { = Length(s) - Length(substr) + 1      }
  155.         JLE     @@fail
  156. @@loop:
  157.         REPNE   SCASB
  158.         JNE     @@fail
  159.         MOV     EBX,ECX                         { save outer loop counter               }
  160.         PUSH    ESI                             { save outer loop substr pointer        }
  161.         PUSH    EDI                             { save outer loop s pointer             }
  162.         MOV     ECX,EDX
  163.         REPE    CMPSB
  164.         POP     EDI                             { restore outer loop s pointer  }
  165.         POP     ESI                             { restore outer loop substr pointer     }
  166.         JE      @@found
  167.         MOV     ECX,EBX                         { restore outer loop counter    }
  168.         JMP     @@loop
  169. @@found:
  170.         DEC     EBP
  171.         JZ      @@finalfound
  172.         MOV     ECX,EBX
  173.         JZ      @@fail
  174.         jmp     @@loop
  175. @@fail:
  176.         POP     EDX                             { get rid of saved s pointer    }
  177.         XOR     EAX,EAX
  178.         JMP     @@exit
  179. @@invalidCount:
  180. @@stringEmpty:
  181.         XOR     EAX,EAX
  182.         JMP     @@noWork
  183. @@finalfound:
  184.         POP     EDX                             { restore pointer to first char of s    }
  185.         MOV     EAX,EDI                         { EDI points of char after match        }
  186.         SUB     EAX,EDX                         { the difference is the correct index   }
  187. @@exit:
  188.         POP     EDI
  189.         POP     ESI
  190.         POP     EBX
  191.         POP     EBP
  192.         RET
  193. @@noWork:
  194. end;
  195. {$ENDIF}
  196. {-------------------------------------------------------------------------}
  197. procedure DeleteLeft(Var StrX: string; Border: Char);
  198. begin
  199.      Delete(StrX, 1, Pos(Border, StrX)-1);
  200. end;
  201. {-------------------------------------------------------------------------}
  202. procedure DeleteRight(Var StrX: string; Border: Char);
  203. Var
  204.    Position: integer;
  205. begin
  206.      Position := PosRight(Border, StrX);
  207.      Delete(StrX, Position+1, Length(StrX)-Position+1);
  208. end;
  209. {-------------------------------------------------------------------------}
  210. function PadEnds(const StrX: string; ch: Char; Len: integer): string;
  211. begin
  212.      if Len > Length(StrX) then
  213.      begin
  214.           SetLength(Result, Len);
  215.           FillChar(Result[1], Len, ch);
  216.           Move(StrX[1], Result[((Len - Length(StrX)) DIV 2) + 1],Length(StrX));
  217.      end
  218.      else Result := StrX;
  219. end;
  220. {-------------------------------------------------------------------------}
  221. function PadLeft(const StrX: string; ch: Char; Len: integer): string;
  222. begin
  223.      if Len > Length(StrX) then
  224.      begin
  225.           SetLength(Result, Len);
  226.           FillChar(Result[1], Len, ch);
  227.           Move(StrX[1], Result[Succ(Len - Length(StrX))], Length(StrX));
  228.      end
  229.      else Result :=StrX;
  230. end;
  231. {-------------------------------------------------------------------------}
  232. function PadRight(const StrX: string; ch: Char; Len: integer): string;
  233. begin
  234.      if Len > Length(StrX) then
  235.      begin
  236.           SetLength(Result, Len);
  237.           FillChar(Result[1], Len, ch);
  238.           Move(StrX[1], Result[1], Length(StrX));
  239.      end
  240.      else Result := StrX;
  241. end;
  242. {-------------------------------------------------------------------------}
  243. function Replicate(const StrX: string; NoTimes: Byte): String;
  244. Var
  245.    i   : Byte;
  246. begin
  247.      Result := '';
  248.      for i:= 1 to NoTimes do
  249.          Result := Result + StrX;
  250. End;
  251. {-------------------------------------------------------------------------}
  252. function  LeftEnd(const StrX: string; Border: Char): string;
  253. begin
  254.      Result := Copy(StrX, 1, Pos(Border, StrX)-1);
  255. end;
  256. {-------------------------------------------------------------------------}
  257. function  RightEnd(const StrX: string; Border: char): string;
  258. Var
  259.    Position: Byte;
  260. begin
  261.      Position := PosRight(Border, StrX);
  262.      if Position > 0 then
  263.         Result := Copy(StrX, Position+1, Length(StrX)-Position+1)
  264.      else Result := '';
  265. end;
  266. {-------------------------------------------------------------------------}
  267. function LeftStr(const StrX: string; Len: integer): string;
  268. begin
  269.      Result:= Copy(StrX, 1, Len);
  270. end;
  271. {-------------------------------------------------------------------------}
  272. function RightStr(const StrX: string; Len: integer): string;
  273. begin
  274.      Result := Copy(StrX, Length(StrX) - Len + 1, Len);
  275. end;
  276. {-------------------------------------------------------------------------}
  277. function Equal(const StrX1,StrX2: string): Boolean;
  278. begin
  279.    Result := AnsiCompareText(StrX1,StrX2) = 0;
  280. end;
  281. const
  282.   C1 = 52845;
  283.   C2 = 22719;
  284. {-------------------------------------------------------------------------}
  285. function Encrypt(const StrX: string; Key: Word): string;
  286. var
  287.   i: Integer;
  288. begin
  289.   SetLength(Result,Length(StrX));
  290.   for i := 1 to Length(StrX) do
  291.   begin
  292.      Result[i] := Char(Ord(StrX[i]) xor (Key shr 8));
  293.      Key := (Ord(Result[i]) + Key) * C1 + C2;
  294.   end;
  295. end;
  296. {-------------------------------------------------------------------------}
  297. function Decrypt(const StrX: string; Key: Word): string;
  298. var
  299.    i: Integer;
  300. begin
  301.    SetLength(Result,Length(StrX));
  302.    for i := 1 to Length(StrX) do
  303.    begin
  304.       Result[i] := Char(Ord(StrX[i]) xor (Key shr 8));
  305.       Key := (Ord(StrX[i]) + Key) * C1 + C2;
  306.    end;
  307. end;
  308. {-------------------------------------------------------------------------}
  309. function DUpCase(const C: Char): Char;
  310. begin
  311.    if (C = '