tstring4.pp 12 KB

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