Ok, I came across this bug, I'm not sure what I'm doing wrong. 6011111111111117
Ok, here is the Simba version of the code:
Simba Code:
var
number:string;
function IntDigits(int: Int64): TIntegerArray;
var
s: string;
l, i: Integer;
begin
s := Int64ToStr(int);
l := Length(s);
SetLength(Result, l);
for i := 0 to (l - 1) do
Result[i] := StrToInt(s[(i + 1)]);
end;
procedure TIAAppend(var TIA: TIntegerArray; x: Integer);
var
aL: Integer;
begin
aL := (Length(TIA) + 1);
SetLength(TIA, aL);
TIA[(aL - 1)] := Integer(x);
end;
function even_number(Number: integer): boolean;
begin
result := (Number mod 2 = 0);
end;
function add_TIA(arr:TIntegerArray):Integer;
var
i:Integer;
begin
for i := 0 to high(arr) do
result := result + arr[i];
end;
function check_valid_credit(number:Int64):Boolean;
var
card_number, even, odd:TIntegerArray;
i, total:Integer;
begin
card_number := IntDigits(number);
if (length(card_number) <> 16) then
begin
result := false;
exit;
end;
for i := 0 to high(card_number) do
begin
if even_number(i) then
TIAAppend(even, card_number[i]);
if (not even_number(i)) then
TIAAppend(odd, card_number[i]);
end;
total := total + (add_TIA(odd) * 2) + add_TIA(even);
for i := 0 to high(odd) do
begin
if (odd[i] > 4) then
total := total + 1
end;
result := (total mod 10 = 0);
end;
var
t:Integer;
begin
Writeln(check_valid_credit(6011111111111117));
end.
Using the credit card number 6011111111111117, it returns true everytime like it's supposed to.
Now heres the plugin version:
pascal Code:
library TestPlugin;
{$mode objfpc}{$H+}
uses
Classes, sysutils
{ you can add units after this };
//{$R *.res}
type TIntegerArray = array of Integer;
function Internal_Func: String;
begin
Result := 'Internal_Func';
end;
function Test_Func(var T: String): Integer; register;
begin
T := Internal_Func;
Result := 123;
end;
procedure Test_Proc(var T: String); register;
begin
T := 'Test_Proc';
end;
function IntDigits(int: Int64): TIntegerArray;
var
s: string;
l, i: Integer;
begin
s := IntToStr(int);
l := Length(s);
SetLength(result, l);
for i := 0 to (l - 1) do
Result[i] := StrToInt(s[(i + 1)]);
end;
procedure TIAAppend(var TIA: TIntegerArray; x: Integer);
var
aL: Integer;
begin
aL := (Length(TIA) + 1);
SetLength(TIA, aL);
TIA[(aL - 1)] := Integer(x);
end;
function even_number(Number: integer): boolean;
begin
result := (Number mod 2 = 0);
end;
function add_TIA(arr:TIntegerArray):Integer;
var
i:Integer;
begin
for i := 0 to high(arr) do
result := result + arr[i];
end;
function check_valid_credit(number:Int64): Boolean; register;
var
card_number, even, odd:TIntegerArray;
i, total:Integer;
begin
card_number := IntDigits(number);
if (length(card_number) <> 16) then
begin
result := false;
exit;
end;
for i := 0 to high(card_number) do
begin
if even_number(i) then
TIAAppend(even, card_number[i]);
if (not even_number(i)) then
TIAAppend(odd, card_number[i]);
end;
total := total + (add_TIA(odd) * 2) + add_TIA(even);
for i := 0 to high(odd) do
begin
if (odd[i] > 4) then
total := total + 1
end;
result := (total mod 10 = 0);
end;
function GetFunctionCount(): Integer; stdcall; export;
begin
Result := 3;
end;
function GetFunctionCallingConv(x : Integer) : Integer; stdcall; export;
begin
Result := 0;
case x of
0..2 : Result := 1;
end;
end;
function GetFunctionInfo(x: Integer; var ProcAddr: Pointer; var ProcDef: PChar): Integer; stdcall; export;
begin
case x of
0:
begin
ProcAddr := @Test_Func;
StrPCopy(ProcDef, 'function Test_Func(var T: String): Integer;');
end;
1:
begin
ProcAddr := @Test_Proc;
StrPCopy(ProcDef, 'procedure Test_Proc(var T: String);');
end;
2:
begin
ProcAddr := @check_valid_credit;
StrPCopy(ProcDef, 'function check_valid_credit(number:Int64): Boolean;');
end;
else
x := -1;
end;
Result := x;
end;
exports GetFunctionCount;
exports GetFunctionInfo;
exports GetFunctionCallingConv;
begin
end.
And the simba code:
Simba Code:
program SimbaPluginTest;
{$LoadLib TestPlugin}
var
t: boolean;
begin
Writeln(check_valid_credit(6011111111111117));
end.
This returns false about 80% of the time, and true 20% of the time.
Why is the results different?