tstring4.pp 12 KB

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