2
0

tstring4.pp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509
  1. Program ansitest;
  2. {$ifdef cpu68k}
  3. {$define COMP_IS_INT64}
  4. {$endif cpu68k}
  5. {$ifdef cpupowerpc}
  6. {$define COMP_IS_INT64}
  7. {$endif cpupowerpc}
  8. {$ifdef FPC_COMP_IS_INT64}
  9. {$define COMP_IS_INT64}
  10. {$endif FPC_COMP_IS_INT64}
  11. {$ifdef ver1_0}
  12. type
  13. ptrint=longint;
  14. sizeint=longint;
  15. {$endif}
  16. {$ifndef fpc}
  17. type
  18. ptrint=longint;
  19. sizeint=longint;
  20. Function Memavail : ptrint;
  21. begin
  22. Result:=0;
  23. end;
  24. {$endif}
  25. { -------------------------------------------------------------------
  26. General stuff
  27. ------------------------------------------------------------------- }
  28. Procedure DoMem (Var StartMem : sizeint);
  29. begin
  30. Writeln ('Lost ',StartMem-Memavail,' Bytes.');
  31. StartMem:=MemAvail;
  32. end;
  33. Procedure DoRef (P : Pointer);
  34. Type Psizeint = ^sizeint;
  35. begin
  36. If P=Nil then
  37. Writeln ('(Ref : Empty string)')
  38. else
  39. {$ifdef fpc}
  40. Writeln (' (Ref: ',Psizeint(sizeint(P)-sizeof(sizeint))^,',Len: ',Psizeint(sizeint(P)-sizeof(sizeint)*2)^,')');
  41. {$else}
  42. Writeln (' (Ref: ',Psizeint(sizeint(P)-8)^,',Len: ',Psizeint(sizeint(P)-4)^,')');
  43. {$endif}
  44. end;
  45. { -------------------------------------------------------------------
  46. Initialize/Finalize test
  47. ------------------------------------------------------------------- }
  48. Procedure TestInitFinal;
  49. Type ARec = record
  50. FirstName, LastName : AnsiString;
  51. end;
  52. AnArray = Array [1..10] of AnsiString;
  53. Var
  54. S : AnsiString;
  55. AR : Arec;
  56. AAR : AnArray;
  57. I : sizeint;
  58. Begin
  59. S:='This is an ansistring!';
  60. If Pointer(AR.FirstNAme)<>Nil then
  61. Writeln ('AR.FirstName not OK');
  62. If Pointer(AR.LastName)<>Nil then
  63. Writeln ('AR.LastName not OK');
  64. for I:=1 to 10 do
  65. If Pointer(AAR[I])<>Nil then
  66. Writeln ('Array (',I,') NOT ok');
  67. AR.FirstName:='Napoleon';
  68. AR.LastName:='Bonaparte';
  69. For I:=1 to 10 do
  70. AAR[I]:='Yet another AnsiString';
  71. Writeln ('S : ',S);
  72. Writeln (AR.FirstName, ' ', AR.LastName);
  73. For I:=1 to 10 do
  74. Writeln (I:2,' : ',AAR[i]);
  75. end;
  76. { -------------------------------------------------------------------
  77. Parameter passing test
  78. ------------------------------------------------------------------- }
  79. Procedure TestVarParam (Var Sv : AnsiString);
  80. Var LS : AnsiString;
  81. begin
  82. Write ('TestVarParam : Got S="',Sv,'"');
  83. DoRef(Pointer(Sv));
  84. Sv:='This is a var parameter ansistring';
  85. Write ('S Changed to : ',Sv);
  86. DoRef (Pointer(Sv));
  87. Ls:=Sv;
  88. Write ('Assigned to local var: "',ls,'"');
  89. DoRef (Pointer(Sv));
  90. end;
  91. Procedure TestValParam (S : AnsiString);
  92. Var LS : AnsiString;
  93. begin
  94. Write ('TestValParam : Got S="',S,'"');
  95. S:='This is a value parameter ansistring';
  96. Write ('S Changed to : ',S);
  97. DoRef(Pointer(S));
  98. Ls:=S;
  99. Write ('Assigned to local var: "',ls,'"');
  100. DoRef(Pointer(S));
  101. end;
  102. Procedure TestConstParam (Const Sc : AnsiString);
  103. Var LS : AnsiString;
  104. begin
  105. Write ('TestConstParam : Got S="',Sc,'"');
  106. DoRef(Pointer(Sc));
  107. Ls:=Sc;
  108. Write ('Assigned to local var: "',ls,'"');
  109. DoRef(Pointer(Sc));
  110. end;
  111. Procedure TestParams;
  112. Var S : AnsiString;
  113. Mem : sizeint;
  114. begin
  115. Mem:=MemAvail;
  116. S :='This is another ansistring';
  117. Writeln ('Calling testvalparam with "',s,'"');
  118. testvalparam (s);
  119. DoMem(Mem);
  120. Writeln ('Calling testConstparam with "',s,'"');
  121. testconstparam (s);
  122. DoMem(Mem);
  123. Writeln ('Calling testvarparam with "',s,'"');
  124. testvarparam (s);
  125. Writeln ('TestVarParam returned with "',S,'"');
  126. DoMem(Mem);
  127. end;
  128. { -------------------------------------------------------------------
  129. Comparision operators test
  130. ------------------------------------------------------------------- }
  131. Procedure TestCompare;
  132. Const S1 : AnsiString = 'Teststring 1';
  133. S2 : AnsiString = 'Teststring 1';
  134. S3 : AnsiString = 'Teststring 2';
  135. S4 : AnsiString = '';
  136. PC : Pchar = 'Teststring 1';
  137. Var S,T : AnsiString;
  138. ss : Shortstring;
  139. begin
  140. If S1=S2 then writeln ('S1 and S2 are the same');
  141. If S4='' then Writeln ('S4 is empty. OK');
  142. If Not(S4='Non-empty') then writeln ('S4 is not non-empty');
  143. if S3='Teststring 2' then writeln('S3 equals "Teststring 2". OK.');
  144. Write ('S3<>S2 : ');
  145. If S2<>S3 Then writeln ('OK') else writeln ('NOT OK');
  146. Write ('S3>S2 : ');
  147. If (S3>S2) Then Writeln ('OK') else writeln ('NOT OK');
  148. Write ('S1<S3 : ');
  149. if (S1<S3) Then writeln ('OK') else writeln ('NOT OK');
  150. S:=S2;
  151. T:=S;
  152. Write ('Assigned S to T. ');Doref(Pointer(T));
  153. If S=T then Writeln ('S=T, OK');
  154. SS:='Teststring 1';
  155. If SS=S then
  156. Writeln ('Shortstring and AnsiString are the same. OK')
  157. else
  158. Writeln ('Shortstring and AnsiString NOT equal. PROBLEM !');
  159. If S=PC then
  160. Writeln ('Pchar and AnsiString are the same. OK')
  161. else
  162. Writeln ('Pchar and AnsiString NOT equal. PROBLEM !');
  163. end;
  164. { -------------------------------------------------------------------
  165. Type conversion test
  166. ------------------------------------------------------------------- }
  167. Procedure DoPchar (P : Pchar);
  168. begin
  169. Writeln ('DoPchar : Got : "',P,'"');
  170. end;
  171. Procedure TestConversion;
  172. Var Pstr : Pchar;
  173. Sstr : String[40];
  174. Astr : AnsiString;
  175. Const PC : Pchar = 'A PCHAR constant string';
  176. begin
  177. Writeln ('Astr empty : "',Astr,'"');
  178. Pstr:=PChar(Astr);
  179. Writeln ('AnsiString Assigned to Pchar : "',Pstr,'"');
  180. DoPchar(Pchar(Astr));
  181. Astr:='An Ansistring';
  182. Writeln ('Astr: "',Astr,'"');
  183. Pstr:=PChar(Astr);
  184. Writeln ('AnsiString Assigned to Pchar : "',Pstr,'"');
  185. DoPchar(Pchar(Astr));
  186. SStr:='A ShortString';
  187. Writeln ('Shortstring : "',Sstr,'"');
  188. Astr:=Sstr;
  189. Write ('ShortString assigned to AnsiString : "',Astr,'"');
  190. DoRef(Pointer(Astr));
  191. Astr:=PC;
  192. Write ('PChar assigned to AnsiString : "',Astr,'"');
  193. DoRef(Pointer(Astr));
  194. end;
  195. { -------------------------------------------------------------------
  196. Adding of strings test.
  197. ------------------------------------------------------------------- }
  198. Procedure TestAdd;
  199. Const S1 : AnsiString = 'This is ansistring 1 ';
  200. S2 : AnsiString = 'This is ansistring 2 ';
  201. S3 : Ansistring = 'This is ansistring 3';
  202. Var S : AnsiString;
  203. S4 : String;
  204. begin
  205. S:=S1+S2;
  206. //!! Reference count is 2, should be 1...
  207. Write ('Adding S1+S2 : ',S,' '); DoRef(Pointer(S));
  208. S:=S1+S2+S3;
  209. Write ('Adding S1+S2+S3 : ',S,' '); DoRef(Pointer(S));
  210. S:=S+'...Added tail';
  211. Write ('Added tail to S ! : ',S);DoRef(Pointer(S));
  212. S4:=' This is a shortstring';
  213. //!! This crashes the program...
  214. S:=S1+S4;
  215. Write ('Adding S1+S4 : ',S,' '); DoRef(Pointer(S));
  216. S:=S1+'@';
  217. Write ('Adding S1+''@'' : ',S,' '); DoRef(Pointer(S));
  218. end;
  219. { -------------------------------------------------------------------
  220. SetLength test.
  221. ------------------------------------------------------------------- }
  222. Procedure TestSetlength;
  223. Const S1 : AnsiString = 'This is ansistring 1';
  224. S2 : AnsiString = 'This is ansistring 2 and it is longer';
  225. Var S : AnsiString;
  226. begin
  227. Setlength(S,length(S1));
  228. Write ('Set length of s to ',length(s1));Doref(pointer(s));
  229. Move (Pointer(S1)^,Pointer(S)^,Length(S1)+1);
  230. Write ('S = "',S,'" '); DoRef(Pointer(S));
  231. Setlength(S,length(S2));
  232. Write ('Set length of s to ',length(s2));Doref(pointer(s));
  233. Move (Pointer(S2)^,Pointer(S)^,Length(S2)+1);
  234. Write ('S = "',S,'" '); DoRef(Pointer(S));
  235. SetLength(S,10);
  236. Write ('Set length of s to 10 ');Doref(pointer(s));
  237. Write ('S = "',S,'" '); DoRef(Pointer(S));
  238. SetLength(S,0);
  239. Write ('Set length of S to 0 ');Doref(Pointer(S));
  240. Write ('S = "',S,'" ');Doref(Pointer(s));
  241. end;
  242. { -------------------------------------------------------------------
  243. Index test.
  244. ------------------------------------------------------------------- }
  245. Procedure testIndex;
  246. Var S,T : AnsiString;
  247. I,Len : sizeint;
  248. begin
  249. S:='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  250. Write ('S = "',S,'" ');doref(pointer(S));
  251. Write ('S = "');
  252. Len:=Length(S);
  253. For I:=1 to Len do Write(S[i]);
  254. write ('" ');Doref(pointer(S));
  255. Write ('Inverting S, ');
  256. For I:=1 to Len do
  257. S[i]:='A';
  258. // Asc(Ord('Z')+1-i);
  259. Write ('S = "',S,'" ');doref(pointer(S));
  260. T:=S;
  261. Write ('Assigned S to T '); Doref(Pointer(S));
  262. Write ('Again inverting S. ');
  263. For I:=1 to Len do
  264. S[i]:='B';
  265. Write ('S = "',S,'" ');doref(pointer(S));
  266. Write ('T = "',T,'" ');doref(pointer(T));
  267. end;
  268. { -------------------------------------------------------------------
  269. Adding in expressions test.
  270. ------------------------------------------------------------------- }
  271. Procedure TestAddExpr;
  272. Const S1 : AnsiString = 'ABC';
  273. S2 : AnsiString = 'DEF';
  274. OK = 'OK';
  275. NOK = 'NOK';
  276. Var I : Integer;
  277. S3 : AnsiString;
  278. mem : sizeint;
  279. begin
  280. mem:=memavail;
  281. S3 := 'ABCDEF';
  282. Write ('S1+S2=S3 :');
  283. If S1+S2=S3 then writeln (ok) else writeln (nok);
  284. Write ('S1+S2=ABCDEF');
  285. If S1+S2='ABCDEF' then writeln (ok) else writeln (nok);
  286. Write ('Testing repeat');
  287. I:=0;
  288. S3:='';
  289. Repeat
  290. Inc(i);
  291. If I=10 then s3:='ABCDEF';
  292. until S1+S2=S3;
  293. Writeln (' Done.');
  294. I:=2;
  295. S3:='';
  296. Write ('Testing While');
  297. While S1+S2<>S3 do
  298. begin
  299. INc(i);
  300. If I=10 then s3:='ABCDEF';
  301. end;
  302. Writeln (' Done');
  303. end;
  304. Procedure TestStdFunc;
  305. Var S,T : AnsiString;
  306. SS : ShortString;
  307. C : Char;
  308. Ca : Cardinal;
  309. L : sizeint;
  310. I : Integer;
  311. W : Word;
  312. B : Byte;
  313. R : Real;
  314. D : Double;
  315. E : Extended;
  316. Si : Single;
  317. Co : Comp;
  318. TempMem:sizeint;
  319. begin
  320. TempMem:=Memavail;
  321. S:='ABCDEF';
  322. Write ('S = "',S,'"');Doref(Pointer(S));
  323. T:=Copy(S,1,3);
  324. Write ('T : "',T,'"');DoRef(Pointer(T));
  325. T:=Copy(S,3,3);
  326. Write ('T : "',T,'"');DoRef(Pointer(T));
  327. T:=Copy(S,3,6);
  328. Write ('T : "',T,'"');DoRef(Pointer(T));
  329. Writeln ('Inserting "123" in S at pos 4');
  330. Insert ('123',S,4);
  331. Write ('S = "',S,'"');DoRef(Pointer(S));
  332. Writeln ('Deleting 3 characters From S starting Pos 4');
  333. Delete (S,4,3);
  334. Write ('S = "',S,'"');Doref(Pointer(S));
  335. Writeln ('Pos ''DE'' in S is : ',Pos('DE',S));
  336. Write ('S = "',S,'"');Doref(Pointer(S));
  337. Writeln ('Setting T to ''DE''.');
  338. T:='DE';
  339. //!! Here something weird is happening ? S is lost ???
  340. Writeln('***');
  341. Writeln ('Pos T in S is : ',Pos(T,S));
  342. Write ('S = "',S,'"');Doref(Pointer(S));
  343. Writeln ('Setting T to ''D''.');
  344. T:='D';
  345. Writeln ('Pos T in S is : ',Pos(T,S));
  346. Write ('S = "',S,'"');Doref(Pointer(S));
  347. Writeln ('Setting T to ''DA''.');
  348. T:='DA';
  349. Writeln ('Pos T in S is : ',Pos(T,S));
  350. Write ('S = "',S,'"');Doref(Pointer(S));
  351. Writeln ('SS:=''DE''');
  352. Writeln('***');
  353. SS:='DE';
  354. Writeln ('Pos SS in S is : ',Pos(SS,S));
  355. Write ('S = "',S,'"');Doref(Pointer(S));
  356. Writeln ('C:=''D''');
  357. C:='D';
  358. Writeln ('Pos C in S is : ',Pos(C,S));
  359. Write ('S = "',S,'"');Doref(Pointer(S));
  360. Writeln ('Pos ''D'' in S is : ',Pos('D',S));
  361. Write ('S = "',S,'"');Doref(Pointer(S));
  362. Write ('str(Ca,S)= ');
  363. ca:=1;
  364. str(Ca,S);
  365. Writeln (S);
  366. Write ('str(L,S)= ');
  367. L:=2;
  368. str(L,S);
  369. Writeln (S);
  370. Write ('str(I,S)= ');
  371. I:=3;
  372. str(I,S);
  373. Writeln (S);
  374. Write ('str(W,S)= ');
  375. W:=4;
  376. str(W,S);
  377. Writeln (S);
  378. Write ('str(R,S)= ');
  379. R:=1.0;
  380. str(R,S);
  381. Writeln (S);
  382. Write ('str(D,S)= ');
  383. D:=2.0;
  384. str(D,S);
  385. Writeln (S);
  386. Write ('str(E,S)= ');
  387. E:=3.0;
  388. str(E,S);
  389. Writeln (S);
  390. Write ('str(Co,S)= ');
  391. {$ifdef COMP_IS_INT64}
  392. Co:=4;
  393. {$else}
  394. Co:=4.0;
  395. {$endif}
  396. str(Co,S);
  397. Writeln (S);
  398. Write ('str(Si,S)= ');
  399. Si:=5.0;
  400. str(Si,S);
  401. Writeln (S);
  402. end;
  403. Var GlobalStartMem,StartMem : PtrInt;
  404. begin
  405. GlobalStartMem:=MemAvail;
  406. StartMem:=MemAvail;
  407. Writeln ('Testing Initialize/Finalize.');
  408. TestInitFinal;
  409. Write ('End of Initialize/finalize test : ');DoMem(StartMem);
  410. Writeln;Writeln ('Testing parameter passing.');
  411. TestParams;
  412. Write ('End of Parameter passing test : ');DoMem(StartMem);
  413. Writeln;Writeln ('Testing comparision operators');
  414. TestCompare;
  415. Write ('End of compare test : ');DoMem(StartMem);
  416. Writeln;Writeln ('Testing setlength of AnsiStrings');
  417. TestSetLength;
  418. Write ('End of setlength test : ');DoMem(StartMem);
  419. Writeln;Writeln ('Testing Adding of AnsiStrings');
  420. TestAdd;
  421. Write ('End of adding test : ');DoMem(StartMem);
  422. Writeln;Writeln ('Testing Adding of AnsiStrings in expressions');
  423. TestAddExpr;
  424. Write ('End of adding in expressions test : ');DoMem(StartMem);
  425. Writeln;Writeln ('Testing type conversion.');
  426. TestConversion;
  427. Write ('End of typeconversion test : ');DoMem(StartMem);
  428. Writeln;Writeln ('Testing indexed access.');
  429. TestIndex;
  430. Write ('End of index access test : ');DoMem(StartMem);
  431. Writeln;Writeln ('Testing standard functions.');
  432. TestStdfunc;
  433. Write ('End of standard functions: ');DoMem(StartMem);
  434. Write ('For the whole program ');DoMem(GlobalStartMem);
  435. end.