1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184
|
{ %version=1.1 }
{ %NOTE=This test requires a C library }
{$mode objfpc}
uses
strings, ctypes;
{$ifdef FPC_HAS_TYPE_EXTENDED}
{$define TEST_EXTENDED}
{$endif FPC_HAS_TYPE_EXTENDED}
{$ifdef beos}
{it seems that BeOS doesn't support extended...}
{$undef TEST_EXTENDED}
{$endif beos}
{$ifdef WINDOWS}
const
{$ifdef wince}
CrtLib = 'coredll.dll';
{$else}
{ the msvcrt.dll doesn't support extended because MS-C doesn't }
{$undef TEST_EXTENDED}
CrtLib = 'msvcrt.dll';
{$endif}
procedure printf(const formatstr : pchar); varargs; cdecl; external CrtLib name 'printf';
procedure sprintf(p : pchar;const formatstr : pchar); varargs; cdecl; external CrtLib name 'sprintf';
const
int64prefix='I64';
{$else}
{$linklib c}
procedure printf(const formatstr : pchar); varargs; cdecl; external;
procedure sprintf(p : pchar;const formatstr : pchar); varargs; cdecl; external;
const
int64prefix='ll';
{$endif}
const
{$ifdef macos}
lineending = #13;
{$else}
lineending = #10;
{$endif}
type
THandle = longint;
const
l : longint = 45;
ll : int64 = 345;
s : pchar = 'Enclosed text';
s2 : pchar = 'next';
si : single = 32.12;
d : double = 45.45;
e : cextended = 74.74;
p : pchar = nil;
has_errors : boolean = false;
begin
getmem(p,500);
Writeln('Testing C printf function called from FPC code');
{ for some CPUs, this requires also different calling conventions
than procedures taking a single pchar parameter, see #7504 (FK) }
printf('Simple test without arg'+lineending);
Writeln('Testing with single pchar argument');
printf('Text containing "%s" text'+lineending,s);
sprintf(p,'Text containing "%s" text'+lineending,s);
if strpos(p,'g "Enclosed text" ')=nil then
begin
writeln('The output of sprintf for pchar is wrong: ',p);
has_errors:=true;
end;
Writeln('Testing with single longint argument');
printf('Text containing longint: %d'+lineending,l);
sprintf(p,'Text containing longint: %d'+lineending,l);
if strpos(p,'longint: 45')=nil then
begin
writeln('The output of sprintf for longint is wrong: ',p);
has_errors:=true;
end;
Writeln('Testing with single int64 argument');
printf('Text containing int64: %'+int64prefix+'d'+lineending,ll);
sprintf(p,'Text containing int64: %'+int64prefix+'d'+lineending,ll);
if strpos(p,'int64: 345')=nil then
begin
writeln('The output of sprintf for int64 is wrong: ',p);
has_errors:=true;
end;
Writeln('Testing with single single argument');
printf('Text containing single: %f'+lineending,si);
sprintf(p,'Text containing single: %f'+lineending,si);
if strpos(p,'single: 32.1')=nil then
begin
writeln('The output of sprintf for double is wrong: ',p);
has_errors:=true;
end;
Writeln('Testing with single double argument');
printf('Text containing double: %lf'+lineending,d);
sprintf(p,'Text containing double: %lf'+lineending,d);
if strpos(p,'double: 45.4')=nil then
begin
writeln('The output of sprintf for double is wrong: ',p);
has_errors:=true;
end;
{$ifdef TEST_EXTENDED}
printf('Text containing long double: %Lf'+lineending,e);
sprintf(p,'Text containing long double: %Lf'+lineending,e);
if strpos(p,'long double: 74.7')=nil then
begin
writeln('The output of sprintf for long double is wrong:',p);
has_errors:=true;
end;
{$endif TEST_EXTENDED}
Writeln('Testing with combined pchar argument');
printf('Text containing "%s" and "%s" text'+lineending,s,s2);
sprintf(p,'Text containing "%s" and "%s" text'+lineending,s,s2);
if strpos(p,'g "Enclosed text" and "next"')=nil then
begin
writeln('The output of sprintf for two pchars is wrong: ',p);
has_errors:=true;
end;
Writeln('Testing with single longint argument and pchar');
printf('Text containing longint: %d"%s"'+lineending,l,s2);
sprintf(p,'Text containing longint: %d"%s"'+lineending,l,s2);
if strpos(p,'longint: 45"next"')=nil then
begin
writeln('The output of sprintf for longint is wrong: ',p);
has_errors:=true;
end;
Writeln('Testing with single int64 argument and pchar');
printf('Text containing int64: %'+int64prefix+'d"%s"'+lineending,ll,s2);
sprintf(p,'Text containing int64: %'+int64prefix+'d"%s"'+lineending,ll,s2);
if strpos(p,'int64: 345"next"')=nil then
begin
writeln('The output of sprintf for int64 is wrong: ',p);
has_errors:=true;
end;
Writeln('Testing with single single argument');
printf('Text containing single: %f"%s"'+lineending,si,s2);
sprintf(p,'Text containing single: %f"%s"'+lineending,si,s2);
if (strpos(p,'single: 32.1')=nil) or
(strpos(p,'"next"')=nil) then
begin
writeln('The output of sprintf for double is wrong: ',p);
has_errors:=true;
end;
Writeln('Testing with single double argument');
printf('Text containing double: %lf"%s"'+lineending,d,s2);
sprintf(p,'Text containing double: %lf"%s"'+lineending,d,s2);
if (strpos(p,'double: 45.4')=nil) or
(strpos(p,'"next"')=nil) then
begin
writeln('The output of sprintf for double is wrong: ',p);
has_errors:=true;
end;
{$ifdef TEST_EXTENDED}
printf('Text containing long double: %Lf"%s"'+lineending,e,s2);
sprintf(p,'Text containing long double: %Lf"%s"'+lineending,e,s2);
if (strpos(p,'long double: 74.7')=nil) or
(strpos(p,'"next"')=nil) then
begin
writeln('The output of sprintf for long double is wrong:',p);
has_errors:=true;
end;
{$endif TEST_EXTENDED}
if has_errors then
halt(1);
end.
|