tprintf.pp 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. { %NOTE=This test requires a C library }
  2. {$mode objfpc}
  3. {$ifdef win32}
  4. {$linklib msvcrt}
  5. {$else}
  6. {$linklib c}
  7. {$endif}
  8. uses
  9. strings;
  10. type
  11. THandle = longint;
  12. const
  13. l : longint = 45;
  14. ll : int64 = 345;
  15. s : pchar = 'Enclosed text';
  16. s2 : pchar = 'next';
  17. si : single = 32.12;
  18. d : double = 45.45;
  19. e : extended = 74.74;
  20. p : pchar = nil;
  21. has_errors : boolean = false;
  22. procedure printf(const formatstr : pchar; const args : array of const);cdecl; external;
  23. procedure sprintf(p : pchar;const formatstr : pchar; const args : array of const);cdecl; external;
  24. begin
  25. getmem(p,500);
  26. Writeln('Testing C printf function called from FPC code');
  27. // printf('Simple test without arg'#10,[]);
  28. Writeln('Testing with single pchar argument');
  29. printf('Text containing "%s" text'#10,[s]);
  30. sprintf(p,'Text containing "%s" text'#10,[s]);
  31. if strpos(p,'g "Enclosed text" ')=nil then
  32. begin
  33. writeln('The output of sprintf for pchar is wrong: ',p);
  34. has_errors:=true;
  35. end;
  36. Writeln('Testing with single longint argument');
  37. printf('Text containing longint: %d'#10,[l]);
  38. sprintf(p,'Text containing longint: %d'#10,[l]);
  39. if strpos(p,'longint: 45')=nil then
  40. begin
  41. writeln('The output of sprintf for longint is wrong: ',p);
  42. has_errors:=true;
  43. end;
  44. Writeln('Testing with single int64 argument');
  45. printf('Text containing int64: %lld'#10,[ll]);
  46. sprintf(p,'Text containing int64: %lld'#10,[ll]);
  47. if strpos(p,'int64: 345')=nil then
  48. begin
  49. writeln('The output of sprintf for int64 is wrong: ',p);
  50. has_errors:=true;
  51. end;
  52. Writeln('Testing with single single argument');
  53. printf('Text containing single: %f'#10,[si]);
  54. sprintf(p,'Text containing single: %f'#10,[si]);
  55. if strpos(p,'single: 32.1')=nil then
  56. begin
  57. writeln('The output of sprintf for double is wrong: ',p);
  58. has_errors:=true;
  59. end;
  60. Writeln('Testing with single double argument');
  61. printf('Text containing double: %f'#10,[d]);
  62. sprintf(p,'Text containing double: %f'#10,[d]);
  63. if strpos(p,'double: 45.4')=nil then
  64. begin
  65. writeln('The output of sprintf for double is wrong: ',p);
  66. has_errors:=true;
  67. end;
  68. printf('Text containing long double: %f'#10,[e]);
  69. sprintf(p,'Text containing long double: %f'#10,[e]);
  70. if strpos(p,'long double: 74.7')=nil then
  71. begin
  72. writeln('The output of sprintf for long double is wrong:',p);
  73. has_errors:=true;
  74. end;
  75. Writeln('Testing with combined pchar argument');
  76. printf('Text containing "%s" and "%s" text'#10,[s,s2]);
  77. sprintf(p,'Text containing "%s" and "%s" text'#10,[s,s2]);
  78. if strpos(p,'g "Enclosed text" and "next"')=nil then
  79. begin
  80. writeln('The output of sprintf for two pchars is wrong: ',p);
  81. has_errors:=true;
  82. end;
  83. Writeln('Testing with single longint argument and pchar');
  84. printf('Text containing longint: %d"%s"'#10,[l,s2]);
  85. sprintf(p,'Text containing longint: %d"%s"'#10,[l,s2]);
  86. if strpos(p,'longint: 45"next"')=nil then
  87. begin
  88. writeln('The output of sprintf for longint is wrong: ',p);
  89. has_errors:=true;
  90. end;
  91. Writeln('Testing with single int64 argument and pchar');
  92. printf('Text containing int64: %lld"%s"'#10,[ll,s2]);
  93. sprintf(p,'Text containing int64: %lld"%s"'#10,[ll,s2]);
  94. if strpos(p,'int64: 345"next"')=nil then
  95. begin
  96. writeln('The output of sprintf for int64 is wrong: ',p);
  97. has_errors:=true;
  98. end;
  99. Writeln('Testing with single single argument');
  100. printf('Text containing single: %f"%s"'#10,[si,s2]);
  101. sprintf(p,'Text containing single: %f"%s"'#10,[si,s2]);
  102. if (strpos(p,'single: 32.1')=nil) or
  103. (strpos(p,'"next"')=nil) then
  104. begin
  105. writeln('The output of sprintf for double is wrong: ',p);
  106. has_errors:=true;
  107. end;
  108. Writeln('Testing with single double argument');
  109. printf('Text containing double: %f"%s"'#10,[d,s2]);
  110. sprintf(p,'Text containing double: %f"%s"'#10,[d,s2]);
  111. if (strpos(p,'double: 45.4')=nil) or
  112. (strpos(p,'"next"')=nil) then
  113. begin
  114. writeln('The output of sprintf for double is wrong: ',p);
  115. has_errors:=true;
  116. end;
  117. printf('Text containing long double: %f"%s"'#10,[e,s2]);
  118. sprintf(p,'Text containing long double: %f"%s"'#10,[e,s2]);
  119. if (strpos(p,'long double: 74.7')=nil) or
  120. (strpos(p,'"next"')=nil) then
  121. begin
  122. writeln('The output of sprintf for long double is wrong:',p);
  123. has_errors:=true;
  124. end;
  125. if has_errors then
  126. halt(1);
  127. end.