Browse Source

* fix bugs 3477, 3478, 3479

peter 20 years ago
parent
commit
cb255fffed
1 changed files with 66 additions and 42 deletions
  1. 66 42
      rtl/objpas/sysutils/sysstr.inc

+ 66 - 42
rtl/objpas/sysutils/sysstr.inc

@@ -128,7 +128,7 @@ begin
   while (result=0) and (I<length) do
     begin
     result:=byte(P1^)-byte(P2^);
-    P1:=pchar(P1)+1;		// VP compat.
+    P1:=pchar(P1)+1;            // VP compat.
     P2:=pchar(P2)+1;
     i := i + 1;
    end ;
@@ -486,23 +486,23 @@ begin
  if P=Q then exit;
  if P^<>quote then exit;
  inc(p);
-   
+
  setlength(result,(Q-P)+1);
  R:=@Result[1];
  i := 0;
- while P <> Q do 
+ while P <> Q do
    begin
-     R^:=P^; 
+     R^:=P^;
      inc(R);
      if (P^ = Quote) then
        begin
          P := P + 1;
          if (p^ <> Quote) then
           begin
-	    dec(R);
-	    break;
+            dec(R);
+            break;
           end;
-       end; 
+       end;
      P := P + 1;
    end ;
  src:=p;
@@ -788,7 +788,11 @@ Var ChPos,OldPos,ArgPos,DoArg,Len : Longint;
     Index,Width,Prec : Longint;
     Left : Boolean;
     Fchar : char;
+{$ifdef ver1_0}
     vl : int64;
+{$else}
+    vq : qword;
+{$endif}
 
   {
     ReadFormat reads the format string. It returns the type character in
@@ -910,8 +914,8 @@ var Code: word;
     inc(chpos);
     If Fmt[Chpos]='%' then
       begin
-	Result:='%';
-  	exit;				// VP fix
+        Result:='%';
+        exit;                           // VP fix
       end;
     ReadIndex;
     ReadLeft;
@@ -984,11 +988,11 @@ begin
         'D' : begin
               if Checkarg(vtinteger,false) then
                 Str(Args[Doarg].VInteger,ToAdd)
-  	      {$IFNDEF VIRTUALPASCAL}
+              {$IFNDEF VIRTUALPASCAL}
               else if CheckArg(vtInt64,true) then
                 Str(Args[DoArg].VInt64^,toadd)
-	      {$ENDIF}
-	      ;
+              {$ENDIF}
+              ;
               Width:=Abs(width);
               Index:=Prec-Length(ToAdd);
               If ToAdd[1]<>'-' then
@@ -1000,15 +1004,15 @@ begin
         'U' : begin
               if Checkarg(vtinteger,false) then
                 Str(cardinal(Args[Doarg].VInteger),ToAdd)
-  	      {$IFNDEF VIRTUALPASCAL}
+              {$IFNDEF VIRTUALPASCAL}
               else if CheckArg(vtInt64,true) then
                 Str(qword(Args[DoArg].VInt64^),toadd)
-	      {$ENDIF}
-	      ;
+              {$ENDIF}
+              ;
               Width:=Abs(width);
               Index:=Prec-Length(ToAdd);
-	      ToAdd:=StringOfChar('0',Index)+ToAdd
-              end;        
+              ToAdd:=StringOfChar('0',Index)+ToAdd
+              end;
         'E' : begin
               CheckArg(vtExtended,true);
               ToAdd:=FloatToStrF(Args[doarg].VExtended^,ffexponent,Prec,3);
@@ -1064,38 +1068,55 @@ begin
               // Insert(':',ToAdd,5);
               end;
         'X' : begin
+{$ifdef ver1_0}
               if Checkarg(vtinteger,false) then
-	         begin
-	           vl:=Args[Doarg].VInteger;
-		   index:=16;
-	         end
-	      else
-	         begin
+                 begin
+                   vl:=Args[Doarg].VInteger and int64($ffffffff);
+                   index:=16;
+                 end
+              else
+                 begin
                    CheckArg(vtInt64,true);
-		   vl:=Args[DoArg].VInt64^;
-		   index:=31;
-	         end;
+                   vl:=Args[DoArg].VInt64^;
+                   index:=31;
+                 end;
               If Prec>index then
                 ToAdd:=HexStr(vl,index)
               else
                 begin
                 // determine minimum needed number of hex digits.
                 Index:=1;
-		{$Ifdef ver1_0}
                  While (DWord(1 shl (Index*4))<=DWord(Args[DoArg].VInteger)) and (index<8) do
                   inc(Index);
-		{$else}
-                While (qWord(1 shl (Index*4))<=qWord(vl)) and (index<16) do
-                 inc(Index);
-		{$endif}
                 If Index>Prec then
                   Prec:=Index;
-		{$ifdef ver1_0}
                 ToAdd:=HexStr(int64(vl),Prec);
-		{$else}
-                ToAdd:=HexStr(qword(vl),Prec);
-		{$endif}
                 end;
+{$else}
+              if Checkarg(vtinteger,false) then
+                 begin
+                   vq:=Cardinal(Args[Doarg].VInteger);
+                   index:=16;
+                 end
+              else
+                 begin
+                   CheckArg(vtInt64,true);
+                   vq:=Qword(Args[DoArg].VInt64^);
+                   index:=31;
+                 end;
+              If Prec>index then
+                ToAdd:=HexStr(vq,index)
+              else
+                begin
+                // determine minimum needed number of hex digits.
+                Index:=1;
+                While (qWord(1) shl (Index*4)<=vq) and (index<16) do
+                  inc(Index);
+                If Index>Prec then
+                  Prec:=Index;
+                ToAdd:=HexStr(vq,Prec);
+                end;
+{$endif}
               end;
         '%': ToAdd:='%';
       end;
@@ -2186,8 +2207,8 @@ Var
   C,LQ,BC : Char;
   P,BLen,Len : Integer;
   HB,IBC : Boolean;
-  
-begin 
+
+begin
   Result:='';
   L:=Line;
   Blen:=Length(BreakStr);
@@ -2211,12 +2232,12 @@ begin
         LQ:=C;
       If (LQ<>#0) then
         Inc(P)
-      else  
+      else
         begin
         HB:=((C=BC) and (BreakStr=Copy(L,P,BLen)));
         If HB then
-          Inc(P,Blen-1)
-        else 
+          Inc(P,Blen)
+        else
           begin
           If (P>MaxCol) then
             IBC:=C in BreakChars;
@@ -2237,7 +2258,7 @@ function WrapText(const Line: string; MaxCol: Integer): string;
 begin
   Result:=WrapText(Line,sLineBreak, [' ', '-', #9], MaxCol);
 end;
-  
+
 
 {
    Case Translation Tables
@@ -2299,7 +2320,10 @@ const
 
 {
   $Log$
-  Revision 1.23  2004-12-19 17:55:38  michael
+  Revision 1.24  2004-12-26 13:04:30  peter
+    * fix bugs 3477, 3478, 3479
+
+  Revision 1.23  2004/12/19 17:55:38  michael
   + Implemented wraptext
 
   Revision 1.22  2004/12/01 10:34:46  michael