lasarus_compotents/gecko/nsGeckoStrings.pas

809 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
begin
//Maybe the engine is being unloaded, so just skip error.
//Error(reOutOfMemory);
FillByte(FContainer,sizeof(FContainer),0);
end;
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.