tstring6.pp 12 KB

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