astrings.pp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770
  1. {
  2. $Id$
  3. This file is part of the Free Pascal run time library.
  4. Copyright (c) 1993,97 by Michael Van Canneyt,
  5. member of the Free Pascal development team.
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. { ---------------------------------------------------------------------
  13. This file implements AnsiStrings for FPC
  14. ---------------------------------------------------------------------}
  15. {
  16. This file contains the implementation of the LongString type,
  17. and all things that are needed for it.
  18. AnsiSTring is defined as a 'silent' pchar :
  19. a pchar that points to :
  20. @-12 : Longint for maximum size;
  21. @-8 : Longint for size;
  22. @-4 : Longint for reference count;
  23. @ : String + Terminating #0;
  24. Pchar(Ansistring) is a valid typecast.
  25. So AS[i] is converted to the address @AS+i-1.
  26. Constants should be assigned a reference count of -1
  27. Meaning that they can't be disposed of.
  28. }
  29. // Type shortstring=string;
  30. Function NewAnsiString (Len : Longint) : Pointer; forward;
  31. Procedure DisposeAnsiString (Var S : Pointer); forward;
  32. Procedure Decr_Ansi_Ref (Var S : Pointer); forward;
  33. Procedure Incr_Ansi_Ref (Var S : Pointer); forward;
  34. Procedure AssignAnsiString (Var S1 : Pointer; S2 : Pointer); forward;
  35. Procedure Ansi_String_Concat (Var S1 : Pointer; Var S2 : Pointer); forward;
  36. Procedure Ansi_ShortString_Concat (Var S1: AnsiString; Var S2 : ShortString); forward;
  37. Procedure Ansi_To_ShortString (Var S1 : ShortString; S2 : Pointer; maxlen : longint); forward;
  38. Procedure Short_To_AnsiString (Var S1 : Pointer; Const S2 : ShortString); forward;
  39. Function AnsiCompare (Var S1,S2 : Pointer): Longint; forward;
  40. Function AnsiCompare (var S1 : Pointer; Var S2 : ShortString): Longint; forward;
  41. Procedure SetCharAtIndex (Var S : AnsiString; Index : Longint; C : CHar); forward;
  42. {$PACKRECORDS 1}
  43. Type TAnsiRec = Record
  44. Maxlen, len, ref : Longint;
  45. First : Char;
  46. end;
  47. PAnsiRec = ^TAnsiRec;
  48. Const AnsiRecLen = SizeOf(TAnsiRec);
  49. FirstOff = SizeOf(TAnsiRec)-1;
  50. { ---------------------------------------------------------------------
  51. Internal functions, not in interface.
  52. ---------------------------------------------------------------------}
  53. Procedure DumpAnsiRec(S : Pointer);
  54. begin
  55. If S=Nil then
  56. Writeln ('String is nil')
  57. Else
  58. Begin
  59. With PAnsiRec(S-Firstoff)^ do
  60. begin
  61. Writeln ('Maxlen : ',maxlen);
  62. Writeln ('Len : ',len);
  63. Writeln ('Ref : ',ref);
  64. end;
  65. end;
  66. end;
  67. Function NewAnsiString(Len : Longint) : Pointer;
  68. {
  69. Allocate a new AnsiString on the heap.
  70. initialize it to zero length and reference count 1.
  71. }
  72. Var P : Pointer;
  73. begin
  74. GetMem(P,Len+AnsiRecLen);
  75. If P<>Nil then
  76. begin
  77. PAnsiRec(P)^.Maxlen:=Len; { Maximal length }
  78. PAnsiRec(P)^.Len:=0; { Initial length }
  79. PAnsiRec(P)^.Ref:=1; { Set reference count }
  80. PAnsiRec(P)^.First:=#0; { Terminating #0 }
  81. P:=P+FirstOff; { Points to string now }
  82. end;
  83. NewAnsiString:=P;
  84. end;
  85. Procedure DisposeAnsiString(Var S : Pointer);
  86. {
  87. Deallocates a AnsiString From the heap.
  88. }
  89. begin
  90. // Writeln ('In disposeAnsiSTring');
  91. If S=Nil
  92. then exit;
  93. Dec (Longint(S),FirstOff);
  94. FreeMem (S,PAnsiRec(S)^.Maxlen+AnsiRecLen);
  95. S:=Nil;
  96. end;
  97. Procedure Decr_Ansi_Ref (Var S : Pointer);
  98. [Public,Alias : 'FPC_DECR_ANSI_REF'];
  99. {
  100. Decreases the ReferenceCount of a non constant ansistring;
  101. If the reference count is zero, deallocate the string;
  102. }
  103. Type plongint = ^longint;
  104. Var l : plongint;
  105. Begin
  106. // dumpansirec(s);
  107. { Zero string }
  108. If S=Nil then
  109. exit;
  110. { check for constant strings ...}
  111. l:=S-FirstOff+8;
  112. If l^<0 then exit;
  113. Dec(l^);
  114. // dumpansirec(s);
  115. If l^=0 then
  116. { Ref count dropped to zero }
  117. begin
  118. // Writeln ('Calling disposestring');
  119. DisposeAnsiString (S); { Remove...}
  120. end
  121. end;
  122. Procedure Incr_Ansi_Ref (Var S : Pointer);
  123. [Public,Alias : 'FPC_INCR_ANSI_REF'];
  124. Begin
  125. If S=Nil then
  126. exit;
  127. { Let's be paranoid : Constant string ??}
  128. If PAnsiRec(S-FirstOff)^.Ref<0 then exit;
  129. Inc(PAnsiRec(S-FirstOff)^.Ref);
  130. end;
  131. Procedure UniqueAnsiString (Var S : AnsiString); [Public,Alias : 'FPC_UNIQUE_ANSISTRING'];
  132. {
  133. Make sure reference count of S is 1,
  134. using copy-on-write semantics.
  135. }
  136. Var SNew : Pointer;
  137. begin
  138. If Pointer(S)=Nil
  139. then exit;
  140. if PAnsiRec(Pointer(S)-Firstoff)^.Ref>1 then
  141. begin
  142. SNew:=NewAnsiString (PAnsiRec(Pointer(S)-FirstOff)^.len);
  143. Move (Pointer(S)^,SNew^,PAnsiRec(Pointer(S)-FirstOff)^.len+1);
  144. PAnsiRec(SNew-8)^.len:=PAnsiRec(Pointer(S)-FirstOff)^.len;
  145. Decr_Ansi_Ref (Pointer(S)); { Thread safe }
  146. Pointer(S):=SNew;
  147. end;
  148. end;
  149. Procedure AssignAnsiString (Var S1 : Pointer;S2 : Pointer);
  150. [Public, Alias : 'FPC_ASSIGN_ANSI_STRING'];
  151. {
  152. Assigns S2 to S1 (S1:=S2), taking in account reference counts.
  153. If S2 is a constant string, a new S1 is allocated on the heap.
  154. }
  155. Var Temp : Pointer;
  156. begin
  157. If S2<>nil then
  158. begin
  159. If PAnsiRec(S2-FirstOff)^.Ref<0 then
  160. begin
  161. { S2 is a constant string, Create new string with copy. }
  162. Temp:=Pointer(NewAnsiString(PansiRec(S2-FirstOff)^.Len));
  163. Move (S2^,Temp^,PAnsiRec(S2-FirstOff)^.len+1);
  164. PAnsiRec(Temp-FirstOff)^.Len:=PAnsiRec(S2-FirstOff)^.len;
  165. end
  166. else
  167. begin
  168. Inc(PAnsiRec(S2-FirstOff)^.ref);
  169. Temp:=S2;
  170. end;
  171. end;
  172. { Decrease the reference count on the old S1 }
  173. Decr_Ansi_Ref (S1);
  174. { And finally, have S1 pointing to S2 (or its copy) }
  175. S1:=Temp;
  176. end;
  177. Procedure Ansi_String_Concat (Var S1 : Pointer; Var S2 : Pointer);
  178. {
  179. Concatenates 2 AnsiStrings : S1+S2.
  180. Result Goes to S1;
  181. }
  182. Var Size,Location : Longint;
  183. begin
  184. if S2=Nil then exit;
  185. if (S1=Nil) then
  186. AssignAnsiString(S1,S2)
  187. else
  188. begin
  189. Size:=PAnsiRec(Pointer(S2)-FirstOff)^.Len;
  190. Location:=Length(AnsiString(S1));
  191. { Setlength takes case of uniqueness
  192. and allocated memory. We need to use length,
  193. to take into account possibility of S1=Nil }
  194. //!! SetLength (S1,Size+Location);
  195. Move (Pointer(S2)^,Pointer(Pointer(S1)+location)^,Size+1);
  196. end;
  197. end;
  198. Procedure Ansi_ShortString_Concat (Var S1: AnsiString; Var S2 : ShortString);
  199. {
  200. Concatenates a Ansi with a short string; : S2 + S2
  201. }
  202. Var Size,Location : Longint;
  203. begin
  204. Size:=byte(S2[0]);
  205. Location:=Length(S1);
  206. If Size=0 then exit;
  207. { Setlength takes case of uniqueness
  208. and alllocated memory. We need to use length,
  209. to take into account possibility of S1=Nil }
  210. SetLength (S1,Size+Length(S1));
  211. Move (S2[1],Pointer(Pointer(S1)+Location)^,Size);
  212. PByte( Pointer(S1)+length(S1) )^:=0; { Terminating Zero }
  213. end;
  214. Procedure Ansi_To_ShortString (Var S1 : ShortString;S2 : Pointer; Maxlen : Longint);
  215. [Public, alias: 'FPC_ANSI2SHORT'];
  216. {
  217. Converts a AnsiString to a ShortString;
  218. }
  219. Var Size : Longint;
  220. begin
  221. Size:=PAnsiRec(S2-FirstOff)^.Len;
  222. If Size>maxlen then Size:=maxlen;
  223. Move (S2^,S1[1],Size);
  224. byte(S1[0]):=Size;
  225. end;
  226. Procedure Short_To_AnsiString (Var S1 : Pointer; Const S2 : ShortString);
  227. [Public, alias: 'FPC_SHORT2ANSI'];
  228. {
  229. Converts a ShortString to a AnsiString;
  230. }
  231. Var Size : Longint;
  232. begin
  233. Size:=Byte(S2[0]);
  234. Setlength (AnsiString(S1),Size);
  235. Move (S2[1],Pointer(S1)^,Size);
  236. { Terminating Zero }
  237. PByte(Pointer(S1)+Size)^:=0;
  238. end;
  239. Procedure PChar2Ansi(var a : ansistring;p : pchar);[Public,Alias : 'FPC_PCHAR_TO_ANSISTRING'];
  240. begin
  241. //!!!!!!!!! needs to be fixed (FK)
  242. if p[0]=#0 Then
  243. Pointer(a):=nil
  244. else
  245. Pointer(a):=p;
  246. end;
  247. { the compiler generates inline code for that
  248. Const EmptyChar : char = #0;
  249. Function Ansi2pchar (S : Pointer) : Pchar; [Alias : 'FPC_ANSI2PCHAR'];
  250. begin
  251. If S<>Nil then
  252. Ansi2Pchar:=S
  253. else
  254. Ansi2Pchar:=@emptychar;
  255. end;
  256. }
  257. { stupid solution, could be done with public,name in later versions }
  258. {$ASMMODE DIRECT}
  259. procedure dummy;assembler;
  260. asm
  261. .globl FPC_EMPTYCHAR
  262. FPC_EMPTYCHAR:
  263. .byte 0
  264. end;
  265. {$ASMMODE ATT}
  266. Function AnsiCompare (Var S1,S2 : Pointer): Longint;
  267. {
  268. Compares 2 AnsiStrings;
  269. The result is
  270. <0 if S1<S2
  271. 0 if S1=S2
  272. >0 if S1>S2
  273. }
  274. Var i,MaxI,Temp : Longint;
  275. begin
  276. Temp:=0;
  277. i:=0;
  278. MaxI:=Length(AnsiString(S1));
  279. if MaxI>Length(AnsiString(S2)) then MaxI:=Length(AnsiString(S2));
  280. While (i<MaxI) and (Temp=0) do
  281. begin
  282. Temp:= PByte(S1+I)^ - PByte(S2+i)^;
  283. inc(i);
  284. end;
  285. if temp=0 then temp:=Length(AnsiString(S1))-Length(AnsiString(S2));
  286. AnsiCompare:=Temp;
  287. end;
  288. Function AnsiCompare (Var S1 : Pointer; Var S2 : ShortString): Longint;
  289. {
  290. Compares a AnsiString with a ShortString;
  291. The result is
  292. <0 if S1<S2
  293. 0 if S1=S2
  294. >0 if S1>S2
  295. }
  296. Var i,MaxI,Temp : Longint;
  297. begin
  298. Temp:=0;
  299. i:=0;
  300. MaxI:=Length(AnsiString(S1));
  301. if MaxI>byte(S2[0]) then MaxI:=Byte(S2[0]);
  302. While (i<MaxI) and (Temp=0) do
  303. begin
  304. Temp:= PByte(S1+I)^ - Byte(S2[i+1]);
  305. inc(i);
  306. end;
  307. AnsiCompare:=Temp;
  308. end;
  309. { Not used, can be removed. }
  310. Procedure SetCharAtIndex (Var S : AnsiString; Index : Longint; C : CHar);
  311. begin
  312. if Index<=Length(S) then
  313. begin
  314. UniqueAnsiString(S);
  315. Pbyte(Pointer(S)+index-1)^:=Byte(C);
  316. end;
  317. end;
  318. { ---------------------------------------------------------------------
  319. Public functions, In interface.
  320. ---------------------------------------------------------------------}
  321. Function Length (Const S : AnsiString) : Longint;
  322. {
  323. Returns the length of an AnsiString.
  324. Takes in acount that zero strings are NIL;
  325. }
  326. begin
  327. If Pointer(S)=Nil then
  328. Length:=0
  329. else
  330. Length:=PAnsiRec(Pointer(S)-FirstOff)^.Len;
  331. end;
  332. Procedure SetLength (Var S : AnsiString; l : Longint);
  333. {
  334. Sets The length of string S to L.
  335. Makes sure S is unique, and contains enough room.
  336. }
  337. Var Temp : Pointer;
  338. begin
  339. If (Pointer(S)=Nil) and (l>0) then
  340. begin
  341. { Need a complete new string...}
  342. // S:=NewAnsiString(l);
  343. PAnsiRec(Pointer(S)-FirstOff)^.Len:=l;
  344. PAnsiRec(Pointer(S)-FirstOff)^.Len:=l;
  345. PByte (Pointer(S)+l)^:=0;
  346. end
  347. else if l>0 then
  348. begin
  349. If (PAnsiRec(Pointer(S)-FirstOff)^.Maxlen < L) or
  350. (PAnsiRec(Pointer(S)-FirstOff)^.Ref <> 1) then
  351. begin
  352. { Reallocation is needed... }
  353. Temp:=Pointer(NewAnsiString(L));
  354. if Length(S)>0 then
  355. Move (Pointer(S)^,Temp^,Length(S)+1);
  356. Decr_Ansi_ref (Pointer(S));
  357. Pointer(S):=Temp;
  358. end;
  359. PAnsiRec(Pointer(S)-FirstOff)^.Len:=l
  360. end
  361. else
  362. { Length=0 }
  363. begin
  364. Decr_Ansi_Ref (Pointer(S));
  365. Pointer(S):=Nil;
  366. end;
  367. end;
  368. Function Copy (Const S : AnsiString; Index,Size : Longint) : AnsiString;
  369. var ResultAddress : Pointer;
  370. begin
  371. ResultAddress:=Nil;
  372. dec(index);
  373. { Check Size. Accounts for Zero-length S }
  374. if Length(S)<Index+Size then
  375. Size:=Length(S)-Index;
  376. If Size>0 then
  377. begin
  378. ResultAddress:=Pointer(NewAnsiString (Size));
  379. if ResultAddress<>Nil then
  380. begin
  381. Move (Pointer(Pointer(S)+index)^,ResultAddress^,Size);
  382. PAnsiRec(ResultAddress-FirstOff)^.Len:=Size;
  383. PByte(ResultAddress+Size)^:=0;
  384. end;
  385. end;
  386. Copy:=AnsiString(ResultAddress);
  387. end;
  388. Function Pos (Const Substr : AnsiString; Const Source : AnsiString) : Longint;
  389. var i,j : longint;
  390. e : boolean;
  391. s,se : Pointer;
  392. begin
  393. i := 0;
  394. j := 0;
  395. e := true;
  396. if Plongint(substr)^=0 then e := false;
  397. while (e) and (i <= length (Source) - length (substr)) do
  398. begin
  399. inc (i);
  400. S:=Pointer(copy(Source,i,length(Substr)));
  401. Se:=pointer(substr);
  402. if AnsiCompare(se,S)=0 then
  403. begin
  404. j := i;
  405. e := false;
  406. end;
  407. DisposeAnsiString(S);
  408. end;
  409. pos := j;
  410. end;
  411. Procedure Val (Const S : AnsiString; var R : real; Var Code : Integer);
  412. Var SS : String;
  413. begin
  414. Ansi_To_ShortString (SS,Pointer(S),255);
  415. Val(SS,R,Code);
  416. end;
  417. {
  418. Procedure Val (var S : AnsiString; var D : Double; Var Code : Integer);
  419. Var SS : ShortString;
  420. begin
  421. Ansi_To_ShortString (SS,S,255);
  422. Val(SS,D,Code);
  423. end;
  424. }
  425. Procedure Val (Const S : AnsiString; var E : Extended; Code : Integer);
  426. Var SS : ShortString;
  427. begin
  428. Ansi_To_ShortString (SS,Pointer(S),255);
  429. Val(SS,E,Code);
  430. end;
  431. Procedure Val (Const S : AnsiString; var C : Cardinal; Code : Integer);
  432. Var SS : ShortString;
  433. begin
  434. Ansi_To_ShortString (SS,Pointer(S),255);
  435. Val(SS,C,Code);
  436. end;
  437. Procedure Val (Const S : AnsiString; var L : Longint; Var Code : Integer);
  438. Var SS : ShortString;
  439. begin
  440. Ansi_To_ShortString (SS,Pointer(S),255);
  441. Val(SS,L,Code);
  442. end;
  443. Procedure Val (Const S : AnsiString; var W : Word; Var Code : Integer);
  444. Var SS : ShortString;
  445. begin
  446. Ansi_To_ShortString (SS,Pointer(S),255);
  447. Val(SS,W,Code);
  448. end;
  449. Procedure Val (Const S : AnsiString; var I : Integer; Var Code : Integer);
  450. Var SS : ShortString;
  451. begin
  452. Ansi_To_ShortString (SS,Pointer(S),255);
  453. Val(SS,I,Code);
  454. end;
  455. Procedure Val (Const S : AnsiString; var B : Byte; Var Code : Integer);
  456. Var SS : ShortString;
  457. begin
  458. Ansi_To_ShortString (SS,Pointer(S),255);
  459. Val(SS,B,Code);
  460. end;
  461. Procedure Val (Const S : AnsiString; var SI : ShortInt; Var Code : Integer);
  462. Var SS : ShortString;
  463. begin
  464. Ansi_To_ShortString (SS,Pointer(S),255);
  465. Val(SS,SI,Code);
  466. end;
  467. {
  468. Procedure Str (Const R : Real;Len,fr : Longint; Const S : AnsiString);
  469. Var SS : ShortString;
  470. begin
  471. {int_Str_Real (R,Len,fr,SS);}
  472. Short_To_AnsiString (Pointer(S),SS);
  473. end;
  474. {
  475. Procedure Str (Var D : Double;Len,fr: Longint; Var S : AnsiString);
  476. Var SS : ShortString;
  477. begin
  478. {int_Str_Double (D,Len,fr,SS);}
  479. Short_To_AnsiString (S,SS);
  480. end;
  481. }
  482. Procedure Str (E : Extended;Lenf,Fr: Longint; Var S : AnsiString);
  483. Var SS : ShortString;
  484. begin
  485. {int_Str_Extended (E,Len,fr,SS);}
  486. Short_To_AnsiString (S,SS);
  487. end;
  488. Procedure Str (C : Cardinal;Len : Longint; Var S : AnsiString);
  489. begin
  490. end;
  491. Procedure Str (L : Longint; Len : Longint; Var S : AnsiString);
  492. Var SS : ShortString;
  493. begin
  494. {int_Str_Longint (L,Len,fr,SS);}
  495. Short_To_AnsiString (S,SS);
  496. end;
  497. Procedure Str (Var W : Word;Len : Longint; Var S : AnsiString);
  498. begin
  499. end;
  500. Procedure Str (Var I : Integer;Len : Longint; Var S : AnsiString);
  501. begin
  502. end;
  503. Procedure Str (Var B : Byte; Len : Longint; Var S : AnsiString);
  504. begin
  505. end;
  506. Procedure Str (Var SI : ShortInt; Len : Longint; Var S : AnsiString);
  507. begin
  508. end;
  509. }
  510. Procedure Delete (Var S : AnsiString; Index,Size: Longint);
  511. begin
  512. if index<=0 then
  513. begin
  514. Size:=Size+index-1;
  515. index:=1;
  516. end;
  517. if (Index<=length(s)) and (Size>0) then
  518. begin
  519. UniqueAnsiString (S);
  520. if Size+Index>Length(S) then
  521. Size:=Length(s)-Index+1;
  522. Setlength(s,Length(s)-Size);
  523. if Index<=Length(s) then
  524. Move(Pointer(Pointer(S)+Index+Size-1)^,
  525. Pointer(Pointer(s)+Index-1)^,Length(s)-Index+2)
  526. else
  527. Pbyte(Pointer(S)+Length(S))^:=0;
  528. end;
  529. end;
  530. Procedure Insert (Const Source : AnsiString; Var S : AnsiString; Index : Longint);
  531. var s3,s4,s5 : Pointer;
  532. begin
  533. If Length(Source)=0 then exit;
  534. if index <= 0 then index := 1;
  535. s3 := Pointer(copy(s,index,length(s)));
  536. if index > Length(s) then
  537. index := Length(S)+1;
  538. SetLength(s,index - 1);
  539. s4 := Pointer ( NewAnsiString(PansiRec(Pointer(Source)-Firstoff)^.len) );
  540. S5:=Pointer(Source);
  541. Ansi_String_Concat(s4,s5);
  542. if S4<>Nil then
  543. Ansi_String_Concat(S4,s3);
  544. Ansi_String_Concat(Pointer(S),S4);
  545. Decr_ansi_ref (S3);
  546. Decr_ansi_ref (S4);
  547. end;
  548. {
  549. $Log$
  550. Revision 1.18 1998-09-28 14:02:34 michael
  551. + AnsiString changes
  552. Revision 1.17 1998/09/27 22:44:50 florian
  553. * small fixes
  554. * made UniqueAnsistring public
  555. * ...
  556. Revision 1.16 1998/09/20 17:49:08 florian
  557. * some ansistring fixes
  558. Revision 1.15 1998/09/19 08:33:17 florian
  559. * some internal procedures take now an pointer instead of a
  560. ansistring
  561. Revision 1.14 1998/09/14 10:48:14 peter
  562. * FPC_ names
  563. * Heap manager is now system independent
  564. Revision 1.13 1998/08/23 20:58:51 florian
  565. + rtti for objects and classes
  566. + TObject.GetClassName implemented
  567. Revision 1.12 1998/08/22 09:32:12 michael
  568. + minor fixes typos, and ansi2pchar
  569. Revision 1.11 1998/08/08 12:28:10 florian
  570. * a lot small fixes to the extended data type work
  571. Revision 1.10 1998/07/29 21:44:34 michael
  572. + Implemented reading/writing of ansistrings
  573. Revision 1.9 1998/07/20 23:36:56 michael
  574. changes for ansistrings
  575. Revision 1.8 1998/07/13 21:19:09 florian
  576. * some problems with ansi string support fixed
  577. Revision 1.7 1998/07/06 14:29:08 michael
  578. + Added Public,Alias directives for some calls
  579. Revision 1.6 1998/06/25 08:41:44 florian
  580. * better rtti
  581. Revision 1.5 1998/06/12 07:39:13 michael
  582. + Added aliases for Incr/Decr ref.
  583. Revision 1.4 1998/06/08 19:35:02 michael
  584. Some changes to integrate in system unit
  585. Revision 1.3 1998/06/08 12:38:22 michael
  586. Implemented rtti, inserted ansistrings again
  587. Revision 1.2 1998/05/12 10:42:44 peter
  588. * moved getopts to inc/, all supported OS's need argc,argv exported
  589. + strpas, strlen are now exported in the systemunit
  590. * removed logs
  591. * removed $ifdef ver_above
  592. }