Quellcode durchsuchen

- reverted r7790 because it's buggy (+ test)

git-svn-id: trunk@8444 -
Jonas Maebe vor 18 Jahren
Ursprung
Commit
77eaa77772
3 geänderte Dateien mit 184 neuen und 4 gelöschten Zeilen
  1. 1 0
      .gitattributes
  2. 4 4
      rtl/inc/sstrings.inc
  3. 179 0
      tests/test/units/system/tval5.pp

+ 1 - 0
.gitattributes

@@ -7166,6 +7166,7 @@ tests/test/units/system/tval1.pp -text
 tests/test/units/system/tval2.pp -text
 tests/test/units/system/tval3.pp -text
 tests/test/units/system/tval4.pp -text
+tests/test/units/system/tval5.pp svneol=native#text/plain
 tests/test/units/system/tvalc.pp -text
 tests/test/units/sysutils/execansi.pp svneol=native#text/plain
 tests/test/units/sysutils/execedbya.pp svneol=native#text/plain

+ 4 - 4
rtl/inc/sstrings.inc

@@ -894,13 +894,13 @@ begin
       u:=16;
      end;
      prev := fpc_Val_UInt_Shortstr;
-     fpc_Val_UInt_Shortstr:=fpc_Val_UInt_Shortstr*ValUInt(base) + u;
      If (u>=base) or
-        (prev>fpc_Val_UInt_Shortstr) then
+        (ValUInt(MaxUIntValue-u) div ValUInt(Base)<prev) then
       begin
         fpc_Val_UInt_Shortstr:=0;
         exit;
       end;
+     fpc_Val_UInt_Shortstr:=fpc_Val_UInt_Shortstr*ValUInt(base) + u;
      inc(code);
    end;
   code := 0;
@@ -995,13 +995,13 @@ end;
         u:=16;
        end;
        prev := fpc_val_qword_shortstr;
-       fpc_val_qword_shortstr:=fpc_val_qword_shortstr*QWord(base) + u;
        If (u>=base) or
-          (prev>fpc_val_qword_shortstr) then
+         ((QWord(maxqword-u) div QWord(base))<prev) then
          Begin
            fpc_val_qword_shortstr := 0;
            Exit
          End;
+       fpc_val_qword_shortstr:=fpc_val_qword_shortstr*QWord(base) + u;
        inc(code);
      end;
     code := 0;

+ 179 - 0
tests/test/units/system/tval5.pp

@@ -0,0 +1,179 @@
+procedure testcard;
+const
+  h = 1;
+  hexch : array[0..15] of char='0123456789ABCDEF';
+var
+  c: cardinal;
+  l: longint;
+  s: shortstring;
+  b, b2: byte;
+  ch, ch2: char;
+begin
+  s:='$0fffffff';
+  for b := low(hexch) to high(hexch) do
+    begin
+      s[2]:=hexch[b];
+      val(s,c,l);
+      if (l<>0) then
+        halt(b+h);
+    end;
+    
+  s:='$fffffff0';
+  for b := low(hexch) to high(hexch) do
+    begin
+      s[length(s)]:=hexch[b];
+      val(s,c,l);
+      if (l<>0) then
+        halt(b+16+h);
+    end;
+
+  setlength(s,10);
+  s[1]:='$';
+  for b2:= 1 to high(hexch) do
+    begin
+      for b := 2 to length(s)-1 do
+        s[b]:=hexch[b2];
+      for b := low(hexch) to high(hexch) do
+        begin
+          s[length(s)]:=hexch[b];
+          val(s,c,l);
+          if (l=0) then
+            halt(b2+32+h);
+        end;
+    end;
+
+  s:='0294967295';
+  for ch := '0' to '4' do
+    begin
+      s[1]:=ch;
+      val(s,c,l);
+      if (l<>0) then
+        halt(ord(ch)-ord('0')+b+49+h);
+    end;
+    
+  s:='4294967290';
+  for ch := '0' to '5' do
+    begin
+      s[length(s)]:=ch;
+      val(s,c,l);
+      if (l<>0) then
+        halt(ord(ch)-ord('0')+b+54+h);
+    end;
+
+  s:='4294967290';
+  for ch := '6' to '9' do
+    begin
+      s[length(s)]:=ch;
+      val(s,c,l);
+      if (l=0) then
+        halt(ord(ch)-ord('0')+b+54+h);
+    end;
+
+  setlength(s,length('4294967295')+1);
+  for ch2:= '1' to '3' do
+    begin
+      for b := 1 to length(s)-1 do
+        s[b]:=ch2;
+      for ch := '0' to '9' do
+        begin
+          s[length(s)]:=hexch[b];
+          val(s,c,l);
+          if (l=0) then
+            halt(ord(ch2)-ord('1')+65+h);
+        end;
+    end;
+
+end;
+
+
+procedure testqword;
+const
+  h = 71;
+  hexch : array[0..15] of char='0123456789ABCDEF';
+var
+  c: qword;
+  l: longint;
+  s: shortstring;
+  b, b2: byte;
+  ch, ch2: char;
+begin
+  s:='$0fffffffffffffff';
+  for b := low(hexch) to high(hexch) do
+    begin
+      s[2]:=hexch[b];
+      val(s,c,l);
+      if (l<>0) then
+        halt(b+h);
+    end;
+    
+  s:='$fffffffffffffff0';
+  for b := low(hexch) to high(hexch) do
+    begin
+      s[length(s)]:=hexch[b];
+      val(s,c,l);
+      if (l<>0) then
+        halt(b+16+h);
+    end;
+
+  setlength(s,18);
+  s[1]:='$';
+  for b2:= 1 to high(hexch) do
+    begin
+      for b := 2 to length(s)-1 do
+        s[b]:=hexch[b2];
+      for b := low(hexch) to high(hexch) do
+        begin
+          s[length(s)]:=hexch[b];
+          val(s,c,l);
+          if (l=0) then
+            halt(b2+32+h);
+        end;
+    end;
+
+  s:='18446744073709551615';
+  for ch := '0' to '1' do
+    begin
+      s[1]:=ch;
+      val(s,c,l);
+      if (l<>0) then
+        halt(ord(ch)-ord('0')+b+49+h);
+    end;
+    
+  s:='18446744073709551615';
+  for ch := '0' to '5' do
+    begin
+      s[length(s)]:=ch;
+      val(s,c,l);
+      if (l<>0) then
+        halt(ord(ch)-ord('0')+b+54+h);
+    end;
+
+  s:='18446744073709551615';
+  for ch := '6' to '9' do
+    begin
+      s[length(s)]:=ch;
+      val(s,c,l);
+      if (l=0) then
+        halt(ord(ch)-ord('0')+b+54+h);
+    end;
+
+  setlength(s,length('18446744073709551615')+1);
+  for ch2:= '1' to '1' do
+    begin
+      for b := 1 to length(s)-1 do
+        s[b]:=ch2;
+      for ch := '0' to '9' do
+        begin
+          s[length(s)]:=hexch[b];
+          val(s,c,l);
+          if (l=0) then
+            halt(ord(ch2)-ord('1')+61+h);
+        end;
+    end;
+
+end;
+
+begin
+  testcard;
+  testqword;
+end.