diff --git a/rtl/objpas/sysstr.inc b/rtl/objpas/sysstr.inc index 2a018dee22..cae3409daa 100644 --- a/rtl/objpas/sysstr.inc +++ b/rtl/objpas/sysstr.inc @@ -26,8 +26,8 @@ function NewStr(const S: string): PString; begin - result := Nil; - if Length(S) <> 0 then + result := Nil; + if Length(S) <> 0 then begin New(Result); result^ := S; @@ -245,13 +245,13 @@ end ; function Trim(const S: string): string; var Ofs, Len: integer; begin -len := Length(S); -while (S[Len] = ' ') and (Len > 0) do + len := Length(S); + while (Len>0) and (S[Len] = ' ') do dec(Len); -Ofs := 1; -while (S[Ofs] = ' ') and (Ofs <= Len) do + Ofs := 1; + while (Ofs<=Len) and (S[Ofs] = ' ') do Inc(Ofs); -result := Copy(S, Ofs, 1 + Len - Ofs); + result := Copy(S, Ofs, 1 + Len - Ofs); end ; { TrimLeft returns a copy of S with all blank characters on the left stripped off } @@ -259,10 +259,11 @@ end ; function TrimLeft(const S: string): string; var i,l:integer; begin -l := length(s); -i := 1; -while (s[i] = ' ') and (i <= l) do inc(i); -Result := copy(s, i, l); + l := length(s); + i := 1; + while (i<=l) and (s[i] = ' ') do + inc(i); + Result := copy(s, i, l); end ; { TrimRight returns a copy of S with all blank characters on the right stripped off } @@ -270,9 +271,10 @@ end ; function TrimRight(const S: string): string; var l:integer; begin -l := length(s); -while (s[l] = ' ') and (l > 0) do dec(l); -result := copy(s,1,l); + l := length(s); + while (l>0) and (s[l] = ' ') do + dec(l); + result := copy(s,1,l); end ; { QuotedStr returns S quoted left and right and every single quote in S @@ -457,7 +459,7 @@ end; Function Format (Const Fmt : String; const Args : Array of const) : String; Var ChPos,OldPos,ArgPos,DoArg,Len : Longint; - ToAdd : String; + Hs,ToAdd : String; Index,Width,Prec : Longint; Left : Boolean; ExtVal: Extended; @@ -585,14 +587,15 @@ begin Writeln (' Type : ',C); end; -Procedure Checkarg (AT : Longint); +function Checkarg (AT : Longint;err:boolean):boolean; { Check if argument INDEX is of correct type (AT) If Index=-1, ArgPos is used, and argpos is augmented with 1 DoArg is set to the argument that must be used. } begin - If Index=-1 then + result:=false; + if Index=-1 then begin DoArg:=Argpos; inc(ArgPos); @@ -600,7 +603,12 @@ begin else DoArg:=Index; If (Doarg>High(Args)) or (Args[Doarg].Vtype<>AT) then - DoFormatError(feInvalidArgindex); + begin + if err then + DoFormatError(feInvalidArgindex); + exit; + end; + result:=true; end; Const Zero = '000000000000000000000000000000000000000000000000000000000000000'; @@ -625,7 +633,7 @@ begin {$endif} Case FChar of 'D' : begin - Checkarg(vtinteger); + Checkarg(vtinteger,true); Width:=Abs(width); Str(Args[Doarg].VInteger,ToAdd); While Length(ToAdd)-1) and (Index>Prec) then - Index:=Prec; - ToAdd:=Copy(Args[DoArg].VString^,1,Index); + if CheckArg(vtString,false) then + hs:=Args[doarg].VString^ + else + begin + dec(argpos); + if CheckArg(vtAnsiString,true) then + hs:=ansistring(Args[doarg].VAnsiString); + end; + Index:=Length(hs); + If (Prec<>-1) and (Index>Prec) then + Index:=Prec; + ToAdd:=Copy(hs,1,Index); end; 'P' : Begin - CheckArg(vtpointer); + CheckArg(vtpointer,true); ToAdd:=HexStr(Longint(Args[DoArg].VPointer),8); // Insert ':'. Is this needed in 32 bit ? No it isn't. // Insert(':',ToAdd,5); end; 'X' : begin - Checkarg(vtinteger); + Checkarg(vtinteger,true); If Prec>32 then ToAdd:=HexStr(Args[Doarg].VInteger,Prec) else @@ -676,7 +689,6 @@ begin ToAdd:=HexStr(Args[DoArg].VInteger,Prec); end; end; - '%': ToAdd:='%'; end; If Width<>-1 then @@ -692,8 +704,8 @@ begin end; end; -Function FormatBuf (Var Buffer; BufLen : Cardinal; - Const Fmt; fmtLen : Cardinal; +Function FormatBuf (Var Buffer; BufLen : Cardinal; + Const Fmt; fmtLen : Cardinal; Const Args : Array of const) : Cardinal; Var S,F : String; @@ -707,7 +719,7 @@ begin else Result:=Buflen; Move(S[1],Buffer,Result); -end; +end; Procedure FmtStr(Var Res: String; Const Fmt : String; Const args: Array of const); @@ -782,7 +794,7 @@ Begin End; End; End; - If Result[1] = ' ' Then + If Result[1] = ' ' Then System.Delete(Result, 1, 1); End; @@ -792,7 +804,7 @@ Begin If Digits = -1 Then Digits := 2 Else If Digits > 15 Then Digits := 15; Str(Value:0:Digits, Result); - If Result[1] = ' ' Then + If Result[1] = ' ' Then System.Delete(Result, 1, 1); P := Pos('.', Result); If P <> 0 Then Result[P] := DecimalSeparator; @@ -900,14 +912,14 @@ for i := 0 to SizeOf(Value) shr 1 - 1 do begin end ; { - Case Translation Tables - Can be used in internationalization support. - - Although these tables can be obtained through system calls - it is better to not use those, since most implementation are not 100% - WARNING: - before modifying a translation table make sure that the current codepage - of the OS corresponds to the one you make changes to + Case Translation Tables + Can be used in internationalization support. + + Although these tables can be obtained through system calls + it is better to not use those, since most implementation are not 100% + WARNING: + before modifying a translation table make sure that the current codepage + of the OS corresponds to the one you make changes to } const @@ -957,7 +969,11 @@ const { $Log$ - Revision 1.14 1999-03-01 12:40:06 michael + Revision 1.15 1999-04-04 10:19:07 peter + * format support for ansistring (from mailinglist) + * fixed length checking in Trim() + + Revision 1.14 1999/03/01 12:40:06 michael changed delete to system.delete Revision 1.13 1999/02/28 13:17:35 michael