2
{ %NOTE=This test requires a C library }
9
{$ifdef FPC_HAS_TYPE_EXTENDED}
10
{$define TEST_EXTENDED}
11
{$endif FPC_HAS_TYPE_EXTENDED}
16
CrtLib = 'coredll.dll';
18
{ the msvcrt.dll doesn't support extended because MS-C doesn't }
19
{$undef TEST_EXTENDED}
20
CrtLib = 'msvcrt.dll';
23
procedure printf(const formatstr : pchar); varargs; cdecl; external CrtLib name 'printf';
24
procedure sprintf(p : pchar;const formatstr : pchar); varargs; cdecl; external CrtLib name 'sprintf';
29
procedure printf(const formatstr : pchar); varargs; cdecl; external;
30
procedure sprintf(p : pchar;const formatstr : pchar); varargs; cdecl; external;
48
s : pchar = 'Enclosed text';
54
has_errors : boolean = false;
59
Writeln('Testing C printf function called from FPC code');
60
{ for some CPUs, this requires also different calling conventions
61
than procedures taking a single pchar parameter, see #7504 (FK) }
62
printf('Simple test without arg'+lineending);
64
Writeln('Testing with single pchar argument');
65
printf('Text containing "%s" text'+lineending,s);
66
sprintf(p,'Text containing "%s" text'+lineending,s);
67
if strpos(p,'g "Enclosed text" ')=nil then
69
writeln('The output of sprintf for pchar is wrong: ',p);
73
Writeln('Testing with single longint argument');
74
printf('Text containing longint: %d'+lineending,l);
75
sprintf(p,'Text containing longint: %d'+lineending,l);
76
if strpos(p,'longint: 45')=nil then
78
writeln('The output of sprintf for longint is wrong: ',p);
82
Writeln('Testing with single int64 argument');
83
printf('Text containing int64: %'+int64prefix+'d'+lineending,ll);
84
sprintf(p,'Text containing int64: %'+int64prefix+'d'+lineending,ll);
85
if strpos(p,'int64: 345')=nil then
87
writeln('The output of sprintf for int64 is wrong: ',p);
91
Writeln('Testing with single single argument');
92
printf('Text containing single: %f'+lineending,si);
93
sprintf(p,'Text containing single: %f'+lineending,si);
94
if strpos(p,'single: 32.1')=nil then
96
writeln('The output of sprintf for double is wrong: ',p);
100
Writeln('Testing with single double argument');
101
printf('Text containing double: %lf'+lineending,d);
102
sprintf(p,'Text containing double: %lf'+lineending,d);
103
if strpos(p,'double: 45.4')=nil then
105
writeln('The output of sprintf for double is wrong: ',p);
109
{$ifdef TEST_EXTENDED}
110
printf('Text containing long double: %Lf'+lineending,e);
111
sprintf(p,'Text containing long double: %Lf'+lineending,e);
112
if strpos(p,'long double: 74.7')=nil then
114
writeln('The output of sprintf for long double is wrong:',p);
117
{$endif TEST_EXTENDED}
119
Writeln('Testing with combined pchar argument');
120
printf('Text containing "%s" and "%s" text'+lineending,s,s2);
121
sprintf(p,'Text containing "%s" and "%s" text'+lineending,s,s2);
122
if strpos(p,'g "Enclosed text" and "next"')=nil then
124
writeln('The output of sprintf for two pchars is wrong: ',p);
128
Writeln('Testing with single longint argument and pchar');
129
printf('Text containing longint: %d"%s"'+lineending,l,s2);
130
sprintf(p,'Text containing longint: %d"%s"'+lineending,l,s2);
131
if strpos(p,'longint: 45"next"')=nil then
133
writeln('The output of sprintf for longint is wrong: ',p);
137
Writeln('Testing with single int64 argument and pchar');
138
printf('Text containing int64: %'+int64prefix+'d"%s"'+lineending,ll,s2);
139
sprintf(p,'Text containing int64: %'+int64prefix+'d"%s"'+lineending,ll,s2);
140
if strpos(p,'int64: 345"next"')=nil then
142
writeln('The output of sprintf for int64 is wrong: ',p);
146
Writeln('Testing with single single argument');
147
printf('Text containing single: %f"%s"'+lineending,si,s2);
148
sprintf(p,'Text containing single: %f"%s"'+lineending,si,s2);
149
if (strpos(p,'single: 32.1')=nil) or
150
(strpos(p,'"next"')=nil) then
152
writeln('The output of sprintf for double is wrong: ',p);
156
Writeln('Testing with single double argument');
157
printf('Text containing double: %lf"%s"'+lineending,d,s2);
158
sprintf(p,'Text containing double: %lf"%s"'+lineending,d,s2);
159
if (strpos(p,'double: 45.4')=nil) or
160
(strpos(p,'"next"')=nil) then
162
writeln('The output of sprintf for double is wrong: ',p);
166
{$ifdef TEST_EXTENDED}
167
printf('Text containing long double: %Lf"%s"'+lineending,e,s2);
168
sprintf(p,'Text containing long double: %Lf"%s"'+lineending,e,s2);
169
if (strpos(p,'long double: 74.7')=nil) or
170
(strpos(p,'"next"')=nil) then
172
writeln('The output of sprintf for long double is wrong:',p);
175
{$endif TEST_EXTENDED}