summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormarco <marco@3ad0048d-3df7-0310-abae-a5850022a9f2>2016-05-25 20:24:22 +0000
committermarco <marco@3ad0048d-3df7-0310-abae-a5850022a9f2>2016-05-25 20:24:22 +0000
commitdd09e33215e8ce56117e93042ace7aa0581966f8 (patch)
tree31a40622cafc5e3aeb5884d5949ff55e086b499a
parent60d8e1fb4d2ce8771fb7d635683db20f70c01c1c (diff)
downloadfpc-dd09e33215e8ce56117e93042ace7aa0581966f8.tar.gz
# revisions: 31464,31468
git-svn-id: http://svn.freepascal.org/svn/fpc/branches/fixes_3_0@33801 3ad0048d-3df7-0310-abae-a5850022a9f2
-rw-r--r--rtl/inc/astrings.inc25
-rw-r--r--rtl/inc/sstrings.inc21
-rw-r--r--rtl/inc/systemh.inc12
-rw-r--r--rtl/inc/wstrings.inc43
-rw-r--r--rtl/java/jsystemh.inc2
5 files changed, 57 insertions, 46 deletions
diff --git a/rtl/inc/astrings.inc b/rtl/inc/astrings.inc
index af86f334c4..dfd2f4c2e2 100644
--- a/rtl/inc/astrings.inc
+++ b/rtl/inc/astrings.inc
@@ -915,18 +915,18 @@ end;
{$ifndef FPC_HAS_POS_SHORTSTR_ANSISTR}
{$define FPC_HAS_POS_SHORTSTR_ANSISTR}
-Function Pos(Const Substr : ShortString; Const Source : RawByteString) : SizeInt;
+Function Pos(Const Substr : ShortString; Const Source : RawByteString; Offset : Sizeint = 1) : SizeInt;
var
i,MaxLen : SizeInt;
pc : PAnsiChar;
begin
Pos:=0;
- if Length(SubStr)>0 then
+ if (Length(SubStr)>0) and (Offset>0) and (Offset<=Length(Source)) then
begin
MaxLen:=Length(source)-Length(SubStr);
- i:=0;
- pc:=@source[1];
+ i:=Offset-1;
+ pc:=@source[Offset];
while (i<=MaxLen) do
begin
inc(i);
@@ -945,17 +945,17 @@ end;
{$ifndef FPC_HAS_POS_ANSISTR_ANSISTR}
{$define FPC_HAS_POS_ANSISTR_ANSISTR}
-Function Pos(Const Substr : RawByteString; Const Source : RawByteString) : SizeInt;
+Function Pos(Const Substr : RawByteString; Const Source : RawByteString; Offset : Sizeint = 1) : SizeInt;
var
i,MaxLen : SizeInt;
pc : PAnsiChar;
begin
Pos:=0;
- if Length(SubStr)>0 then
+ if (Length(SubStr)>0) and (Offset>0) and (Offset<=Length(Source)) then
begin
MaxLen:=Length(source)-Length(SubStr);
- i:=0;
- pc:=@source[1];
+ i:=Offset-1;
+ pc:=@source[Offset];
while (i<=MaxLen) do
begin
inc(i);
@@ -978,13 +978,16 @@ end;
{ pos(c: char; const s: shortstring) also exists, so otherwise }
{ using pos(char,pchar) will always call the shortstring version }
{ (exact match for first argument), also with $h+ (JM) }
-Function Pos(c : AnsiChar; Const s : RawByteString) : SizeInt;
+Function Pos(c : AnsiChar; Const s : RawByteString; Offset : Sizeint = 1) : SizeInt;
var
i: SizeInt;
pc : PAnsiChar;
begin
- pc:=@s[1];
- for i:=1 to length(s) do
+ Pos:=0;
+ If (Offset<1) or (Offset>Length(S)) then
+ exit;
+ pc:=@s[OffSet];
+ for i:=Offset to length(s) do
begin
if pc^=c then
begin
diff --git a/rtl/inc/sstrings.inc b/rtl/inc/sstrings.inc
index f16f2c910f..62147205b4 100644
--- a/rtl/inc/sstrings.inc
+++ b/rtl/inc/sstrings.inc
@@ -125,17 +125,17 @@ end;
{$ifndef FPC_HAS_SHORTSTR_POS_SHORTSTR}
{$define FPC_HAS_SHORTSTR_POS_SHORTSTR}
-function pos(const substr : shortstring;const s : shortstring):SizeInt;
+function pos(const substr : shortstring;const s : shortstring; Offset : Sizeint = 1):SizeInt;
var
i,MaxLen : SizeInt;
pc : pchar;
begin
Pos:=0;
- if Length(SubStr)>0 then
+ if (Length(SubStr)>0) and (Offset>0) and (Offset<=Length(S)) then
begin
MaxLen:=sizeint(Length(s))-Length(SubStr);
- i:=0;
- pc:=@s[1];
+ i:=Offset-1;
+ pc:=@s[Offset];
while (i<=MaxLen) do
begin
inc(i);
@@ -155,13 +155,16 @@ end;
{$ifndef FPC_HAS_SHORTSTR_POS_CHAR}
{$define FPC_HAS_SHORTSTR_POS_CHAR}
{Faster when looking for a single char...}
-function pos(c:char;const s:shortstring):SizeInt;
+function pos(c:char;const s:shortstring; Offset : Sizeint = 1 ):SizeInt;
var
i : SizeInt;
pc : pchar;
begin
- pc:=@s[1];
- for i:=1 to length(s) do
+ Pos:=0;
+ if (Offset<1) or (Offset>Length(S)) then
+ exit;
+ pc:=@s[Offset];
+ for i:=Offset to length(s) do
begin
if pc^=c then
begin
@@ -183,9 +186,9 @@ begin
fpc_char_Copy:='';
end;
-function pos(const substr : shortstring;c:char): SizeInt;
+function pos(const substr : shortstring;c:char; Offset : Sizeint = 1): SizeInt;
begin
- if (length(substr)=1) and (substr[1]=c) then
+ if (length(substr)=1) and (substr[1]=c) and (Offset=1) then
Pos:=1
else
Pos:=0;
diff --git a/rtl/inc/systemh.inc b/rtl/inc/systemh.inc
index 5f7ed3fb93..9874ad176c 100644
--- a/rtl/inc/systemh.inc
+++ b/rtl/inc/systemh.inc
@@ -1082,10 +1082,10 @@ function Utf8CodePointLen(P: PAnsiChar; MaxLookAhead: SizeInt; IncludeCombiningD
Procedure Delete(var s:shortstring;index:SizeInt;count:SizeInt);
Procedure Insert(const source:shortstring;var s:shortstring;index:SizeInt);
Procedure Insert(source:Char;var s:shortstring;index:SizeInt);
-Function Pos(const substr:shortstring;const s:shortstring):SizeInt;
-Function Pos(C:Char;const s:shortstring):SizeInt;
+Function Pos(const substr:shortstring;const s:shortstring; Offset: Sizeint = 1):SizeInt;
+Function Pos(C:Char;const s:shortstring; Offset: Sizeint = 1):SizeInt;
{$ifdef FPC_HAS_FEATURE_ANSISTRINGS}
-Function Pos(const Substr : ShortString; const Source : RawByteString) : SizeInt;
+Function Pos(const Substr : ShortString; const Source : RawByteString; Offset: Sizeint = 1) : SizeInt;
{$ifdef FPC_HAS_CPSTRING}
Procedure fpc_setstring_ansistr_pansichar(out S : RawByteString; Buf : PAnsiChar; Len : SizeInt; cp: TSystemCodePage); rtlproc; compilerproc;
@@ -1121,7 +1121,7 @@ Function hexStr(Val:Pointer):shortstring;
Function chr(b : byte) : Char; [INTERNPROC: fpc_in_chr_byte];
Function upCase(c:Char):Char;
Function lowerCase(c:Char):Char; overload;
-function pos(const substr : shortstring;c:char): SizeInt;
+function pos(const substr : shortstring;c:char; Offset: Sizeint = 1): SizeInt;
{****************************************************************************
@@ -1130,8 +1130,8 @@ function pos(const substr : shortstring;c:char): SizeInt;
{$ifdef FPC_HAS_FEATURE_ANSISTRINGS}
Procedure UniqueString(var S : RawByteString);{$ifdef FPC_HAS_CPSTRING}rtlproc;{$endif FPC_HAS_CPSTRING}external name 'FPC_ANSISTR_UNIQUE';
-Function Pos (const Substr : RawByteString; const Source : RawByteString) : SizeInt;
-Function Pos (c : AnsiChar; const s : RawByteString) : SizeInt;
+Function Pos (const Substr : RawByteString; const Source : RawByteString; Offset: Sizeint = 1) : SizeInt;
+Function Pos (c : AnsiChar; const s : RawByteString; Offset: Sizeint = 1) : SizeInt;
Procedure Insert (const Source : RawByteString; var S : RawByteString; Index : SizeInt);{$ifdef FPC_HAS_CPSTRING}rtlproc;{$endif FPC_HAS_CPSTRING}
Procedure Delete (var S : RawByteString; Index,Size: SizeInt);{$ifdef FPC_HAS_CPSTRING}rtlproc;{$endif FPC_HAS_CPSTRING}
Function StringOfChar(c : Ansichar;l : SizeInt) : AnsiString;
diff --git a/rtl/inc/wstrings.inc b/rtl/inc/wstrings.inc
index 60f0cab1e0..364ae8f5ad 100644
--- a/rtl/inc/wstrings.inc
+++ b/rtl/inc/wstrings.inc
@@ -578,17 +578,17 @@ begin
end;
-Function Pos (Const Substr : WideString; Const Source : WideString) : SizeInt;
+Function Pos (Const Substr : WideString; Const Source : WideString; Offset : SizeInt = 1) : SizeInt;
var
i,MaxLen : SizeInt;
pc : pwidechar;
begin
Pos:=0;
- if Length(SubStr)>0 then
+ if (Length(SubStr)>0) and (Offset>0) and (Offset<Length(Source)) then
begin
MaxLen:=Length(source)-Length(SubStr)-(OffSet-1);
- i:=0;
- pc:=@source[1];
+ i:=Offset-1;
+ pc:=@source[Offset];
while (i<=MaxLen) do
begin
inc(i);
@@ -605,13 +605,15 @@ end;
{ Faster version for a widechar alone }
-Function Pos (c : WideChar; Const s : WideString) : SizeInt;
+Function Pos (c : WideChar; Const s : WideString; Offset : Sizeint = 1) : SizeInt;
var
i: SizeInt;
pc : pwidechar;
begin
- pc:=@s[1];
- for i:=1 to length(s) do
+ pos:=0;
+ if (Offset<1) or (Offset>Length(s)) then exit;
+ pc:=@s[Offset];
+ for i:=Offset to length(s) do
begin
if pc^=c then
begin
@@ -620,47 +622,50 @@ begin
end;
inc(pc);
end;
- pos:=0;
end;
{ DO NOT inline these! Inlining a managed typecast creates an implicit try..finally
block, which is significant bloat without any sensible speed improvement. }
-Function Pos (c : WideChar; Const s : RawByteString) : SizeInt;
+Function Pos (c : WideChar; Const s : RawByteString; Offset : SizeInt = 1) : SizeInt;
begin
- result:=Pos(c,WideString(s));
+ result:=Pos(c,WideString(s),Offset);
end;
-Function Pos (const c : RawByteString; Const s : WideString) : SizeInt;
+Function Pos (const c : RawByteString; Const s : WideString;Offset : SizeInt = 1) : SizeInt;
begin
- result:=Pos(WideString(c),s);
+ result:=Pos(WideString(c),s,Offset);
end;
-Function Pos (const c : ShortString; Const s : WideString) : SizeInt;
+Function Pos (const c : ShortString; Const s : WideString;Offset : SizeInt = 1) : SizeInt;
begin
- result:=Pos(WideString(c),s);
+ result:=Pos(WideString(c),s,Offset);
end;
-Function Pos (const c : WideString; Const s : RawByteString) : SizeInt;
+Function Pos (const c : WideString; Const s : RawByteString;Offset : SizeInt = 1) : SizeInt;
begin
- result:=Pos(c,WideString(s));
+ result:=Pos(c,WideString(s),Offset);
end;
{ Faster version for a char alone. Must be implemented because }
{ pos(c: char; const s: shortstring) also exists, so otherwise }
{ using pos(char,pchar) will always call the shortstring version }
{ (exact match for first argument), also with $h+ (JM) }
-Function Pos (c : Char; Const s : WideString) : SizeInt;
+Function Pos (c : Char; Const s : WideString;Offset : SizeInt = 1) : SizeInt;
var
i: SizeInt;
wc : widechar;
pc : pwidechar;
begin
+ Pos:=0;
+ if (Offset<1) or (OffSet>Length(S)) then
+ exit;
wc:=c;
- pc:=@s[1];
- for i:=1 to length(s) do
+
+ pc:=@s[offset];
+ for i:=Offset to length(s) do
begin
if pc^=wc then
begin
diff --git a/rtl/java/jsystemh.inc b/rtl/java/jsystemh.inc
index 76047d74e1..37c4e91456 100644
--- a/rtl/java/jsystemh.inc
+++ b/rtl/java/jsystemh.inc
@@ -500,7 +500,7 @@ Function hexStr(Val:Pointer):shortstring;
Function chr(b : byte) : Char; [INTERNPROC: fpc_in_chr_byte];
Function upCase(c:Char):Char;
Function lowerCase(c:Char):Char; overload;
-function pos(const substr : shortstring;c:char): SizeInt;
+function pos(const substr : shortstring;c:char; Offset : Sizeint=1): SizeInt;
{****************************************************************************