strings.inc 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983
  1. {
  2. $Id$
  3. This file is part of the Free Component Library (FCL)
  4. Copyright (c) 1998 by the Free Pascal development team
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. {****************************************************************************}
  12. {* TStrings *}
  13. {****************************************************************************}
  14. // Function to quote text. Should move maybe to sysutils !!
  15. // Also, it is not clear at this point what exactly should be done.
  16. { //!! is used to mark unsupported things. }
  17. Function QuoteString (Const S : String; Quote : String) : String;
  18. Var I,J : Longint;
  19. begin
  20. I:=0;
  21. J:=0;
  22. Result:=S;
  23. While I<Length(S) do
  24. begin
  25. I:=I+1;
  26. J:=J+1;
  27. if S[i]=Quote then
  28. begin
  29. System.Insert(Result,Quote,J);
  30. J:=J+1;
  31. end;
  32. end;
  33. Result:=Quote+Result+Quote;
  34. end;
  35. function TStrings.GetCommaText: string;
  36. Var I : Longint;
  37. begin
  38. result:='';
  39. For i:=0 to count-1 do
  40. begin
  41. Result:=Result+QuoteString (Strings[I],'"');
  42. if I<Count-1 then Result:=Result+',';
  43. end;
  44. If Length(Result)=0 then Result:='""';
  45. end;
  46. function TStrings.GetName(Index: Integer): string;
  47. Var L : longint;
  48. begin
  49. Result:=Strings[Index];
  50. L:=Pos('=',Result);
  51. If L<>0 then
  52. Result:=Copy(Result,1,L-1)
  53. else
  54. Result:='';
  55. end;
  56. Function TStrings.GetValue(const Name: string): string;
  57. Var L : longint;
  58. begin
  59. Result:='';
  60. L:=IndexOfName(Name);
  61. If L<>-1 then
  62. begin
  63. Result:=Strings[L];
  64. L:=Pos('=',Result);
  65. System.Delete (Result,1,L);
  66. end;
  67. end;
  68. Procedure TStrings.ReadData(Reader: TReader);
  69. begin
  70. end;
  71. Function GetQuotedString (Var P : Pchar) : AnsiString;
  72. Var P1,L : Pchar;
  73. begin
  74. Result:='';
  75. P1:=P+1;
  76. While P1^<>#0 do
  77. begin
  78. If (P1^='"') and (P1[1]<>'"') then
  79. break;
  80. P1:=P1+1;
  81. If P1^='"' then P1:=P1+1;
  82. end;
  83. // P1 points to last quote, or to #0;
  84. P:=P+1;
  85. If P1-P>0 then
  86. begin
  87. SetLength(Result,(P1-P));
  88. L:=Pointer(Result);
  89. Move (P^,L^,P1-P);
  90. P:=P1+1;
  91. end;
  92. end;
  93. Function GetNextQuotedChar (P : PChar; Var S : String): Boolean;
  94. Var PS,L : PChar;
  95. begin
  96. Result:=False;
  97. If P^=#0 then exit;
  98. S:='';
  99. While (p^<>#0) and (byte(p^)<=byte(' ')) do P:=P+1;
  100. PS:=P;
  101. If P^='"' then
  102. S:=GetQuotedString(P)
  103. else
  104. begin
  105. While (p^>' ') and (P^<>',') do P:=P+1;
  106. Setlength (S,P-PS);
  107. L:=Pointer(S);
  108. Move (PS^,L,P-PS);
  109. end;
  110. Result:=True;
  111. end;
  112. Procedure TStrings.SetCommaText(const Value: string);
  113. Var P : Pointer;
  114. S : String;
  115. begin
  116. Self.Clear;
  117. P:=Pointer(Value);
  118. While GetNextQuotedChar (P,S) do Add (S);
  119. end;
  120. Procedure TStrings.SetStringsAdapter(const Value: IStringsAdapter);
  121. begin
  122. end;
  123. Procedure TStrings.SetValue(const Name, Value: string);
  124. Var L : longint;
  125. begin
  126. L:=IndexOfName(Name);
  127. if L=-1 then
  128. Add (Name+'='+Value)
  129. else
  130. Strings[L]:=Name+'='+value;
  131. end;
  132. Procedure TStrings.WriteData(Writer: TWriter);
  133. begin
  134. end;
  135. Procedure TStrings.DefineProperties(Filer: TFiler);
  136. begin
  137. end;
  138. Procedure TStrings.Error(const Msg: string; Data: Integer);
  139. begin
  140. //!! Need to get correct address !!
  141. Raise EStringListError.CreateFmt(Msg,[Data]);
  142. end;
  143. Function TStrings.GetCapacity: Integer;
  144. begin
  145. Result:=Count;
  146. end;
  147. Function TStrings.GetObject(Index: Integer): TObject;
  148. begin
  149. Result:=Nil;
  150. end;
  151. Function TStrings.GetTextStr: string;
  152. Const
  153. {$ifdef linux}
  154. NewLineSize=1;
  155. {$else}
  156. NewLineSize=2;
  157. {$endif}
  158. Var P : Pchar;
  159. I,L : Longint;
  160. S : String;
  161. PS : Pointer;
  162. begin
  163. // Determine needed place
  164. L:=0;
  165. For I:=0 to count-1 do L:=L+Length(Strings[I])+NewLineSize;
  166. Setlength(Result,L);
  167. P:=Pointer(Result);
  168. For i:=0 To count-1 do
  169. begin
  170. S:=Strings[I];
  171. L:=Length(S);
  172. if L<>0 then
  173. System.Move(Pointer(S)^,P^,L);
  174. P:=P+L;
  175. {$ifndef linux}
  176. p[0]:=#13;
  177. p[1]:=#10;
  178. {$else}
  179. p[0]:=#10;
  180. {$endif}
  181. P:=P+NewLineSize;
  182. end;
  183. end;
  184. Procedure TStrings.Put(Index: Integer; const S: string);
  185. Var Obj : TObject;
  186. begin
  187. Obj:=Objects[Index];
  188. Delete(Index);
  189. InsertObject(Index,S,Obj);
  190. end;
  191. Procedure TStrings.PutObject(Index: Integer; AObject: TObject);
  192. begin
  193. // Empty.
  194. end;
  195. Procedure TStrings.SetCapacity(NewCapacity: Integer);
  196. begin
  197. // Empty.
  198. end;
  199. Procedure TStrings.SetTextStr(const Value: string);
  200. begin
  201. SetText(PChar(Value));
  202. end;
  203. Procedure TStrings.SetUpdateState(Updating: Boolean);
  204. begin
  205. end;
  206. destructor TSTrings.Destroy;
  207. begin
  208. inherited destroy;
  209. end;
  210. Function TStrings.Add(const S: string): Integer;
  211. begin
  212. Result:=Count;
  213. Insert (Count,S);
  214. end;
  215. Function TStrings.AddObject(const S: string; AObject: TObject): Integer;
  216. begin
  217. Result:=Add(S);
  218. Objects[result]:=AObject;
  219. end;
  220. Procedure TStrings.Append(const S: string);
  221. begin
  222. Add (S);
  223. end;
  224. Procedure TStrings.AddStrings(TheStrings: TStrings);
  225. Var Runner : longint;
  226. begin
  227. For Runner:=0 to TheStrings.Count-1 do
  228. self.AddObject (Thestrings[Runner],TheStrings.Objects[Runner]);
  229. end;
  230. Procedure TStrings.Assign(Source: TPersistent);
  231. begin
  232. If Source is TStrings then
  233. begin
  234. clear;
  235. AddStrings(TStrings(Source));
  236. exit;
  237. end;
  238. Inherited Assign(Source);
  239. end;
  240. Procedure TStrings.BeginUpdate;
  241. begin
  242. end;
  243. Procedure TStrings.EndUpdate;
  244. begin
  245. end;
  246. Function TStrings.Equals(TheStrings: TStrings): Boolean;
  247. Var Runner,Nr : Longint;
  248. begin
  249. Result:=False;
  250. Nr:=Self.Count;
  251. if Nr<>TheStrings.Count then exit;
  252. For Runner:=0 to Nr-1 do
  253. If Strings[Runner]<>TheStrings[Runner] then exit;
  254. Result:=True;
  255. end;
  256. Procedure TStrings.Exchange(Index1, Index2: Integer);
  257. Var
  258. Obj : TObject;
  259. Str : String;
  260. begin
  261. Obj:=Objects[Index1];
  262. Str:=Strings[Index1];
  263. Objects[Index1]:=Objects[Index2];
  264. Strings[Index1]:=Strings[Index2];
  265. Objects[Index2]:=Obj;
  266. Strings[Index2]:=Str;
  267. end;
  268. Function TStrings.GetText: PChar;
  269. begin
  270. Result:=StrNew(Pchar(Self.Text));
  271. end;
  272. Function TStrings.IndexOf(const S: string): Integer;
  273. begin
  274. Result:=0;
  275. While (Result<Count) and (Strings[Result]<>S) do Result:=Result+1;
  276. if Result=Count then Result:=-1;
  277. end;
  278. Function TStrings.IndexOfName(const Name: string): Integer;
  279. Var len : longint;
  280. begin
  281. Result:=0;
  282. while (Result<Count) do
  283. begin
  284. len:=pos('=',Strings[Result])-1;
  285. if (len>0) and (Name=Copy(Strings[Result],1,Len)) then exit;
  286. inc(result);
  287. end;
  288. result:=-1;
  289. end;
  290. Function TStrings.IndexOfObject(AObject: TObject): Integer;
  291. begin
  292. Result:=0;
  293. While (Result<count) and (Objects[Result]<>AObject) do Result:=Result+1;
  294. If Result=Count then Result:=-1;
  295. end;
  296. Procedure TStrings.InsertObject(Index: Integer; const S: string;
  297. AObject: TObject);
  298. begin
  299. Insert (Index,S);
  300. Objects[Index]:=AObject;
  301. end;
  302. Procedure TStrings.LoadFromFile(const FileName: string);
  303. Var TheStream : TFileStream;
  304. begin
  305. TheStream:=TFileStream.Create(FileName,fmOpenRead);
  306. LoadFromStream(TheStream);
  307. TheStream.Free;
  308. end;
  309. Procedure TStrings.LoadFromStream(Stream: TStream);
  310. {
  311. Borlands method is no goed, since a pipe for
  312. Instance doesn't have a size.
  313. So we must do it the hard way.
  314. }
  315. Const BufSize = 1024;
  316. Procedure ReallocMem (Var B : Pointer; OldSize :longint);
  317. Var NewB : Pointer;
  318. begin
  319. GetMem(NewB,OldSIze+BufSize);
  320. If OldSize>0 then // assume that if size=0, B also Nil
  321. begin
  322. System.Move (B^,NewB^,OldSize);
  323. FreeMem (B,OldSize);
  324. end;
  325. B:=NewB;
  326. end;
  327. Var Buffer : Pointer;
  328. BytesRead,BufLen : Longint;
  329. begin
  330. Buffer:=Nil;
  331. BufLen:=0;
  332. Repeat
  333. ReAllocMem(Buffer,BufLen);
  334. BytesRead:=Stream.Read((Buffer+BufLen)^,BufSize);
  335. BufLen:=BufLen+BufSize;
  336. Until BytesRead<>BufSize;
  337. // Null-terminate !!
  338. Pchar(Buffer)[BufLen-BufSize+BytesRead]:=#0;
  339. Text:=PChar(Buffer);
  340. FreeMem (Buffer,BufLen);
  341. end;
  342. Procedure TStrings.Move(CurIndex, NewIndex: Integer);
  343. Var Obj : TObject;
  344. Str : String;
  345. begin
  346. Obj:=Objects[CurIndex];
  347. Str:=Strings[CurIndex];
  348. Delete(Curindex);
  349. InsertObject(NewIndex,Str,Obj);
  350. end;
  351. Procedure TStrings.SaveToFile(const FileName: string);
  352. Var TheStream : TFileStream;
  353. begin
  354. TheStream:=TFileStream.Create(FileName,fmCreate);
  355. SaveToStream(TheStream);
  356. TheStream.Free;
  357. end;
  358. Procedure TStrings.SaveToStream(Stream: TStream);
  359. VAr S : String;
  360. begin
  361. S:=Text;
  362. Stream.Write(Pointer(S)^,Length(S));
  363. end;
  364. Function GetNextLine (Var P : Pchar; Var S : String) : Boolean;
  365. Var PS : PChar;
  366. begin
  367. S:='';
  368. Result:=False;
  369. If P^=#0 then exit;
  370. PS:=P;
  371. While (P^<>#10) do P:=P+1;
  372. SetLength (S,P-PS);
  373. System.Move (PS^,Pointer(S)^,P-PS);
  374. If P[1]=#13 then P:=P+1;
  375. P:=P+1; // Point to character after #10(#13)
  376. Result:=True;
  377. end;
  378. Procedure TStrings.SetText(TheText: PChar);
  379. Var S : String;
  380. begin
  381. Clear;
  382. While GetNextLine (TheText,S) do
  383. Add(S);
  384. end;
  385. {****************************************************************************}
  386. {* TStringList *}
  387. {****************************************************************************}
  388. Procedure TStringList.ExchangeItems(Index1, Index2: Integer);
  389. Var P1,P2 : Pointer;
  390. begin
  391. P1:=Pointer(Flist^[Index1].FString);
  392. P2:=Pointer(Flist^[Index1].FObject);
  393. Pointer(Flist^[Index1].Fstring):=Pointer(Flist^[Index2].Fstring);
  394. Pointer(Flist^[Index1].FObject):=Pointer(Flist^[Index2].FObject);
  395. Pointer(Flist^[Index2].Fstring):=P1;
  396. Pointer(Flist^[Index2].FObject):=P2;
  397. end;
  398. Procedure TStringList.Grow;
  399. Var Extra : Longint;
  400. begin
  401. If FCapacity>64 then
  402. Extra:=FCapacity Div 4
  403. Else If FCapacity>8 Then
  404. Extra:=16
  405. Else
  406. Extra:=4;
  407. SetCapacity(FCapacity+Extra);
  408. end;
  409. Procedure TStringList.QuickSort(L, R: Integer);
  410. Var I,J : Longint;
  411. Pivot : String;
  412. begin
  413. Repeat;
  414. I:=L;
  415. J:=R;
  416. Pivot:=Flist^[(L+R) div 2].FString;
  417. Repeat
  418. While AnsiCompareText(Flist^[I].Fstring,Pivot)<0 do Inc(I);
  419. While AnsiCompareText(Flist^[J].Fstring,Pivot)>0 do Dec(J);
  420. If I<=J then
  421. begin
  422. ExchangeItems(I,J); // No check, indices are correct.
  423. Inc(I);
  424. Dec(j);
  425. end;
  426. until I>J;
  427. If L<J then QuickSort(L,J);
  428. L:=I;
  429. Until I>=R;
  430. end;
  431. Procedure TStringList.InsertItem(Index: Integer; const S: string);
  432. begin
  433. Changing;
  434. If FCount=Fcapacity then Grow;
  435. If Index<FCount then
  436. System.Move (FList^[Index],FList^[Index+1],SizeOf(TStringItem));
  437. Pointer(Flist^[Index].Fstring):=Nil; // Needed to initialize...
  438. Flist^[Index].FString:=S;
  439. Flist^[Index].Fobject:=Nil;
  440. Inc(FCount);
  441. Changed;
  442. end;
  443. Procedure TStringList.SetSorted(Value: Boolean);
  444. begin
  445. If FSorted<>Value then
  446. begin
  447. If Value then sort;
  448. FSorted:=VAlue
  449. end;
  450. end;
  451. Procedure TStringList.Changed;
  452. begin
  453. If (FUpdateCount=0) Then
  454. If Assigned(FOnChange) then
  455. FOnchange(Self);
  456. end;
  457. Procedure TStringList.Changing;
  458. begin
  459. If FUpdateCount=0 then
  460. if Assigned(FOnChanging) then
  461. FOnchanging(Self);
  462. end;
  463. Function TStringList.Get(Index: Integer): string;
  464. begin
  465. If (Index<0) or (INdex>=Fcount) then
  466. Error (SListIndexError,Index);
  467. Result:=Flist^[Index].FString;
  468. end;
  469. Function TStringList.GetCapacity: Integer;
  470. begin
  471. Result:=FCapacity;
  472. end;
  473. Function TStringList.GetCount: Integer;
  474. begin
  475. Result:=FCount;
  476. end;
  477. Function TStringList.GetObject(Index: Integer): TObject;
  478. begin
  479. If (Index<0) or (INdex>=Fcount) then
  480. Error (SListIndexError,Index);
  481. Result:=Flist^[Index].FObject;
  482. end;
  483. Procedure TStringList.Put(Index: Integer; const S: string);
  484. begin
  485. If Sorted then
  486. Error(SSortedListError,0);
  487. If (Index<0) or (INdex>=Fcount) then
  488. Error (SListIndexError,Index);
  489. Changing;
  490. Flist^[Index].FString:=S;
  491. Changed;
  492. end;
  493. Procedure TStringList.PutObject(Index: Integer; AObject: TObject);
  494. begin
  495. If (Index<0) or (INdex>=Fcount) then
  496. Error (SListIndexError,Index);
  497. Changing;
  498. Flist^[Index].FObject:=AObject;
  499. Changed;
  500. end;
  501. Procedure TStringList.SetCapacity(NewCapacity: Integer);
  502. Var NewList : Pointer;
  503. MSize : Longint;
  504. begin
  505. If (NewCapacity<0) then
  506. Error (SListCapacityError,NewCapacity);
  507. If NewCapacity>FCapacity then
  508. begin
  509. GetMem (NewList,NewCapacity*SizeOf(TStringItem));
  510. If NewList=Nil then
  511. Error (SListCapacityError,NewCapacity);
  512. If Assigned(FList) then
  513. begin
  514. MSize:=FCapacity*Sizeof(TStringItem);
  515. System.Move (FList^,NewList^,MSize);
  516. FillWord (Pchar(NewList)[MSize],(NewCapacity-FCapacity)*WordRatio, 0);
  517. FreeMem (Flist,MSize);
  518. end;
  519. Flist:=NewList;
  520. FCapacity:=NewCapacity;
  521. end
  522. else if NewCapacity<FCapacity then
  523. begin
  524. NewList:=Flist+NewCapacity*SizeOf(TStringItem);
  525. FreeMem (NewList, (FCapacity-NewCapacity)*SizeOf(TStringItem));
  526. FCapacity:=NewCapacity;
  527. end;
  528. end;
  529. Procedure TStringList.SetUpdateState(Updating: Boolean);
  530. begin
  531. If Updating then
  532. Changing
  533. else
  534. Changed
  535. end;
  536. destructor TStringList.Destroy;
  537. Var I : Longint;
  538. begin
  539. FOnChange:=Nil;
  540. FOnChanging:=Nil;
  541. // This will force a dereference. Can be done better...
  542. For I:=0 to FCount-1 do
  543. FList^[I].FString:='';
  544. FCount:=0;
  545. SetCapacity(0);
  546. Inherited destroy;
  547. end;
  548. Function TStringList.Add(const S: string): Integer;
  549. begin
  550. If Not Sorted then
  551. Result:=FCount
  552. else
  553. If Find (S,Result) then
  554. Case DUplicates of
  555. DupIgnore : Exit;
  556. DupError : Error(SDuplicateString,0)
  557. end;
  558. InsertItem (Result,S);
  559. end;
  560. Procedure TStringList.Clear;
  561. Var I : longint;
  562. begin
  563. For I:=0 to FCount-1 do
  564. Flist^[I].FString:='';
  565. FCount:=0;
  566. SetCapacity(0);
  567. end;
  568. Procedure TStringList.Delete(Index: Integer);
  569. begin
  570. If (Index<0) or (Index>=FCount) then
  571. Error(SlistINdexError,Index);
  572. Flist^[Index].FString:='';
  573. Dec(FCount);
  574. If Index<FCount then
  575. System.Move(Flist^[Index+1],
  576. Flist^[Index],
  577. (Fcount-Index)*SizeOf(TStringItem));
  578. end;
  579. Procedure TStringList.Exchange(Index1, Index2: Integer);
  580. begin
  581. If (Index1<0) or (Index1>=FCount) then
  582. Error(SListIndexError,Index1);
  583. If (Index2<0) or (Index2>=FCount) then
  584. Error(SListIndexError,Index1);
  585. Changing;
  586. ExchangeItems(Index1,Index2);
  587. changed;
  588. end;
  589. Function TStringList.Find(const S: string; var Index: Integer): Boolean;
  590. { Searches for the first string <= S, returns True if exact match,
  591. sets index to the index f the found string. }
  592. Var I,L,R,Temp : Longint;
  593. begin
  594. Result:=False;
  595. // Use binary search.
  596. L:=0;
  597. R:=FCount-1;
  598. While L<=R do
  599. begin
  600. I:=(L+R) div 2;
  601. Temp:=AnsiCompareText(FList^ [I].FString,S);
  602. If Temp<0 then
  603. L:=I+1
  604. else
  605. begin
  606. R:=I-1;
  607. If Temp=0 then
  608. begin
  609. Result:=True;
  610. If Duplicates<>DupAccept then L:=I;
  611. end;
  612. end;
  613. end;
  614. Index:=L;
  615. end;
  616. Function TStringList.IndexOf(const S: string): Integer;
  617. begin
  618. If Not Sorted then
  619. Result:=Inherited indexOf(S)
  620. else
  621. // faster using binary search...
  622. If Not Find (S,Result) then
  623. Result:=-1;
  624. end;
  625. Procedure TStringList.Insert(Index: Integer; const S: string);
  626. begin
  627. If Sorted then
  628. Error (SSortedListError,0)
  629. else
  630. If (Index<0) or (Index>FCount) then
  631. Error (SListIndexError,Index)
  632. else
  633. InsertItem (Index,S);
  634. end;
  635. Procedure TStringList.Sort;
  636. begin
  637. If Not Sorted and (FCount>1) then
  638. begin
  639. Changing;
  640. QuickSOrt(0,FCount-1);
  641. Changed;
  642. end;
  643. end;
  644. {
  645. $Log$
  646. Revision 1.14 1999-02-06 08:21:00 michael
  647. + Finally fixed loadfromstream
  648. Revision 1.13 1999/02/04 21:41:12 michael
  649. + Fixed loadfromstream bug
  650. Revision 1.12 1999/02/04 17:19:14 michael
  651. + fixed getvalue
  652. Revision 1.11 1999/02/02 23:49:23 florian
  653. * new lines for non linux system fixed (tstrings class)
  654. Revision 1.10 1999/02/02 12:54:06 florian
  655. * tstrings.gettextstr fixed, setlength got a wrong length (0 instead L)
  656. Revision 1.9 1999/01/28 23:55:43 florian
  657. * made it compilable
  658. Revision 1.8 1998/11/13 09:40:16 michael
  659. + Restored old version
  660. Revision 1.6 1998/11/09 10:07:24 michael
  661. + Bugfix in setcapacity, sizes were wrong
  662. Revision 1.5 1998/10/30 14:52:52 michael
  663. + Added format in interface
  664. + Some errors in parser fixed, it uses exceptions now
  665. + Strings now has no more syntax errors.
  666. Revision 1.4 1998/10/24 13:45:37 michael
  667. + Implemented stringlist. Untested, since classes broken.
  668. Revision 1.3 1998/05/07 14:16:51 michael
  669. + Finished TStrings implementation.
  670. Revision 1.2 1998/05/06 12:58:53 michael
  671. + Initial implementation
  672. Revision 1.1 1998/05/04 14:30:12 michael
  673. * Split file according to Class; implemented dummys for all methods, so unit compiles.
  674. }