809 lines
22 KiB
ObjectPascal
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.
|