astrings.pp 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787
  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. Function Ansi_String_Concat (S1,S2 : Pointer): 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 (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. function Ansi_String_Concat (S1,S2 : Pointer) : pointer;
  178. [Public, alias: 'FPC_ANSICAT'];
  179. {
  180. Concatenates 2 AnsiStrings : S1+S2.
  181. Result Goes to S3;
  182. }
  183. Var
  184. Size,Location : Longint;
  185. S3 : pointer;
  186. begin
  187. if S2=Nil then exit;
  188. if (S1=Nil) then
  189. AssignAnsiString(S3,S2)
  190. else
  191. begin
  192. Size:=PAnsiRec(S2-FirstOff)^.Len;
  193. Location:=Length(AnsiString(S1));
  194. { Setlength takes case of uniqueness
  195. and allocated memory. We need to use length,
  196. to take into account possibility of S1=Nil }
  197. SetLength (AnsiString(S3),Size+Location);
  198. Move (S1^,S3^,PAnsiRec(S1-FirstOff)^.Len);
  199. Move (S2^,(S3+location)^,Size+1);
  200. end;
  201. Ansi_String_Concat:=S3;
  202. end;
  203. Procedure Ansi_ShortString_Concat (Var S1: AnsiString; Var S2 : ShortString);
  204. {
  205. Concatenates a Ansi with a short string; : S2 + S2
  206. }
  207. Var Size,Location : Longint;
  208. begin
  209. Size:=byte(S2[0]);
  210. Location:=Length(S1);
  211. If Size=0 then exit;
  212. { Setlength takes case of uniqueness
  213. and alllocated memory. We need to use length,
  214. to take into account possibility of S1=Nil }
  215. SetLength (S1,Size+Length(S1));
  216. Move (S2[1],Pointer(Pointer(S1)+Location)^,Size);
  217. PByte( Pointer(S1)+length(S1) )^:=0; { Terminating Zero }
  218. end;
  219. Procedure Ansi_To_ShortString (Var S1 : ShortString;S2 : Pointer; Maxlen : Longint);
  220. [Public, alias: 'FPC_ANSI2SHORT'];
  221. {
  222. Converts a AnsiString to a ShortString;
  223. }
  224. Var Size : Longint;
  225. begin
  226. Size:=PAnsiRec(S2-FirstOff)^.Len;
  227. If Size>maxlen then Size:=maxlen;
  228. Move (S2^,S1[1],Size);
  229. byte(S1[0]):=Size;
  230. end;
  231. Procedure Short_To_AnsiString (Var S1 : Pointer; Const S2 : ShortString);
  232. [Public, alias: 'FPC_SHORT2ANSI'];
  233. {
  234. Converts a ShortString to a AnsiString;
  235. }
  236. Var Size : Longint;
  237. begin
  238. Size:=Byte(S2[0]);
  239. Setlength (AnsiString(S1),Size);
  240. Move (S2[1],Pointer(S1)^,Size);
  241. { Terminating Zero }
  242. PByte(Pointer(S1)+Size)^:=0;
  243. end;
  244. Procedure PChar2Ansi(var a : ansistring;p : pchar);[Public,Alias : 'FPC_PCHAR_TO_ANSISTRING'];
  245. begin
  246. //!!!!!!!!! needs to be fixed (FK)
  247. if p[0]=#0 Then
  248. Pointer(a):=nil
  249. else
  250. Pointer(a):=p;
  251. end;
  252. { the compiler generates inline code for that
  253. Const EmptyChar : char = #0;
  254. Function Ansi2pchar (S : Pointer) : Pchar; [Alias : 'FPC_ANSI2PCHAR'];
  255. begin
  256. If S<>Nil then
  257. Ansi2Pchar:=S
  258. else
  259. Ansi2Pchar:=@emptychar;
  260. end;
  261. }
  262. { stupid solution, could be done with public,name in later versions }
  263. {$ASMMODE DIRECT}
  264. procedure dummy;assembler;
  265. asm
  266. .globl FPC_EMPTYCHAR
  267. FPC_EMPTYCHAR:
  268. .byte 0
  269. end;
  270. {$ASMMODE ATT}
  271. Function AnsiCompare(S1,S2 : Pointer): Longint;[Public,Alias : 'FPC_ANSICOMPARE'];
  272. {
  273. Compares 2 AnsiStrings;
  274. The result is
  275. <0 if S1<S2
  276. 0 if S1=S2
  277. >0 if S1>S2
  278. }
  279. Var i,MaxI,Temp : Longint;
  280. begin
  281. Temp:=0;
  282. i:=0;
  283. MaxI:=Length(AnsiString(S1));
  284. if MaxI>Length(AnsiString(S2)) then MaxI:=Length(AnsiString(S2));
  285. While (i<MaxI) and (Temp=0) do
  286. begin
  287. Temp:= PByte(S1+I)^ - PByte(S2+i)^;
  288. inc(i);
  289. end;
  290. if temp=0 then temp:=Length(AnsiString(S1))-Length(AnsiString(S2));
  291. AnsiCompare:=Temp;
  292. end;
  293. Function AnsiCompare (Var S1 : Pointer; Var S2 : ShortString): Longint;
  294. {
  295. Compares a AnsiString with a ShortString;
  296. The result is
  297. <0 if S1<S2
  298. 0 if S1=S2
  299. >0 if S1>S2
  300. }
  301. Var i,MaxI,Temp : Longint;
  302. begin
  303. Temp:=0;
  304. i:=0;
  305. MaxI:=Length(AnsiString(S1));
  306. if MaxI>byte(S2[0]) then MaxI:=Byte(S2[0]);
  307. While (i<MaxI) and (Temp=0) do
  308. begin
  309. Temp:= PByte(S1+I)^ - Byte(S2[i+1]);
  310. inc(i);
  311. end;
  312. AnsiCompare:=Temp;
  313. end;
  314. { Not used, can be removed. }
  315. Procedure SetCharAtIndex (Var S : AnsiString; Index : Longint; C : CHar);
  316. begin
  317. if Index<=Length(S) then
  318. begin
  319. UniqueAnsiString(S);
  320. Pbyte(Pointer(S)+index-1)^:=Byte(C);
  321. end;
  322. end;
  323. { ---------------------------------------------------------------------
  324. Public functions, In interface.
  325. ---------------------------------------------------------------------}
  326. Function Length (Const S : AnsiString) : Longint;
  327. {
  328. Returns the length of an AnsiString.
  329. Takes in acount that zero strings are NIL;
  330. }
  331. begin
  332. If Pointer(S)=Nil then
  333. Length:=0
  334. else
  335. Length:=PAnsiRec(Pointer(S)-FirstOff)^.Len;
  336. end;
  337. Procedure SetLength (Var S : AnsiString; l : Longint);
  338. {
  339. Sets The length of string S to L.
  340. Makes sure S is unique, and contains enough room.
  341. }
  342. Var Temp : Pointer;
  343. begin
  344. If (Pointer(S)=Nil) and (l>0) then
  345. begin
  346. { Need a complete new string...}
  347. // S:=NewAnsiString(l);
  348. PAnsiRec(Pointer(S)-FirstOff)^.Len:=l;
  349. PAnsiRec(Pointer(S)-FirstOff)^.Len:=l;
  350. PByte (Pointer(S)+l)^:=0;
  351. end
  352. else if l>0 then
  353. begin
  354. If (PAnsiRec(Pointer(S)-FirstOff)^.Maxlen < L) or
  355. (PAnsiRec(Pointer(S)-FirstOff)^.Ref <> 1) then
  356. begin
  357. { Reallocation is needed... }
  358. Temp:=Pointer(NewAnsiString(L));
  359. if Length(S)>0 then
  360. Move (Pointer(S)^,Temp^,Length(S)+1);
  361. Decr_Ansi_ref (Pointer(S));
  362. Pointer(S):=Temp;
  363. end;
  364. PAnsiRec(Pointer(S)-FirstOff)^.Len:=l
  365. end
  366. else
  367. { Length=0 }
  368. begin
  369. Decr_Ansi_Ref (Pointer(S));
  370. Pointer(S):=Nil;
  371. end;
  372. end;
  373. Function Copy (Const S : AnsiString; Index,Size : Longint) : AnsiString;
  374. var ResultAddress : Pointer;
  375. begin
  376. ResultAddress:=Nil;
  377. dec(index);
  378. { Check Size. Accounts for Zero-length S }
  379. if Length(S)<Index+Size then
  380. Size:=Length(S)-Index;
  381. If Size>0 then
  382. begin
  383. ResultAddress:=Pointer(NewAnsiString (Size));
  384. if ResultAddress<>Nil then
  385. begin
  386. Move (Pointer(Pointer(S)+index)^,ResultAddress^,Size);
  387. PAnsiRec(ResultAddress-FirstOff)^.Len:=Size;
  388. PByte(ResultAddress+Size)^:=0;
  389. end;
  390. end;
  391. Copy:=AnsiString(ResultAddress);
  392. end;
  393. Function Pos (Const Substr : AnsiString; Const Source : AnsiString) : Longint;
  394. var i,j : longint;
  395. e : boolean;
  396. s,se : Pointer;
  397. begin
  398. i := 0;
  399. j := 0;
  400. e := true;
  401. if Plongint(substr)^=0 then e := false;
  402. while (e) and (i <= length (Source) - length (substr)) do
  403. begin
  404. inc (i);
  405. S:=Pointer(copy(Source,i,length(Substr)));
  406. Se:=pointer(substr);
  407. if AnsiCompare(se,S)=0 then
  408. begin
  409. j := i;
  410. e := false;
  411. end;
  412. DisposeAnsiString(S);
  413. end;
  414. pos := j;
  415. end;
  416. Procedure Val (Const S : AnsiString; var R : real; Var Code : Integer);
  417. Var SS : String;
  418. begin
  419. Ansi_To_ShortString (SS,Pointer(S),255);
  420. Val(SS,R,Code);
  421. end;
  422. {
  423. Procedure Val (var S : AnsiString; var D : Double; Var Code : Integer);
  424. Var SS : ShortString;
  425. begin
  426. Ansi_To_ShortString (SS,S,255);
  427. Val(SS,D,Code);
  428. end;
  429. }
  430. Procedure Val (Const S : AnsiString; var E : Extended; Code : Integer);
  431. Var SS : ShortString;
  432. begin
  433. Ansi_To_ShortString (SS,Pointer(S),255);
  434. Val(SS,E,Code);
  435. end;
  436. Procedure Val (Const S : AnsiString; var C : Cardinal; Code : Integer);
  437. Var SS : ShortString;
  438. begin
  439. Ansi_To_ShortString (SS,Pointer(S),255);
  440. Val(SS,C,Code);
  441. end;
  442. Procedure Val (Const S : AnsiString; var L : Longint; Var Code : Integer);
  443. Var SS : ShortString;
  444. begin
  445. Ansi_To_ShortString (SS,Pointer(S),255);
  446. Val(SS,L,Code);
  447. end;
  448. Procedure Val (Const S : AnsiString; var W : Word; Var Code : Integer);
  449. Var SS : ShortString;
  450. begin
  451. Ansi_To_ShortString (SS,Pointer(S),255);
  452. Val(SS,W,Code);
  453. end;
  454. Procedure Val (Const S : AnsiString; var I : Integer; Var Code : Integer);
  455. Var SS : ShortString;
  456. begin
  457. Ansi_To_ShortString (SS,Pointer(S),255);
  458. Val(SS,I,Code);
  459. end;
  460. Procedure Val (Const S : AnsiString; var B : Byte; Var Code : Integer);
  461. Var SS : ShortString;
  462. begin
  463. Ansi_To_ShortString (SS,Pointer(S),255);
  464. Val(SS,B,Code);
  465. end;
  466. Procedure Val (Const S : AnsiString; var SI : ShortInt; Var Code : Integer);
  467. Var SS : ShortString;
  468. begin
  469. Ansi_To_ShortString (SS,Pointer(S),255);
  470. Val(SS,SI,Code);
  471. end;
  472. {
  473. Procedure Str (Const R : Real;Len,fr : Longint; Const S : AnsiString);
  474. Var SS : ShortString;
  475. begin
  476. {int_Str_Real (R,Len,fr,SS);}
  477. Short_To_AnsiString (Pointer(S),SS);
  478. end;
  479. {
  480. Procedure Str (Var D : Double;Len,fr: Longint; Var S : AnsiString);
  481. Var SS : ShortString;
  482. begin
  483. {int_Str_Double (D,Len,fr,SS);}
  484. Short_To_AnsiString (S,SS);
  485. end;
  486. }
  487. Procedure Str (E : Extended;Lenf,Fr: Longint; Var S : AnsiString);
  488. Var SS : ShortString;
  489. begin
  490. {int_Str_Extended (E,Len,fr,SS);}
  491. Short_To_AnsiString (S,SS);
  492. end;
  493. Procedure Str (C : Cardinal;Len : Longint; Var S : AnsiString);
  494. begin
  495. end;
  496. Procedure Str (L : Longint; Len : Longint; Var S : AnsiString);
  497. Var SS : ShortString;
  498. begin
  499. {int_Str_Longint (L,Len,fr,SS);}
  500. Short_To_AnsiString (S,SS);
  501. end;
  502. Procedure Str (Var W : Word;Len : Longint; Var S : AnsiString);
  503. begin
  504. end;
  505. Procedure Str (Var I : Integer;Len : Longint; Var S : AnsiString);
  506. begin
  507. end;
  508. Procedure Str (Var B : Byte; Len : Longint; Var S : AnsiString);
  509. begin
  510. end;
  511. Procedure Str (Var SI : ShortInt; Len : Longint; Var S : AnsiString);
  512. begin
  513. end;
  514. }
  515. Procedure Delete (Var S : AnsiString; Index,Size: Longint);
  516. begin
  517. if index<=0 then
  518. begin
  519. Size:=Size+index-1;
  520. index:=1;
  521. end;
  522. if (Index<=length(s)) and (Size>0) then
  523. begin
  524. UniqueAnsiString (S);
  525. if Size+Index>Length(S) then
  526. Size:=Length(s)-Index+1;
  527. Setlength(s,Length(s)-Size);
  528. if Index<=Length(s) then
  529. Move(Pointer(Pointer(S)+Index+Size-1)^,
  530. Pointer(Pointer(s)+Index-1)^,Length(s)-Index+2)
  531. else
  532. Pbyte(Pointer(S)+Length(S))^:=0;
  533. end;
  534. end;
  535. Procedure Insert (Const Source : AnsiString; Var S : AnsiString; Index : Longint);
  536. var s3,s4,s5 : Pointer;
  537. begin
  538. If Length(Source)=0 then exit;
  539. if index <= 0 then index := 1;
  540. s3 := Pointer(copy(s,index,length(s)));
  541. if index > Length(s) then
  542. index := Length(S)+1;
  543. SetLength(s,index - 1);
  544. s4 := Pointer ( NewAnsiString(PansiRec(Pointer(Source)-Firstoff)^.len) );
  545. S5:=Pointer(Source);
  546. Ansi_String_Concat(s4,s5);
  547. if S4<>Nil then
  548. Ansi_String_Concat(S4,s3);
  549. Ansi_String_Concat(Pointer(S),S4);
  550. Decr_ansi_ref (S3);
  551. Decr_ansi_ref (S4);
  552. end;
  553. {
  554. $Log$
  555. Revision 1.22 1998-10-21 09:03:11 michael
  556. + more fixes so it compiles
  557. Revision 1.21 1998/10/21 08:56:58 michael
  558. + Fix so it compiles
  559. Revision 1.20 1998/10/21 08:38:46 florian
  560. * ansistringconcat fixed
  561. Revision 1.19 1998/10/20 12:46:11 florian
  562. * small fixes to ansicompare
  563. Revision 1.18 1998/09/28 14:02:34 michael
  564. + AnsiString changes
  565. Revision 1.17 1998/09/27 22:44:50 florian
  566. * small fixes
  567. * made UniqueAnsistring public
  568. * ...
  569. Revision 1.16 1998/09/20 17:49:08 florian
  570. * some ansistring fixes
  571. Revision 1.15 1998/09/19 08:33:17 florian
  572. * some internal procedures take now an pointer instead of a
  573. ansistring
  574. Revision 1.14 1998/09/14 10:48:14 peter
  575. * FPC_ names
  576. * Heap manager is now system independent
  577. Revision 1.13 1998/08/23 20:58:51 florian
  578. + rtti for objects and classes
  579. + TObject.GetClassName implemented
  580. Revision 1.12 1998/08/22 09:32:12 michael
  581. + minor fixes typos, and ansi2pchar
  582. Revision 1.11 1998/08/08 12:28:10 florian
  583. * a lot small fixes to the extended data type work
  584. Revision 1.10 1998/07/29 21:44:34 michael
  585. + Implemented reading/writing of ansistrings
  586. Revision 1.9 1998/07/20 23:36:56 michael
  587. changes for ansistrings
  588. Revision 1.8 1998/07/13 21:19:09 florian
  589. * some problems with ansi string support fixed
  590. Revision 1.7 1998/07/06 14:29:08 michael
  591. + Added Public,Alias directives for some calls
  592. Revision 1.6 1998/06/25 08:41:44 florian
  593. * better rtti
  594. Revision 1.5 1998/06/12 07:39:13 michael
  595. + Added aliases for Incr/Decr ref.
  596. Revision 1.4 1998/06/08 19:35:02 michael
  597. Some changes to integrate in system unit
  598. Revision 1.3 1998/06/08 12:38:22 michael
  599. Implemented rtti, inserted ansistrings again
  600. Revision 1.2 1998/05/12 10:42:44 peter
  601. * moved getopts to inc/, all supported OS's need argc,argv exported
  602. + strpas, strlen are now exported in the systemunit
  603. * removed logs
  604. * removed $ifdef ver_above
  605. }