lazarus-ccr/components/geckoport/nsGeckoStrings.pas
Joshy 55a0067ad1 Fixed some problems win32 version. GTK and others still do not work.
Fixed some DOM events. Added new OnCloseWindow event.
Added possibility to disable JavaScript.
The interface is not fixed and some events could change shortly.
Tested with XULRuuner from 1.9.0.16 to 1.9.1.11.
XULRunner 1.9.2.x does not work due JavaScript problems, quite sure located in the XULRunner.

git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@1231 8e941d3f-bd1b-0410-a28a-d453659cc2b4
2010-05-28 21:53:08 +00:00

805 lines
22 KiB
ObjectPascal

(* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1/GPL 2.0/LGPL 2.1
*
* The contents of this file are subject to the Mozilla Public License Version
* 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 GeckoSDK for Delphi.
*
* The Initial Developer of the Original Code is Takanori Ito.
* Portions created by the Initial Developer are Copyright (C) 2004
* the Initial Developer. All Rights Reserved.
*
* Contributor(s):
*
* Alternatively, the contents of this file may be used under the terms of
* either the GNU General Public License Version 2 or later (the "GPL"), or
* the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
* in which case the provisions of the GPL or the LGPL are applicable instead
* of those above. If you wish to allow use of your version of this file only
* under the terms of either the GPL or the LGPL, and not to allow others to
* use your version of this file under the terms of the MPL, indicate your
* decision by deleting the provisions above and replace them with the notice
* and other provisions required by the GPL or the LGPL. If you do not delete
* the provisions above, a recipient may use your version of this file under
* the terms of any one of the MPL, the GPL or the LGPL.
*
* ***** END LICENSE BLOCK ***** *)
unit nsGeckoStrings;
interface
type
nsAString = ^nsStringContainer;
nsString = nsAString;
nsStringContainer = record
v: Pointer;
d1: Pointer;
d2: Longword;
d3: Pointer;
end;
nsACString = ^nsCStringContainer;
nsCString = nsACString;
nsCStringContainer = record
v: Pointer;
d1: Pointer;
d2: Longword;
d3: Pointer;
end;
nsAUTF8String = nsACString;
nsUTF8String = nsAUTF8String;
nsUTF8StringContainer = nsCStringContainer;
IInterfacedString = interface;
IInterfacedCString = interface;
IInterfacedUTF8String = interface;
IInterfacedString = interface
['{0FA36E7C-6CA9-4D02-AF23-B49F35047181}']
function Length: Longword;
procedure Cut(cutStart, cutLength: Longword);
procedure Assign(Source: IInterfacedString); overload;
procedure Assign(const Source: nsAString); overload;
procedure Assign(Source: WideString); overload;
procedure Append(Source: IInterfacedString); overload;
procedure Append(const Source: nsAString); overload;
procedure Append(Source: WideString); overload;
procedure Insert(Source: IInterfacedString; aPosition: Longword); overload;
procedure Insert(const Source: nsAString; aPosition: Longword); overload;
procedure Insert(Source: WideString; aPosition: Longword); overload;
procedure Replace(aPosition, aLength: Longword; const Source: nsAString); overload;
procedure Replace(aPosition, aLength: Longword; Source: IInterfacedString); overload;
function AString: nsAString;
function ToString: WideString;
end;
IInterfacedCString = interface
['{3207A765-52D6-4E1C-B0F1-8EC39DA4D8B4}']
function Length: Longword;
procedure Cut(cutStart, cutLength: Longword);
procedure Assign(Source: IInterfacedCString); overload;
procedure Assign(const Source: nsACString); overload;
procedure Assign(Source: AnsiString); overload;
procedure Append(Source: IInterfacedCString); overload;
procedure Append(const Source: nsACString); overload;
procedure Append(Source: AnsiString); overload;
procedure Insert(Source: IInterfacedCString; aPosition: Longword); overload;
procedure Insert(const Source: nsACString; aPosition: Longword); overload;
procedure Insert(Source: AnsiString; aPosition: Longword); overload;
procedure Replace(aPosition, aLength: Longword; const Source: nsACString); overload;
procedure Replace(aPosition, aLength: Longword; Source: IInterfacedCString); overload;
function ACString: nsACString;
function ToString: AnsiString;
end;
IInterfacedUTF8String = interface
['{100ABB7D-46A0-4BB2-B5BF-A94F9E53B78C}']
function Length: Longword;
procedure Cut(cutStart, cutLength: Longword);
procedure Assign(Source: IInterfacedUTF8String); overload;
procedure Assign(const Source: nsAUTF8String); overload;
procedure Assign(Source: UTF8String); overload;
procedure Append(Source: IInterfacedUTF8String); overload;
procedure Append(const Source: nsAUTF8String); overload;
procedure Append(Source: UTF8String); overload;
procedure Insert(Source: IInterfacedUTF8String; aPosition: Longword); overload;
procedure Insert(const Source: nsAUTF8String; aPosition: Longword); overload;
procedure Insert(Source: UTF8String; aPosition: Longword); overload;
procedure Replace(aPosition, aLength: Longword; const Source: nsAUTF8String); overload;
procedure Replace(aPosition, aLength: Longword; Source: IInterfacedUTF8String); overload;
function AUTF8String: nsAUTF8String;
function ToString: UTF8String;
end;
function Compare(const lhs, rhs: nsAString): Integer; overload;
function Compare(const lhs, rhs: nsACString): Integer; overload;
function NewString: IInterfacedString; overload;
function NewString(src: PWideChar): IInterfacedString; overload;
function NewString(src: WideString): IInterfacedString; overload;
function NewString(src: nsAString): IInterfacedString; overload;
function NewCString: IInterfacedCString; overload;
function NewCString(src: PAnsiChar): IInterfacedCString; overload;
function NewCString(src: AnsiString): IInterfacedCString; overload;
function NewCString(src: nsACString): IInterfacedCString; overload;
function NewUTF8String: IInterfacedUTF8String; overload;
function NewUTF8String(src: PAnsiChar): IInterfacedUTF8String; overload;
function NewUTF8String(src: UTF8String): IInterfacedUTF8String; overload;
function NewUTF8String(src: nsAUTF8String): IInterfacedUTF8String; overload;
function RelateString(src: nsAString; own: Boolean=False): IInterfacedString;
function RelateCString(src: nsACString; own: Boolean=False): IInterfacedCString;
function RelateUTF8String(src: nsAUTF8String; own: Boolean=False): IInterfacedUTF8String;
implementation
uses
nsInit, nsMemory, nsError;
function Compare(const lhs, rhs: nsAString): Integer;
var
p1, p2: PWideChar;
l1, l2: Longword;
begin
l1 := NS_StringGetData(lhs, p1);
l2 := NS_StringGetData(rhs, p2);
while (l1>0) and (l2>0) do
begin
Result := Ord(p1^) - Ord(p2^);
if Result <> 0 then Exit;
Dec(l1);
Dec(l2);
Inc(p1);
Inc(p2);
end;
Result := l1 - l2;
end;
function Compare(const lhs, rhs: nsACString): Integer;
var
p1, p2: PAnsiChar;
l1, l2: Longword;
begin
l1 := NS_CStringGetData(lhs, p1);
l2 := NS_CStringGetData(rhs, p2);
while (l1>0) and (l2>0) do
begin
Result := Ord(p1^) - Ord(p2^);
if Result <> 0 then Exit;
Dec(l1);
Dec(l2);
Inc(p1);
Inc(p2);
end;
Result := l1 - l2;
end;
type
TIStringImpl = class(TInterfacedObject, IInterfacedString)
FContainer: nsStringContainer;
FString: nsString;
FOwn: Boolean;
public
constructor Create; overload;
constructor Create(src: PWideChar); overload;
constructor Create(src: WideString); overload;
constructor Create(src: nsAString); overload;
constructor Relate(src: nsAString; own: Boolean);
destructor Destroy; override;
function Length: Longword;
procedure Cut(cutStart, cutLength: Longword);
procedure Assign(Source: IInterfacedString); overload;
procedure Assign(const Source: nsAString); overload;
procedure Assign(Source: WideString); overload;
procedure Append(Source: IInterfacedString); overload;
procedure Append(const Source: nsAString); overload;
procedure Append(Source: WideString); overload;
procedure Insert(Source: IInterfacedString; aPosition: Longword); overload;
procedure Insert(const Source: nsAString; aPosition: Longword); overload;
procedure Insert(Source: WideString; aPosition: Longword); overload;
procedure Replace(aPosition, aLength: Longword; const Source: nsAString); overload;
procedure Replace(aPosition, aLength: Longword; Source: IInterfacedString); overload;
function AString: nsAString;
function SIToString: WideString;
function IInterfacedString.ToString = SIToString;
end;
function NewString: IInterfacedString;
begin
Result := TIStringImpl.Create;
end;
function NewString(src: PWideChar): IInterfacedString;
begin
Result := TIStringImpl.Create(src);
end;
function NewString(src: WideString): IInterfacedString;
begin
Result := TIStringImpl.Create(src);
end;
function NewString(src: nsAString): IInterfacedString;
begin
Result := TIStringImpl.Create(src);
end;
function RelateString(src: nsAString; own: Boolean): IInterfacedString;
begin
Result := TIStringImpl.Relate(src, own);
end;
constructor TIStringImpl.Create;
begin
inherited Create;
if NS_FAILED(NS_StringContainerInit(FContainer)) then
Error(reOutOfMemory);
FOwn := True;
FString := @FContainer;
end;
constructor TIStringImpl.Create(src: PWideChar);
begin
inherited Create;
if NS_FAILED(NS_StringContainerInit(FContainer)) then
Error(reOutOfMemory);
FOwn := True;
FString := @FContainer;
Assign(src);
//nsMemory.Free(src);
end;
constructor TIStringImpl.Create(src: WideString);
begin
inherited Create;
if NS_FAILED(NS_StringContainerInit(FContainer)) then
Error(reOutOfMemory);
FOwn := True;
FString := @FContainer;
Assign(src);
end;
constructor TIStringImpl.Create(src: nsAString);
begin
inherited Create;
if NS_FAILED(NS_StringContainerInit(FContainer)) then
Error(reOutOfMemory);
FOwn := True;
FString := @FContainer;
Assign(src);
end;
constructor TIStringImpl.Relate(src: nsAString; own: Boolean);
begin
inherited Create;
FString := src;
FOwn := own;
end;
destructor TIStringImpl.Destroy;
begin
if FOwn then
NS_StringContainerFinish(FString^);
inherited Destroy;
end;
function TIStringImpl.Length: Longword;
var
temp: PWideChar;
begin
Result := NS_StringGetData(FString, temp);
//nsMemory.Free(temp);
end;
procedure TIStringImpl.Cut(cutStart, cutLength: Longword);
begin
NS_StringCutData(FString, cutStart, cutLength);
end;
procedure TIStringImpl.Assign(Source: IInterfacedString);
begin
NS_StringCopy(FString, Source.AString);
end;
procedure TIStringImpl.Assign(const Source: nsAString);
begin
NS_StringCopy(FString, Source);
end;
procedure TIStringImpl.Assign(Source: WideString);
begin
NS_StringSetData(FString, PWideChar(Source));
end;
procedure TIStringImpl.Append(Source: IInterfacedString);
begin
NS_StringAppendData(FString, PWideChar(Source.ToString));
end;
procedure TIStringImpl.Append(const Source: nsAString);
var
src2: IInterfacedString;
begin
src2 := NewString(Source);
Append(src2);
end;
procedure TIStringImpl.Append(Source: WideString);
var
src2: IInterfacedString;
begin
src2 := NewString(Source);
Append(src2);
end;
procedure TIStringImpl.Insert(Source: IInterfacedString; aPosition: Longword);
begin
NS_StringInsertData(FString, aPosition, PWideChar(Source.ToString));
end;
procedure TIStringImpl.Insert(const Source: nsAString; aPosition: Longword);
var
src2: IInterfacedString;
begin
src2 := NewString(Source);
Insert(src2, aPosition);
end;
procedure TIStringImpl.Insert(Source: WideString; aPosition: Longword);
var
src2: IInterfacedString;
begin
src2 := NewString(Source);
Insert(src2, aPosition);
end;
procedure TIStringImpl.Replace(aPosition, aLength: Longword; Source: IInterfacedString);
begin
NS_StringSetDataRange(FString, aPosition, aLength, PWideChar(Source.ToString));
end;
procedure TIStringImpl.Replace(aPosition, aLength: Longword; const Source: nsAString);
var
src2: IInterfacedString;
begin
src2 := NewString(Source);
Replace(aPosition, aLength, Src2);
end;
function TIStringImpl.AString: nsAString;
begin
Result := FString;
end;
function TIStringImpl.SIToString: WideString;
var
p: PWideChar;
l: Longword;
i: Longword;
begin
l := NS_StringGetData(FString, p);
SetLength(Result, l);
for i:=1 to l do
begin
Result[i] := p^;
Inc(p);
end;
end;
type
TICStringImpl = class(TInterfacedObject, IInterfacedCString)
FContainer: nsCStringContainer;
FString: nsCString;
FOwn: Boolean;
constructor Create; overload;
constructor Create(src: AnsiString); overload;
constructor Create(src: nsACString); overload;
constructor Relate(src: nsACString; own: Boolean); overload;
destructor Destroy; override;
function Length: Longword;
procedure Cut(cutStart, cutLength: Longword);
procedure Assign(Source: IInterfacedCString); overload;
procedure Assign(const Source: nsACString); overload;
procedure Assign(Source: AnsiString); overload;
procedure Append(Source: IInterfacedCString); overload;
procedure Append(const Source: nsACString); overload;
procedure Append(Source: AnsiString); overload;
procedure Insert(Source: IInterfacedCString; aPosition: Longword); overload;
procedure Insert(const Source: nsACString; aPosition: Longword); overload;
procedure Insert(Source: AnsiString; aPosition: Longword); overload;
procedure Replace(aPosition, aLength: Longword; const Source: nsACString); overload;
procedure Replace(aPosition, aLength: Longword; Source: IInterfacedCString); overload;
function ACString: nsACString;
function ToAnsiString: AnsiString;
function IInterfacedCString.ToString = ToAnsiString;
end;
TIUTF8StringImpl = class(TInterfacedObject, IInterfacedUTF8String)
FContainer: nsCStringContainer;
FString: nsCString;
FOwn: Boolean;
constructor Create; overload;
constructor Create(src: UTF8String); overload;
constructor Create(src: nsAUTF8String); overload;
constructor Relate(src: nsAUTF8String; own: Boolean); overload;
destructor Destroy; override;
function Length: Longword;
procedure Cut(cutStart, cutLength: Longword);
procedure Assign(Source: IInterfacedUTF8String); overload;
procedure Assign(const Source: nsAUTF8String); overload;
procedure Assign(Source: UTF8String); overload;
procedure Append(Source: IInterfacedUTF8String); overload;
procedure Append(const Source: nsAUTF8String); overload;
procedure Append(Source: UTF8String); overload;
procedure Insert(Source: IInterfacedUTF8String; aPosition: Longword); overload;
procedure Insert(const Source: nsAUTF8String; aPosition: Longword); overload;
procedure Insert(Source: UTF8String; aPosition: Longword); overload;
procedure Replace(aPosition, aLength: Longword; const Source: nsAUTF8String); overload;
procedure Replace(aPosition, aLength: Longword; Source: IInterfacedUTF8String); overload;
function AUTF8String: nsAUTF8String;
function ToUTF8String: UTF8String;
function IInterfacedUTF8String.ToString = ToUTF8String;
end;
function NewCString: IInterfacedCString;
begin
Result := TICStringImpl.Create;
end;
function NewCString(src: PAnsiChar): IInterfacedCString;
begin
Result := TICStringImpl.Create(src);
end;
function NewCString(src: AnsiString): IInterfacedCString;
begin
Result := TICStringImpl.Create(src);
end;
function NewCString(src: nsACString): IInterfacedCString;
begin
Result := TICStringImpl.Create(src);
end;
function RelateCString(src: nsACString; own: Boolean): IInterfacedCString;
begin
Result := TICStringImpl.Relate(src, own);
end;
function NewUTF8String: IInterfacedUTF8String;
begin
Result := TIUTF8StringImpl.Create;
end;
function NewUTF8String(src: PAnsiChar): IInterfacedUTF8String;
begin
Result := TIUTF8StringImpl.Create(src);
end;
function NewUTF8String(src: UTF8String): IInterfacedUTF8String;
begin
Result := TIUTF8StringImpl.Create(src);
end;
function NewUTF8String(src: nsAUTF8String): IInterfacedUTF8String;
begin
Result := TIUTF8StringImpl.Create(src);
end;
function RelateUTF8String(src: nsAUTF8String; own: Boolean): IInterfacedUTF8String;
begin
Result := TIUTF8StringImpl.Relate(src, own);
end;
constructor TICStringImpl.Create;
begin
inherited Create;
if NS_FAILED(NS_CStringContainerInit(FContainer)) then
Error(reOutOfMemory);
FOwn := True;
FString := @FContainer;
inherited Create;
end;
constructor TICStringImpl.Create(src: AnsiString);
begin
inherited Create;
if NS_FAILED(NS_CStringContainerInit(FContainer)) then
Error(reOutOfMemory);
FOwn := True;
FString := @FContainer;
Assign(src);
end;
constructor TICStringImpl.Create(src: nsACString);
begin
inherited Create;
if NS_FAILED(NS_CStringContainerInit(FContainer)) then
Error(reOutOfMemory);
FOwn := True;
FString := @FContainer;
Assign(src);
end;
constructor TICStringImpl.Relate(src: nsACString; own: Boolean);
begin
inherited Create;
FString := src;
FOwn := own;
end;
destructor TICStringImpl.Destroy;
begin
if FOwn then
NS_CStringContainerFinish(FString^);
inherited Destroy;
end;
function TICStringImpl.Length: Longword;
var
temp: PAnsiChar;
begin
Result := NS_CStringGetData(FString, temp);
end;
procedure TICStringImpl.Cut(cutStart, cutLength: Longword);
begin
NS_CStringCutData(FString, cutStart, cutLength);
end;
procedure TICStringImpl.Assign(Source: IInterfacedCString);
begin
NS_CStringCopy(FString, Source.ACString);
end;
procedure TICStringImpl.Assign(const Source: nsACString);
begin
NS_CStringCopy(FString, Source);
end;
procedure TICStringImpl.Assign(Source: AnsiString);
begin
NS_CStringSetData(FString, PAnsiChar(Source));
end;
procedure TICStringImpl.Append(Source: IInterfacedCString);
var
src2: PAnsiChar;
begin
NS_CStringGetData(Source.ACString, src2);
NS_CStringAppendData(FString, src2);
end;
procedure TICStringImpl.Append(const Source: nsACString);
var
src2: PAnsiChar;
begin
NS_CStringGetData(Source, src2);
NS_CStringAppendData(FString, src2);
end;
procedure TICStringImpl.Append(Source: AnsiString);
begin
NS_CStringAppendData(FString, PAnsiChar(Source));
end;
procedure TICStringImpl.Insert(Source: IInterfacedCString; aPosition: Longword);
var
src2: PAnsiChar;
begin
NS_CStringGetData(Source.ACString, src2);
NS_CStringInsertData(FString, aPosition, src2);
end;
procedure TICStringImpl.Insert(const Source: nsACString; aPosition: Longword);
var
src2: PAnsiChar;
begin
NS_CStringGetData(Source, src2);
NS_CStringInsertData(FString, aPosition, src2);
end;
procedure TICStringImpl.Insert(Source: AnsiString; aPosition: Longword);
begin
NS_CStringInsertData(FString, aPosition, PAnsiChar(Source));
end;
procedure TICStringImpl.Replace(aPosition, aLength: Longword; Source: IInterfacedCString);
var
src2: PAnsiChar;
begin
NS_CStringGetData(Source.ACString, src2);
NS_CStringSetDataRange(FString, aPosition, aLength, src2);
end;
procedure TICStringImpl.Replace(aPosition, aLength: Longword; const Source: nsACString);
var
src2: PAnsiChar;
begin
NS_CStringGetData(Source, src2);
NS_CStringSetDataRange(FString, aPosition, aLength, src2);
end;
function TICStringImpl.ACString: nsACString;
begin
Result := FString;
end;
function TICStringImpl.ToAnsiString: AnsiString;
var
p: PAnsiChar;
l: Longword;
i: Longword;
begin
l := NS_CStringGetData(FString, p);
SetLength(Result, l);
for i:=1 to l do
begin
Result[i] := p^;
Inc(p);
end;
end;
constructor TIUTF8StringImpl.Create;
begin
inherited Create;
if NS_FAILED(NS_CStringContainerInit(FContainer)) then
Error(reOutOfMemory);
FOwn := True;
FString := @FContainer;
inherited Create;
end;
constructor TIUTF8StringImpl.Create(src: UTF8String);
begin
inherited Create;
if NS_FAILED(NS_CStringContainerInit(FContainer)) then
Error(reOutOfMemory);
FOwn := True;
FString := @FContainer;
Assign(src);
end;
constructor TIUTF8StringImpl.Create(src: nsAUTF8String);
begin
inherited Create;
if NS_FAILED(NS_CStringContainerInit(FContainer)) then
Error(reOutOfMemory);
FOwn := True;
FString := @FContainer;
Assign(src);
end;
constructor TIUTF8StringImpl.Relate(src: nsAUTF8String; own: Boolean);
begin
inherited Create;
FString := src;
FOwn := own;
end;
destructor TIUTF8StringImpl.Destroy;
begin
if FOwn then
NS_CStringContainerFinish(FString^);
inherited Destroy;
end;
function TIUTF8StringImpl.Length: Longword;
var
temp: PAnsiChar;
begin
Result := NS_CStringGetData(FString, temp);
end;
procedure TIUTF8StringImpl.Cut(cutStart: Cardinal; cutLength: Cardinal);
begin
NS_CStringCutData(FString, cutStart, cutLength);
end;
procedure TIUTF8StringImpl.Assign(Source: IInterfacedUTF8String);
begin
NS_CStringCopy(FString, Source.AUTF8String);
end;
procedure TIUTF8StringImpl.Assign(const Source: nsAUTF8String);
begin
NS_CStringCopy(FString, Source);
end;
procedure TIUTF8StringImpl.Assign(Source: UTF8String);
begin
NS_CStringSetData(FString, PAnsiChar(Source));
end;
procedure TIUTF8StringImpl.Append(Source: IInterfacedUTF8String);
begin
NS_CStringAppendData(FString, PAnsiChar(Source.ToString));
end;
procedure TIUTF8StringImpl.Append(const Source: nsAUTF8String);
var
src2: PAnsiChar;
begin
NS_CStringGetData(source, src2);
NS_CStringAppendData(FString, src2);
end;
procedure TIUTF8StringImpl.Append(Source: UTF8String);
begin
NS_CStringAppendData(FString, PAnsiChar(Source));
end;
procedure TIUTF8StringImpl.Insert(Source: IInterfacedUTF8String; aPosition: Longword);
begin
NS_CStringInsertData(FString, aPosition, PAnsiChar(Source.ToString));
end;
procedure TIUTF8StringImpl.Insert(const Source: nsAUTF8String; aPosition: Longword);
var
src2: PAnsiChar;
begin
NS_CStringGetData(source, src2);
NS_CStringInsertData(FString, aPosition, src2);
end;
procedure TIUTF8StringImpl.Insert(Source: UTF8String; aPosition: Longword);
begin
NS_CStringInsertData(FString, aPosition, PAnsiChar(Source));
end;
procedure TIUTF8StringImpl.Replace(aPosition, aLength: Longword; Source: IInterfacedUTF8String);
var
src2: PAnsiChar;
begin
NS_CStringGetData(source.AUTF8String, src2);
NS_CStringSetDataRange(FString, aPosition, aLength, src2);
end;
procedure TIUTF8StringImpl.Replace(aPosition, aLength: Longword; const Source: nsAUTF8String);
var
src2: PAnsiChar;
begin
NS_CStringGetData(source, src2);
NS_CStringSetDataRange(FString, aPosition, aLength, src2);
end;
function TIUTF8StringImpl.AUTF8String: nsAUTF8String;
begin
Result := FString;
end;
function TIUTF8StringImpl.ToUTF8String:UTF8String;
var
p: PAnsiChar;
l: Longword;
i: Longword;
begin
l := NS_CStringGetData(FString, p);
SetLength(Result, l);
for i:=1 to l do
begin
Result[i] := p^;
Inc(p);
end;
end;
end.