diff options
author | marco <marco@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2016-05-25 20:24:22 +0000 |
---|---|---|
committer | marco <marco@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2016-05-25 20:24:22 +0000 |
commit | dd09e33215e8ce56117e93042ace7aa0581966f8 (patch) | |
tree | 31a40622cafc5e3aeb5884d5949ff55e086b499a | |
parent | 60d8e1fb4d2ce8771fb7d635683db20f70c01c1c (diff) | |
download | fpc-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.inc | 25 | ||||
-rw-r--r-- | rtl/inc/sstrings.inc | 21 | ||||
-rw-r--r-- | rtl/inc/systemh.inc | 12 | ||||
-rw-r--r-- | rtl/inc/wstrings.inc | 43 | ||||
-rw-r--r-- | rtl/java/jsystemh.inc | 2 |
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; {**************************************************************************** |