cutils.pas 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912
  1. {
  2. $Id$
  3. Copyright (c) 1998-2002 by Florian Klaempfl
  4. This unit implements some support functions
  5. This program is free software; you can redistribute it and/or modify
  6. it under the terms of the GNU General Public License as published
  7. by the Free Software Foundation; either version 2 of the License, or
  8. (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program; if not, write to the Free Software
  15. Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  16. ****************************************************************************
  17. }
  18. {# This unit contains some generic support functions which are used
  19. in the different parts of the compiler.
  20. }
  21. unit cutils;
  22. {$i fpcdefs.inc}
  23. interface
  24. type
  25. pstring = ^string;
  26. {# Returns the minimal value between @var(a) and @var(b) }
  27. function min(a,b : longint) : longint;
  28. {# Returns the maximum value between @var(a) and @var(b) }
  29. function max(a,b : longint) : longint;
  30. {# Returns the value in @var(x) swapped to different endian }
  31. function SwapLong(x : longint): longint;
  32. {# Returns the value in @va(x) swapped to different endian }
  33. function SwapWord(x : word): word;
  34. {# Return value @var(i) aligned on @var(a) boundary }
  35. function align(i,a:longint):longint;
  36. function used_align(varalign,minalign,maxalign:longint):longint;
  37. function size_2_align(len : longint) : longint;
  38. procedure Replace(var s:string;s1:string;const s2:string);
  39. procedure ReplaceCase(var s:string;const s1,s2:string);
  40. function upper(const s : string) : string;
  41. function lower(const s : string) : string;
  42. function trimbspace(const s:string):string;
  43. function trimspace(const s:string):string;
  44. function space (b : longint): string;
  45. function PadSpace(const s:string;len:longint):string;
  46. function GetToken(var s:string;endchar:char):string;
  47. procedure uppervar(var s : string);
  48. function hexstr(val : cardinal;cnt : cardinal) : string;
  49. function tostru(i:cardinal) : string;
  50. function tostr(i : longint) : string;
  51. function realtostr(e:extended):string;
  52. function int64tostr(i : int64) : string;
  53. function tostr_with_plus(i : longint) : string;
  54. function DStr(l:longint):string;
  55. procedure valint(S : string;var V : longint;var code : integer);
  56. {# Returns true if the string s is a number }
  57. function is_number(const s : string) : boolean;
  58. {# Returns true if value is a power of 2, the actual
  59. exponent value is returned in power.
  60. }
  61. function ispowerof2(value : int64;var power : longint) : boolean;
  62. function maybequoted(const s:string):string;
  63. function CompareText(S1, S2: string): longint;
  64. { releases the string p and assignes nil to p }
  65. { if p=nil then freemem isn't called }
  66. procedure stringdispose(var p : pstring);
  67. { allocates mem for a copy of s, copies s to this mem and returns }
  68. { a pointer to this mem }
  69. function stringdup(const s : string) : pstring;
  70. {# Allocates memory for the string @var(s) and copies s as zero
  71. terminated string to that allocated memory and returns a pointer
  72. to that mem
  73. }
  74. function strpnew(const s : string) : pchar;
  75. procedure strdispose(var p : pchar);
  76. {# makes the character @var(c) lowercase, with spanish, french and german
  77. character set
  78. }
  79. function lowercase(c : char) : char;
  80. { makes zero terminated string to a pascal string }
  81. { the data in p is modified and p is returned }
  82. function pchar2pstring(p : pchar) : pstring;
  83. { ambivalent to pchar2pstring }
  84. function pstring2pchar(p : pstring) : pchar;
  85. { Speed/Hash value }
  86. Function GetSpeedValue(Const s:String):cardinal;
  87. { Ansistring (pchar+length) support }
  88. procedure ansistringdispose(var p : pchar;length : longint);
  89. function compareansistrings(p1,p2 : pchar;length1,length2 : longint) : longint;
  90. function concatansistrings(p1,p2 : pchar;length1,length2 : longint) : pchar;
  91. {*****************************************************************************
  92. File Functions
  93. *****************************************************************************}
  94. function DeleteFile(const fn:string):boolean;
  95. implementation
  96. uses
  97. {$ifdef delphi}
  98. sysutils
  99. {$else}
  100. strings
  101. {$endif}
  102. ;
  103. var
  104. uppertbl,
  105. lowertbl : array[char] of char;
  106. function min(a,b : longint) : longint;
  107. {
  108. return the minimal of a and b
  109. }
  110. begin
  111. if a>b then
  112. min:=b
  113. else
  114. min:=a;
  115. end;
  116. function max(a,b : longint) : longint;
  117. {
  118. return the maximum of a and b
  119. }
  120. begin
  121. if a<b then
  122. max:=b
  123. else
  124. max:=a;
  125. end;
  126. Function SwapLong(x : longint): longint;
  127. var
  128. y : word;
  129. z : word;
  130. Begin
  131. y := (x shr 16) and $FFFF;
  132. y := ((y shl 8) and $FFFF) or ((y shr 8) and $ff);
  133. z := x and $FFFF;
  134. z := ((z shl 8) and $FFFF) or ((z shr 8) and $ff);
  135. SwapLong := (longint(z) shl 16) or longint(y);
  136. End;
  137. Function SwapWord(x : word): word;
  138. var
  139. z : byte;
  140. Begin
  141. z := (x shr 8) and $ff;
  142. x := x and $ff;
  143. x := (x shl 8);
  144. SwapWord := x or z;
  145. End;
  146. function align(i,a:longint):longint;
  147. {
  148. return value <i> aligned <a> boundary
  149. }
  150. begin
  151. { for 0 and 1 no aligning is needed }
  152. if a<=1 then
  153. align:=i
  154. else
  155. align:=((i+a-1) div a) * a;
  156. end;
  157. function size_2_align(len : longint) : longint;
  158. begin
  159. if len>16 then
  160. size_2_align:=32
  161. else if len>8 then
  162. size_2_align:=16
  163. else if len>4 then
  164. size_2_align:=8
  165. else if len>2 then
  166. size_2_align:=4
  167. else if len>1 then
  168. size_2_align:=2
  169. else
  170. size_2_align:=1;
  171. end;
  172. function used_align(varalign,minalign,maxalign:longint):longint;
  173. begin
  174. { varalign : minimum alignment required for the variable
  175. minalign : Minimum alignment of this structure, 0 = undefined
  176. maxalign : Maximum alignment of this structure, 0 = undefined }
  177. if (minalign>0) and
  178. (varalign<minalign) then
  179. used_align:=minalign
  180. else
  181. begin
  182. if (maxalign>0) and
  183. (varalign>maxalign) then
  184. used_align:=maxalign
  185. else
  186. used_align:=varalign;
  187. end;
  188. end;
  189. procedure Replace(var s:string;s1:string;const s2:string);
  190. var
  191. last,
  192. i : longint;
  193. begin
  194. s1:=upper(s1);
  195. last:=0;
  196. repeat
  197. i:=pos(s1,upper(s));
  198. if i=last then
  199. i:=0;
  200. if (i>0) then
  201. begin
  202. Delete(s,i,length(s1));
  203. Insert(s2,s,i);
  204. last:=i;
  205. end;
  206. until (i=0);
  207. end;
  208. procedure ReplaceCase(var s:string;const s1,s2:string);
  209. var
  210. last,
  211. i : longint;
  212. begin
  213. last:=0;
  214. repeat
  215. i:=pos(s1,s);
  216. if i=last then
  217. i:=0;
  218. if (i>0) then
  219. begin
  220. Delete(s,i,length(s1));
  221. Insert(s2,s,i);
  222. last:=i;
  223. end;
  224. until (i=0);
  225. end;
  226. function upper(const s : string) : string;
  227. {
  228. return uppercased string of s
  229. }
  230. var
  231. i : longint;
  232. begin
  233. for i:=1 to length(s) do
  234. upper[i]:=uppertbl[s[i]];
  235. upper[0]:=s[0];
  236. end;
  237. function lower(const s : string) : string;
  238. {
  239. return lowercased string of s
  240. }
  241. var
  242. i : longint;
  243. begin
  244. for i:=1 to length(s) do
  245. lower[i]:=lowertbl[s[i]];
  246. lower[0]:=s[0];
  247. end;
  248. procedure uppervar(var s : string);
  249. {
  250. uppercase string s
  251. }
  252. var
  253. i : longint;
  254. begin
  255. for i:=1 to length(s) do
  256. s[i]:=uppertbl[s[i]];
  257. end;
  258. procedure initupperlower;
  259. var
  260. c : char;
  261. begin
  262. for c:=#0 to #255 do
  263. begin
  264. lowertbl[c]:=c;
  265. uppertbl[c]:=c;
  266. case c of
  267. 'A'..'Z' :
  268. lowertbl[c]:=char(byte(c)+32);
  269. 'a'..'z' :
  270. uppertbl[c]:=char(byte(c)-32);
  271. end;
  272. end;
  273. end;
  274. function hexstr(val : cardinal;cnt : cardinal) : string;
  275. const
  276. HexTbl : array[0..15] of char='0123456789ABCDEF';
  277. var
  278. i,j : cardinal;
  279. begin
  280. { calculate required length }
  281. i:=0;
  282. j:=val;
  283. while (j>0) do
  284. begin
  285. inc(i);
  286. j:=j shr 4;
  287. end;
  288. { generate fillers }
  289. j:=0;
  290. while (i+j<cnt) do
  291. begin
  292. inc(j);
  293. hexstr[j]:='0';
  294. end;
  295. { generate hex }
  296. inc(j,i);
  297. hexstr[0]:=chr(j);
  298. while (val>0) do
  299. begin
  300. hexstr[j]:=hextbl[val and $f];
  301. dec(j);
  302. val:=val shr 4;
  303. end;
  304. end;
  305. function tostru(i:cardinal):string;
  306. {
  307. return string of value i, but for cardinals
  308. }
  309. var
  310. hs : string;
  311. begin
  312. str(i,hs);
  313. tostru:=hs;
  314. end;
  315. function DStr(l:longint):string;
  316. var
  317. TmpStr : string[32];
  318. i : longint;
  319. begin
  320. Str(l,TmpStr);
  321. i:=Length(TmpStr);
  322. while (i>3) do
  323. begin
  324. dec(i,3);
  325. if TmpStr[i]<>'-' then
  326. insert('.',TmpStr,i+1);
  327. end;
  328. DStr:=TmpStr;
  329. end;
  330. function trimbspace(const s:string):string;
  331. {
  332. return s with all leading spaces and tabs removed
  333. }
  334. var
  335. i,j : longint;
  336. begin
  337. j:=1;
  338. i:=length(s);
  339. while (j<i) and (s[j] in [#9,' ']) do
  340. inc(j);
  341. trimbspace:=Copy(s,j,i-j+1);
  342. end;
  343. function trimspace(const s:string):string;
  344. {
  345. return s with all leading and ending spaces and tabs removed
  346. }
  347. var
  348. i,j : longint;
  349. begin
  350. i:=length(s);
  351. while (i>0) and (s[i] in [#9,' ']) do
  352. dec(i);
  353. j:=1;
  354. while (j<i) and (s[j] in [#9,' ']) do
  355. inc(j);
  356. trimspace:=Copy(s,j,i-j+1);
  357. end;
  358. function space (b : longint): string;
  359. var
  360. s: string;
  361. begin
  362. space[0] := chr(b);
  363. s[0] := chr(b);
  364. FillChar (S[1],b,' ');
  365. space:=s;
  366. end;
  367. function PadSpace(const s:string;len:longint):string;
  368. {
  369. return s with spaces add to the end
  370. }
  371. begin
  372. if length(s)<len then
  373. PadSpace:=s+Space(len-length(s))
  374. else
  375. PadSpace:=s;
  376. end;
  377. function GetToken(var s:string;endchar:char):string;
  378. var
  379. i : longint;
  380. begin
  381. GetToken:='';
  382. s:=TrimSpace(s);
  383. if s[1]='''' then
  384. begin
  385. i:=1;
  386. while (i<length(s)) do
  387. begin
  388. inc(i);
  389. if s[i]='''' then
  390. begin
  391. { Remove double quote }
  392. if (i<length(s)) and
  393. (s[i+1]='''') then
  394. begin
  395. Delete(s,i,1);
  396. inc(i);
  397. end
  398. else
  399. begin
  400. GetToken:=Copy(s,2,i-2);
  401. Delete(s,1,i);
  402. exit;
  403. end;
  404. end;
  405. end;
  406. GetToken:=s;
  407. s:='';
  408. end
  409. else
  410. begin
  411. i:=pos(EndChar,s);
  412. if i=0 then
  413. begin
  414. GetToken:=s;
  415. s:='';
  416. exit;
  417. end
  418. else
  419. begin
  420. GetToken:=Copy(s,1,i-1);
  421. Delete(s,1,i);
  422. exit;
  423. end;
  424. end;
  425. end;
  426. function tostr(i : longint) : string;
  427. {
  428. return string of value i
  429. }
  430. begin
  431. str(i,result);
  432. end;
  433. function realtostr(e:extended):string;
  434. begin
  435. str(e,result);
  436. end;
  437. function int64tostr(i : int64) : string;
  438. {
  439. return string of value i
  440. }
  441. var
  442. hs : string;
  443. begin
  444. str(i,hs);
  445. int64tostr:=hs;
  446. end;
  447. function tostr_with_plus(i : longint) : string;
  448. {
  449. return string of value i, but always include a + when i>=0
  450. }
  451. var
  452. hs : string;
  453. begin
  454. str(i,hs);
  455. if i>=0 then
  456. tostr_with_plus:='+'+hs
  457. else
  458. tostr_with_plus:=hs;
  459. end;
  460. procedure valint(S : string;var V : longint;var code : integer);
  461. {
  462. val() with support for octal, which is not supported under tp7
  463. }
  464. {$ifndef FPC}
  465. var
  466. vs : longint;
  467. c : byte;
  468. begin
  469. if s[1]='%' then
  470. begin
  471. vs:=0;
  472. longint(v):=0;
  473. for c:=2 to length(s) do
  474. begin
  475. if s[c]='0' then
  476. vs:=vs shl 1
  477. else
  478. if s[c]='1' then
  479. vs:=vs shl 1+1
  480. else
  481. begin
  482. code:=c;
  483. exit;
  484. end;
  485. end;
  486. code:=0;
  487. longint(v):=vs;
  488. end
  489. else
  490. system.val(S,V,code);
  491. end;
  492. {$else not FPC}
  493. begin
  494. system.val(S,V,code);
  495. end;
  496. {$endif not FPC}
  497. function is_number(const s : string) : boolean;
  498. {
  499. is string a correct number ?
  500. }
  501. var
  502. w : integer;
  503. l : longint;
  504. begin
  505. valint(s,l,w);
  506. is_number:=(w=0);
  507. end;
  508. function ispowerof2(value : int64;var power : longint) : boolean;
  509. {
  510. return if value is a power of 2. And if correct return the power
  511. }
  512. var
  513. hl : int64;
  514. i : longint;
  515. begin
  516. if value and (value - 1) <> 0 then
  517. begin
  518. ispowerof2 := false;
  519. exit
  520. end;
  521. hl:=1;
  522. ispowerof2:=true;
  523. for i:=0 to 63 do
  524. begin
  525. if hl=value then
  526. begin
  527. power:=i;
  528. exit;
  529. end;
  530. hl:=hl shl 1;
  531. end;
  532. ispowerof2:=false;
  533. end;
  534. function maybequoted(const s:string):string;
  535. var
  536. s1 : string;
  537. i : integer;
  538. quoted : boolean;
  539. begin
  540. quoted:=false;
  541. s1:='"';
  542. for i:=1 to length(s) do
  543. begin
  544. case s[i] of
  545. '"' :
  546. begin
  547. quoted:=true;
  548. s1:=s1+'\"';
  549. end;
  550. ' ',
  551. #128..#255 :
  552. begin
  553. quoted:=true;
  554. s1:=s1+s[i];
  555. end;
  556. else
  557. s1:=s1+s[i];
  558. end;
  559. end;
  560. if quoted then
  561. maybequoted:=s1+'"'
  562. else
  563. maybequoted:=s;
  564. end;
  565. function pchar2pstring(p : pchar) : pstring;
  566. var
  567. w,i : longint;
  568. begin
  569. w:=strlen(p);
  570. for i:=w-1 downto 0 do
  571. p[i+1]:=p[i];
  572. p[0]:=chr(w);
  573. pchar2pstring:=pstring(p);
  574. end;
  575. function pstring2pchar(p : pstring) : pchar;
  576. var
  577. w,i : longint;
  578. begin
  579. w:=length(p^);
  580. for i:=1 to w do
  581. p^[i-1]:=p^[i];
  582. p^[w]:=#0;
  583. pstring2pchar:=pchar(p);
  584. end;
  585. function lowercase(c : char) : char;
  586. begin
  587. case c of
  588. #65..#90 : c := chr(ord (c) + 32);
  589. #154 : c:=#129; { german }
  590. #142 : c:=#132; { german }
  591. #153 : c:=#148; { german }
  592. #144 : c:=#130; { french }
  593. #128 : c:=#135; { french }
  594. #143 : c:=#134; { swedish/norge (?) }
  595. #165 : c:=#164; { spanish }
  596. #228 : c:=#229; { greek }
  597. #226 : c:=#231; { greek }
  598. #232 : c:=#227; { greek }
  599. end;
  600. lowercase := c;
  601. end;
  602. function strpnew(const s : string) : pchar;
  603. var
  604. p : pchar;
  605. begin
  606. getmem(p,length(s)+1);
  607. strpcopy(p,s);
  608. strpnew:=p;
  609. end;
  610. procedure strdispose(var p : pchar);
  611. begin
  612. if assigned(p) then
  613. begin
  614. freemem(p,strlen(p)+1);
  615. p:=nil;
  616. end;
  617. end;
  618. procedure stringdispose(var p : pstring);
  619. begin
  620. if assigned(p) then
  621. freemem(p,length(p^)+1);
  622. p:=nil;
  623. end;
  624. function stringdup(const s : string) : pstring;
  625. var
  626. p : pstring;
  627. begin
  628. getmem(p,length(s)+1);
  629. p^:=s;
  630. stringdup:=p;
  631. end;
  632. function CompareText(S1, S2: string): longint;
  633. begin
  634. UpperVar(S1);
  635. UpperVar(S2);
  636. if S1<S2 then
  637. CompareText:=-1
  638. else
  639. if S1>S2 then
  640. CompareText:= 1
  641. else
  642. CompareText:=0;
  643. end;
  644. {*****************************************************************************
  645. GetSpeedValue
  646. *****************************************************************************}
  647. {$ifdef ver1_0}
  648. {$R-}
  649. {$endif}
  650. var
  651. Crc32Tbl : array[0..255] of cardinal;
  652. procedure MakeCRC32Tbl;
  653. var
  654. crc : cardinal;
  655. i,n : integer;
  656. begin
  657. for i:=0 to 255 do
  658. begin
  659. crc:=i;
  660. for n:=1 to 8 do
  661. if odd(longint(crc)) then
  662. crc:=cardinal(crc shr 1) xor cardinal($edb88320)
  663. else
  664. crc:=cardinal(crc shr 1);
  665. Crc32Tbl[i]:=crc;
  666. end;
  667. end;
  668. Function GetSpeedValue(Const s:String):cardinal;
  669. var
  670. i : integer;
  671. InitCrc : cardinal;
  672. begin
  673. if Crc32Tbl[1]=0 then
  674. MakeCrc32Tbl;
  675. InitCrc:=cardinal($ffffffff);
  676. for i:=1 to Length(s) do
  677. InitCrc:=Crc32Tbl[byte(InitCrc) xor ord(s[i])] xor (InitCrc shr 8);
  678. GetSpeedValue:=InitCrc;
  679. end;
  680. {*****************************************************************************
  681. Ansistring (PChar+Length)
  682. *****************************************************************************}
  683. procedure ansistringdispose(var p : pchar;length : longint);
  684. begin
  685. if assigned(p) then
  686. freemem(p,length+1);
  687. p:=nil;
  688. end;
  689. { enable ansistring comparison }
  690. { 0 means equal }
  691. { 1 means p1 > p2 }
  692. { -1 means p1 < p2 }
  693. function compareansistrings(p1,p2 : pchar;length1,length2 : longint) : longint;
  694. var
  695. i,j : longint;
  696. begin
  697. compareansistrings:=0;
  698. j:=min(length1,length2);
  699. i:=0;
  700. while (i<j) do
  701. begin
  702. if p1[i]>p2[i] then
  703. begin
  704. compareansistrings:=1;
  705. exit;
  706. end
  707. else
  708. if p1[i]<p2[i] then
  709. begin
  710. compareansistrings:=-1;
  711. exit;
  712. end;
  713. inc(i);
  714. end;
  715. if length1>length2 then
  716. compareansistrings:=1
  717. else
  718. if length1<length2 then
  719. compareansistrings:=-1;
  720. end;
  721. function concatansistrings(p1,p2 : pchar;length1,length2 : longint) : pchar;
  722. var
  723. p : pchar;
  724. begin
  725. getmem(p,length1+length2+1);
  726. move(p1[0],p[0],length1);
  727. move(p2[0],p[length1],length2+1);
  728. concatansistrings:=p;
  729. end;
  730. {*****************************************************************************
  731. File Functions
  732. *****************************************************************************}
  733. function DeleteFile(const fn:string):boolean;
  734. var
  735. f : file;
  736. begin
  737. {$I-}
  738. assign(f,fn);
  739. erase(f);
  740. {$I-}
  741. DeleteFile:=(IOResult=0);
  742. end;
  743. initialization
  744. initupperlower;
  745. end.
  746. {
  747. $Log$
  748. Revision 1.26 2003-04-04 15:34:25 peter
  749. * quote names with hi-ascii chars
  750. Revision 1.25 2003/01/09 21:42:27 peter
  751. * realtostr added
  752. Revision 1.24 2002/12/27 18:05:27 peter
  753. * support quotes in gettoken
  754. Revision 1.23 2002/10/05 12:43:24 carl
  755. * fixes for Delphi 6 compilation
  756. (warning : Some features do not work under Delphi)
  757. Revision 1.22 2002/09/05 19:29:42 peter
  758. * memdebug enhancements
  759. Revision 1.21 2002/07/26 11:16:35 jonas
  760. * fixed (actual and potential) range errors
  761. Revision 1.20 2002/07/07 11:13:34 carl
  762. * range check error fix (patch from Sergey)
  763. Revision 1.19 2002/07/07 09:52:32 florian
  764. * powerpc target fixed, very simple units can be compiled
  765. * some basic stuff for better callparanode handling, far from being finished
  766. Revision 1.18 2002/07/01 18:46:22 peter
  767. * internal linker
  768. * reorganized aasm layer
  769. Revision 1.17 2002/05/18 13:34:07 peter
  770. * readded missing revisions
  771. Revision 1.16 2002/05/16 19:46:36 carl
  772. + defines.inc -> fpcdefs.inc to avoid conflicts if compiling by hand
  773. + try to fix temp allocation (still in ifdef)
  774. + generic constructor calls
  775. + start of tassembler / tmodulebase class cleanup
  776. Revision 1.14 2002/04/12 17:16:35 carl
  777. + more documentation of basic unit
  778. }