home *** CD-ROM | disk | FTP | other *** search
- {==============================================================================|
- | Project : Delphree - Synapse | 002.003.000 |
- |==============================================================================|
- | Content: support procedures and functions |
- |==============================================================================|
- | The contents of this file are subject to the Mozilla Public License Ver. 1.1 |
- | (the "License"); you may not use this file except in compliance with the |
- | License. You may obtain a Copy of the License at http://www.mozilla.org/MPL/ |
- | |
- | Software distributed under the License is distributed on an "AS IS" basis, |
- | WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for |
- | the specific language governing rights and limitations under the License. |
- |==============================================================================|
- | The Original Code is Synapse Delphi Library. |
- |==============================================================================|
- | The Initial Developer of the Original Code is Lukas Gebauer (Czech Republic).|
- | Portions created by Lukas Gebauer are Copyright (c) 1999,2000,2001. |
- | Portions created by Hernan Sanchez are Copyright (c) 2000. |
- | All Rights Reserved. |
- |==============================================================================|
- | Contributor(s): |
- | Hernan Sanchez (hernan.sanchez@iname.com) |
- |==============================================================================|
- | History: see HISTORY.HTM from distribution package |
- | (Found at URL: http://www.ararat.cz/synapse/) |
- |==============================================================================}
-
- {$Q-}
-
- unit SynaUtil;
-
- interface
-
- uses
- SysUtils, Classes,
- {$IFDEF LINUX}
- Libc;
- {$ELSE}
- Windows;
- {$ENDIF}
-
- function Timezone: string;
- function Rfc822DateTime(t: TDateTime): string;
- function CDateTime(t: TDateTime): string;
- function CodeInt(Value: Word): string;
- function DecodeInt(const Value: string; Index: Integer): Word;
- function IsIP(const Value: string): Boolean;
- function ReverseIP(Value: string): string;
- function IPToID(Host: string): string;
- procedure Dump(const Buffer, DumpFile: string);
- function SeparateLeft(const Value, Delimiter: string): string;
- function SeparateRight(const Value, Delimiter: string): string;
- function GetParameter(const Value, Parameter: string): string;
- function GetEmailAddr(const Value: string): string;
- function GetEmailDesc(Value: string): string;
- function StrToHex(const Value: string): string;
- function IntToBin(Value: Integer; Digits: Byte): string;
- function BinToInt(const Value: string): Integer;
- function ParseURL(URL: string; var Prot, User, Pass, Host, Port, Path,
- Para: string): string;
- function StringReplace(Value, Search, Replace: string): string;
- function RPos(const Sub, Value: String): Integer;
- function Fetch(var Value: string; const Delimiter: string): string;
-
- implementation
- {==============================================================================}
- var
- SaveDayNames: array[1..7] of string;
- SaveMonthNames: array[1..12] of string;
- const
- MyDayNames: array[1..7] of string =
- ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat');
- MyMonthNames: array[1..12] of string =
- ('Jan', 'Feb', 'Mar', 'Apr',
- 'May', 'Jun', 'Jul', 'Aug',
- 'Sep', 'Oct', 'Nov', 'Dec');
-
- procedure SaveNames;
- var
- I: integer;
- begin
- for I := Low(ShortDayNames) to High(ShortDayNames) do
- begin
- SaveDayNames[I] := ShortDayNames[I];
- ShortDayNames[I] := MyDayNames[I];
- end;
- for I := Low(ShortMonthNames) to High(ShortMonthNames) do
- begin
- SaveMonthNames[I] := ShortMonthNames[I];
- ShortMonthNames[I] := MyMonthNames[I];
- end;
- end;
-
- procedure RestoreNames;
- var
- I: integer;
- begin
- for I := Low(ShortDayNames) to High(ShortDayNames) do
- ShortDayNames[I] := SaveDayNames[I];
- for I := Low(ShortMonthNames) to High(ShortMonthNames) do
- ShortMonthNames[I] := SaveMonthNames[I];
- end;
- {==============================================================================}
-
- function Timezone: string;
- {$IFDEF LINUX}
- var
- t: TTime_T;
- UT: TUnixTime;
- bias: Integer;
- h, m: Integer;
- begin
- __time(@T);
- localtime_r(@T, UT);
- bias := ut.__tm_gmtoff div 60;
- if bias >= 0 then
- Result := '+'
- else
- Result := '-';
- {$ELSE}
- var
- zoneinfo: TTimeZoneInformation;
- bias: Integer;
- h, m: Integer;
- begin
- case GetTimeZoneInformation(Zoneinfo) of
- 2:
- bias := zoneinfo.Bias + zoneinfo.DaylightBias;
- 1:
- bias := zoneinfo.Bias + zoneinfo.StandardBias;
- else
- bias := zoneinfo.Bias;
- end;
- if bias <= 0 then
- Result := '+'
- else
- Result := '-';
- {$ENDIF}
- bias := Abs(bias);
- h := bias div 60;
- m := bias mod 60;
- Result := Result + Format('%.2d%.2d', [h, m]);
- end;
-
- {==============================================================================}
-
- function Rfc822DateTime(t: TDateTime): string;
- begin
- SaveNames;
- try
- Result := FormatDateTime('ddd, d mmm yyyy hh:mm:ss', t);
- Result := Result + ' ' + Timezone;
- finally
- RestoreNames;
- end;
- end;
-
- {==============================================================================}
-
- function CDateTime(t: TDateTime): string;
- begin
- SaveNames;
- try
- Result := FormatDateTime('mmm dd hh:mm:ss', t);
- if Result[5] = '0' then
- Result[5] := ' ';
- finally
- RestoreNames;
- end;
- end;
-
- {==============================================================================}
-
- function CodeInt(Value: Word): string;
- begin
- Result := Chr(Hi(Value)) + Chr(Lo(Value))
- end;
-
- {==============================================================================}
-
- function DecodeInt(const Value: string; Index: Integer): Word;
- var
- x, y: Byte;
- begin
- if Length(Value) > Index then
- x := Ord(Value[Index])
- else
- x := 0;
- if Length(Value) >= (Index + 1) then
- y := Ord(Value[Index + 1])
- else
- y := 0;
- Result := x * 256 + y;
- end;
-
- {==============================================================================}
-
- function IsIP(const Value: string): Boolean;
- var
- n, x: Integer;
- begin
- Result := true;
- x := 0;
- for n := 1 to Length(Value) do
- if not (Value[n] in ['0'..'9', '.']) then
- begin
- Result := False;
- Break;
- end
- else
- begin
- if Value[n] = '.' then
- Inc(x);
- end;
- if x <> 3 then
- Result := False;
- end;
-
- {==============================================================================}
-
- function ReverseIP(Value: string): string;
- var
- x: Integer;
- begin
- Result := '';
- repeat
- x := LastDelimiter('.', Value);
- Result := Result + '.' + Copy(Value, x + 1, Length(Value) - x);
- Delete(Value, x, Length(Value) - x + 1);
- until x < 1;
- if Length(Result) > 0 then
- if Result[1] = '.' then
- Delete(Result, 1, 1);
- end;
-
- {==============================================================================}
- //Hernan Sanchez
- function IPToID(Host: string): string;
- var
- s, t: string;
- i, x: Integer;
- begin
- Result := '';
- for x := 1 to 3 do
- begin
- t := '';
- s := StrScan(PChar(Host), '.');
- t := Copy(Host, 1, (Length(Host) - Length(s)));
- Delete(Host, 1, (Length(Host) - Length(s) + 1));
- i := StrToIntDef(t, 0);
- Result := Result + Chr(i);
- end;
- i := StrToIntDef(Host, 0);
- Result := Result + Chr(i);
- end;
-
- {==============================================================================}
-
- procedure Dump(const Buffer, DumpFile: string);
- var
- n: Integer;
- s: string;
- f: Text;
- begin
- s := '';
- for n := 1 to Length(Buffer) do
- s := s + ' +#$' + IntToHex(Ord(Buffer[n]), 2);
- AssignFile(f, DumpFile);
- if FileExists(DumpFile) then
- DeleteFile(PChar(DumpFile));
- Rewrite(f);
- try
- Writeln(f, s);
- finally
- CloseFile(f);
- end;
- end;
-
- {==============================================================================}
-
- function SeparateLeft(const Value, Delimiter: string): string;
- var
- x: Integer;
- begin
- x := Pos(Delimiter, Value);
- if x < 1 then
- Result := Trim(Value)
- else
- Result := Trim(Copy(Value, 1, x - 1));
- end;
-
- {==============================================================================}
-
- function SeparateRight(const Value, Delimiter: string): string;
- var
- x: Integer;
- begin
- x := Pos(Delimiter, Value);
- if x > 0 then
- x := x + Length(Delimiter) - 1;
- Result := Trim(Copy(Value, x + 1, Length(Value) - x));
- end;
-
- {==============================================================================}
-
- function GetParameter(const Value, Parameter: string): string;
- var
- x, x1: Integer;
- s: string;
- begin
- x := Pos(UpperCase(Parameter), UpperCase(Value));
- Result := '';
- if x > 0 then
- begin
- s := Copy(Value, x + Length(Parameter), Length(Value)
- - (x + Length(Parameter)) + 1);
- s := Trim(s);
- x1 := Length(s);
- if Length(s) > 1 then
- begin
- if s[1] = '"' then
- begin
- s := Copy(s, 2, Length(s) - 1);
- x := Pos('"', s);
- if x > 0 then
- x1 := x - 1;
- end
- else
- begin
- x := Pos(' ', s);
- if x > 0 then
- x1 := x - 1;
- end;
- end;
- Result := Copy(s, 1, x1);
- end;
- end;
-
- {==============================================================================}
-
- function GetEmailAddr(const Value: string): string;
- var
- s: string;
- begin
- s := SeparateRight(Value, '<');
- s := SeparateLeft(s, '>');
- Result := Trim(s);
- end;
-
- {==============================================================================}
-
- function GetEmailDesc(Value: string): string;
- var
- s: string;
- begin
- Value := Trim(Value);
- s := SeparateRight(Value, '"');
- if s <> Value then
- s := SeparateLeft(s, '"')
- else
- begin
- s := SeparateRight(Value, '(');
- if s <> Value then
- s := SeparateLeft(s, ')')
- else
- begin
- s := SeparateLeft(Value, '<');
- if s = Value then
- s := '';
- end;
- end;
- Result := Trim(s);
- end;
-
- {==============================================================================}
-
- function StrToHex(const Value: string): string;
- var
- n: Integer;
- begin
- Result := '';
- for n := 1 to Length(Value) do
- Result := Result + IntToHex(Byte(Value[n]), 2);
- Result := LowerCase(Result);
- end;
-
- {==============================================================================}
-
- function IntToBin(Value: Integer; Digits: Byte): string;
- var
- x, y, n: Integer;
- begin
- Result := '';
- x := Value;
- repeat
- y := x mod 2;
- x := x div 2;
- if y > 0 then
- Result := '1' + Result
- else
- Result := '0' + Result;
- until x = 0;
- x := Length(Result);
- for n := x to Digits - 1 do
- Result := '0' + Result;
- end;
-
- {==============================================================================}
-
- function BinToInt(const Value: string): Integer;
- var
- n: Integer;
- begin
- Result := 0;
- for n := 1 to Length(Value) do
- begin
- if Value[n] = '0' then
- Result := Result * 2
- else
- if Value[n] = '1' then
- Result := Result * 2 + 1
- else
- Break;
- end;
- end;
-
- {==============================================================================}
-
- function ParseURL(URL: string; var Prot, User, Pass, Host, Port, Path,
- Para: string): string;
- var
- x: Integer;
- sURL: string;
- s: string;
- s1, s2: string;
- begin
- Prot := 'http';
- User := '';
- Pass := '';
- Port := '80';
- Para := '';
-
- x := Pos('://', URL);
- if x > 0 then
- begin
- Prot := SeparateLeft(URL, '://');
- sURL := SeparateRight(URL, '://');
- end
- else
- sURL := URL;
- x := Pos('@', sURL);
- if x > 0 then
- begin
- s := SeparateLeft(sURL, '@');
- sURL := SeparateRight(sURL, '@');
- x := Pos(':', s);
- if x > 0 then
- begin
- User := SeparateLeft(s, ':');
- Pass := SeparateRight(s, ':');
- end
- else
- User := s;
- end;
- x := Pos('/', sURL);
- if x > 0 then
- begin
- s1 := SeparateLeft(sURL, '/');
- s2 := SeparateRight(sURL, '/');
- end
- else
- begin
- s1 := sURL;
- s2 := '';
- end;
- x := Pos(':', s1);
- if x > 0 then
- begin
- Host := SeparateLeft(s1, ':');
- Port := SeparateRight(s1, ':');
- end
- else
- Host := s1;
- Result := '/' + s2;
- x := Pos('?', s2);
- if x > 0 then
- begin
- Path := '/' + SeparateLeft(s2, '?');
- Para := SeparateRight(s2, '?');
- end
- else
- Path := '/' + s2;
- if Host = '' then
- Host := 'localhost';
- end;
-
- {==============================================================================}
-
- function StringReplace(Value, Search, Replace: string): string;
- var
- x, l, ls, lr: Integer;
- begin
- if (Value = '') or (Search = '') then
- begin
- Result := Value;
- Exit;
- end;
- ls := Length(Search);
- lr := Length(Replace);
- Result := '';
- x := Pos(Search, Value);
- while x > 0 do
- begin
- l := Length(Result);
- SetLength(Result, l + x - 1);
- Move(Pointer(Value)^, Pointer(@Result[l + 1])^, x - 1);
- // Result:=Result+Copy(Value,1,x-1);
- l := Length(Result);
- SetLength(Result, l + lr);
- Move(Pointer(Replace)^, Pointer(@Result[l + 1])^, lr);
- // Result:=Result+Replace;
- Delete(Value, 1, x - 1 + ls);
- x := Pos(Search, Value);
- end;
- Result := Result + Value;
- end;
-
- {==============================================================================}
-
- function RPos(const Sub, Value: String): Integer;
- var
- n: Integer;
- l: Integer;
- begin
- result := 0;
- l := Length(Sub);
- for n := Length(Value) - l + 1 downto 1 do
- begin
- if Copy(Value, n, l) = Sub then
- begin
- result := n;
- break;
- end;
- end;
- end;
-
- {==============================================================================}
-
- function Fetch(var Value: string; const Delimiter: string): string;
- begin
- Result := SeparateLeft(Value, Delimiter);
- Value := SeparateRight(Value, Delimiter);
- end;
-
- end.
-