scandir.inc 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770
  1. {
  2. $Id$
  3. Copyright (c) 1998 by Peter Vreman
  4. This unit implements directive parsing for the scanner
  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 by
  7. 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. const
  19. directivelen=16;
  20. type
  21. directivestr=string[directivelen];
  22. tdirectivetoken=(
  23. _DIR_NONE,
  24. _DIR_ALIGN,_DIR_ASMMODE,
  25. _DIR_D,_DIR_DEFINE,_DIR_DESCRIPTION,
  26. _DIR_ELSE,_DIR_ENDIF,_DIR_ERROR,
  27. _DIR_FATAL,
  28. _DIR_I,_DIR_I386_ATT,_DIR_I386_DIRECT,_DIR_I386_INTEL,_DIR_IOCHECKS,
  29. _DIR_IF,_DIR_IFDEF,_DIR_IFNDEF,_DIR_IFOPT,_DIR_INFO,
  30. _DIR_L,_DIR_LINKLIB,
  31. _DIR_MESSAGE,_DIR_MMX,
  32. _DIR_NOTE,
  33. _DIR_OUTPUT_FORMAT,
  34. _DIR_PACKRECORDS,
  35. _DIR_SATURATION,_DIR_SMARTLINK,_DIR_STOP,
  36. _DIR_UNDEF,
  37. _DIR_WAIT,_DIR_WARNING
  38. );
  39. const
  40. firstdirective=_DIR_NONE;
  41. lastdirective=_DIR_WARNING;
  42. directive:array[tdirectivetoken] of directivestr=(
  43. '',
  44. 'ALIGN','ASMMODE',
  45. 'D','DEFINE','DESCRIPTION',
  46. 'ELSE','ENDIF','ERROR',
  47. 'FATAL',
  48. 'I','I386_ATT','I386_DIRECT','I386_INTEL','IOCHECKS',
  49. 'IF','IFDEF','IFNDEF','IFOPT','INFO',
  50. 'L','LINKLIB',
  51. 'MESSAGE','MMX',
  52. 'NOTE',
  53. 'OUTPUT_FORMAT',
  54. 'PACKRECORDS',
  55. 'SATURATION','SMARTLINK','STOP',
  56. 'UNDEF',
  57. 'WAIT','WARNING'
  58. );
  59. function Get_Directive(const hs:string):tdirectivetoken;
  60. var
  61. i : tdirectivetoken;
  62. begin
  63. for i:=firstdirective to lastdirective do
  64. if directive[i]=hs then
  65. begin
  66. Get_Directive:=i;
  67. exit;
  68. end;
  69. Get_Directive:=_DIR_NONE;
  70. end;
  71. {-------------------------------------------
  72. IF Conditional Handling
  73. -------------------------------------------}
  74. var
  75. preprocpat : string;
  76. preproc_token : ttoken;
  77. procedure preproc_consume(t : ttoken);
  78. begin
  79. if t<>preproc_token then
  80. Message(scan_e_preproc_syntax_error);
  81. preproc_token:=current_scanner^.readpreproc;
  82. end;
  83. function read_expr : string;forward;
  84. function read_factor : string;
  85. var
  86. hs : string;
  87. mac : pmacrosym;
  88. len : byte;
  89. begin
  90. if preproc_token=ID then
  91. begin
  92. if preprocpat='NOT' then
  93. begin
  94. preproc_consume(ID);
  95. hs:=read_expr;
  96. if hs='0' then
  97. read_factor:='1'
  98. else
  99. read_factor:='0';
  100. end
  101. else
  102. begin
  103. mac:=pmacrosym(macros^.search(hs));
  104. hs:=preprocpat;
  105. preproc_consume(ID);
  106. if assigned(mac) then
  107. begin
  108. if mac^.defined and assigned(mac^.buftext) then
  109. begin
  110. if mac^.buflen>255 then
  111. begin
  112. len:=255;
  113. Message(scan_w_marco_cut_after_255_chars);
  114. end
  115. else
  116. len:=mac^.buflen;
  117. hs[0]:=char(len);
  118. move(mac^.buftext^,hs[1],len);
  119. end
  120. else
  121. read_factor:='';
  122. end
  123. else
  124. read_factor:=hs;
  125. end
  126. end
  127. else if preproc_token=LKLAMMER then
  128. begin
  129. preproc_consume(LKLAMMER);
  130. read_factor:=read_expr;
  131. preproc_consume(RKLAMMER);
  132. end
  133. else
  134. Message(scan_e_error_in_preproc_expr);
  135. end;
  136. function read_term : string;
  137. var
  138. hs1,hs2 : string;
  139. begin
  140. hs1:=read_factor;
  141. while true do
  142. begin
  143. if (preproc_token=ID) then
  144. begin
  145. if preprocpat='AND' then
  146. begin
  147. preproc_consume(ID);
  148. hs2:=read_factor;
  149. if (hs1<>'0') and (hs2<>'0') then
  150. hs1:='1';
  151. end
  152. else
  153. break;
  154. end
  155. else
  156. break;
  157. end;
  158. read_term:=hs1;
  159. end;
  160. function read_simple_expr : string;
  161. var
  162. hs1,hs2 : string;
  163. begin
  164. hs1:=read_term;
  165. while true do
  166. begin
  167. if (preproc_token=ID) then
  168. begin
  169. if preprocpat='OR' then
  170. begin
  171. preproc_consume(ID);
  172. hs2:=read_term;
  173. if (hs1<>'0') or (hs2<>'0') then
  174. hs1:='1';
  175. end
  176. else
  177. break;
  178. end
  179. else
  180. break;
  181. end;
  182. read_simple_expr:=hs1;
  183. end;
  184. function read_expr : string;
  185. var
  186. hs1,hs2 : string;
  187. b : boolean;
  188. t : ttoken;
  189. w : word;
  190. l1,l2 : longint;
  191. begin
  192. hs1:=read_simple_expr;
  193. t:=preproc_token;
  194. if not(t in [EQUAL,UNEQUAL,LT,GT,LTE,GTE]) then
  195. begin
  196. read_expr:=hs1;
  197. exit;
  198. end;
  199. preproc_consume(t);
  200. hs2:=read_simple_expr;
  201. if is_number(hs1) and is_number(hs2) then
  202. begin
  203. valint(hs1,l1,w);
  204. valint(hs2,l2,w);
  205. case t of
  206. EQUAL:
  207. b:=l1=l2;
  208. UNEQUAL:
  209. b:=l1<>l2;
  210. LT:
  211. b:=l1<l2;
  212. GT:
  213. b:=l1>l2;
  214. GTE:
  215. b:=l1>=l2;
  216. LTE:
  217. b:=l1<=l2;
  218. end;
  219. end
  220. else
  221. begin
  222. case t of
  223. EQUAL:
  224. b:=hs1=hs2;
  225. UNEQUAL:
  226. b:=hs1<>hs2;
  227. LT:
  228. b:=hs1<hs2;
  229. GT:
  230. b:=hs1>hs2;
  231. GTE:
  232. b:=hs1>=hs2;
  233. LTE:
  234. b:=hs1<=hs2;
  235. end;
  236. end;
  237. if b then
  238. read_expr:='1'
  239. else
  240. read_expr:='0';
  241. end;
  242. {-------------------------------------------
  243. Directives
  244. -------------------------------------------}
  245. function is_conditional(t:tdirectivetoken):boolean;
  246. begin
  247. is_conditional:=(t in [_DIR_ENDIF,_DIR_IFDEF,_DIR_IFNDEF,_DIR_IFOPT,_DIR_IF,_DIR_ELSE]);
  248. end;
  249. procedure dir_conditional(t:tdirectivetoken);
  250. var
  251. hs : string;
  252. mac : pmacrosym;
  253. found : boolean;
  254. begin
  255. while true do
  256. begin
  257. case t of
  258. _DIR_ENDIF : begin
  259. current_scanner^.poppreprocstack;
  260. end;
  261. _DIR_ELSE : begin
  262. current_scanner^.elsepreprocstack;
  263. end;
  264. _DIR_IFDEF : begin
  265. current_scanner^.skipspace;
  266. hs:=current_scanner^.readid;
  267. mac:=pmacrosym(macros^.search(hs));
  268. current_scanner^.addpreprocstack(assigned(mac) and mac^.defined,hs,scan_c_ifdef_found);
  269. end;
  270. _DIR_IFOPT : begin
  271. current_scanner^.skipspace;
  272. hs:=current_scanner^.readid;
  273. if (length(hs)=1) and (c in ['-','+']) then
  274. begin
  275. found:=CheckSwitch(hs[1],c);
  276. current_scanner^.readchar; {read + or -}
  277. end
  278. else
  279. Message(scan_w_illegal_switch);
  280. current_scanner^.addpreprocstack(found,hs,scan_c_ifopt_found);
  281. end;
  282. _DIR_IF : begin
  283. current_scanner^.skipspace;
  284. { start preproc expression scanner }
  285. preproc_token:=current_scanner^.readpreproc;
  286. hs:=read_expr;
  287. current_scanner^.addpreprocstack(hs<>'0',hs,scan_c_if_found);
  288. end;
  289. _DIR_IFNDEF : begin
  290. current_scanner^.skipspace;
  291. hs:=current_scanner^.readid;
  292. mac:=pmacrosym(macros^.search(hs));
  293. current_scanner^.addpreprocstack(not(assigned(mac) and mac^.defined),hs,scan_c_ifndef_found);
  294. end;
  295. end;
  296. { accept the text ? }
  297. if (current_scanner^.preprocstack=nil) or current_scanner^.preprocstack^.accept then
  298. break
  299. else
  300. begin
  301. Message(scan_c_skipping_until);
  302. repeat
  303. current_scanner^.skipuntildirective;
  304. t:=Get_Directive(current_scanner^.readid);
  305. until is_conditional(t);
  306. Message1(scan_d_handling_switch,'$'+directive[t]);
  307. end;
  308. end;
  309. end;
  310. procedure dir_define(t:tdirectivetoken);
  311. var
  312. ht : ttoken;
  313. hs2,
  314. hs : string;
  315. mac : pmacrosym;
  316. macropos : longint;
  317. macrobuffer : pmacrobuffer;
  318. begin
  319. current_scanner^.skipspace;
  320. hs:=current_scanner^.readid;
  321. mac:=pmacrosym(macros^.search(hs));
  322. if not assigned(mac) then
  323. begin
  324. mac:=new(pmacrosym,init(hs));
  325. mac^.defined:=true;
  326. Message1(parser_m_macro_defined,mac^.name);
  327. macros^.insert(mac);
  328. end
  329. else
  330. begin
  331. Message1(parser_m_macro_defined,mac^.name);
  332. mac^.defined:=true;
  333. { delete old definition }
  334. if assigned(mac^.buftext) then
  335. begin
  336. freemem(mac^.buftext,mac^.buflen);
  337. mac^.buftext:=nil;
  338. end;
  339. end;
  340. if support_macros then
  341. begin
  342. { key words are never substituted }
  343. hs2:=pattern;
  344. pattern:=hs;
  345. if is_keyword(ht) then
  346. Message(scan_e_keyword_cant_be_a_macro);
  347. pattern:=hs2;
  348. { !!!!!! handle macro params, need we this? }
  349. current_scanner^.skipspace;
  350. { may be a macro? }
  351. if c=':' then
  352. begin
  353. current_scanner^.readchar;
  354. if c='=' then
  355. begin
  356. new(macrobuffer);
  357. macropos:=0;
  358. { first char }
  359. current_scanner^.readchar;
  360. while (c<>'}') do
  361. begin
  362. macrobuffer^[macropos]:=c;
  363. current_scanner^.readchar;
  364. if c=#26 then Message(scan_f_end_of_file);
  365. inc(macropos);
  366. if macropos>maxmacrolen then
  367. Message(scan_f_macro_buffer_overflow);
  368. end;
  369. { free buffer of macro ?}
  370. if assigned(mac^.buftext) then
  371. freemem(mac^.buftext,mac^.buflen);
  372. { get new mem }
  373. getmem(mac^.buftext,macropos);
  374. mac^.buflen:=macropos;
  375. { copy the text }
  376. move(macrobuffer^,mac^.buftext^,macropos);
  377. dispose(macrobuffer);
  378. end;
  379. end;
  380. end;
  381. end;
  382. procedure dir_undef(t:tdirectivetoken);
  383. var
  384. hs : string;
  385. mac : pmacrosym;
  386. begin
  387. current_scanner^.skipspace;
  388. hs:=current_scanner^.readid;
  389. mac:=pmacrosym(macros^.search(hs));
  390. if not assigned(mac) then
  391. begin
  392. mac:=new(pmacrosym,init(hs));
  393. Message1(parser_m_macro_undefined,mac^.name);
  394. mac^.defined:=false;
  395. macros^.insert(mac);
  396. end
  397. else
  398. begin
  399. Message1(parser_m_macro_undefined,mac^.name);
  400. mac^.defined:=false;
  401. { delete old definition }
  402. if assigned(mac^.buftext) then
  403. begin
  404. freemem(mac^.buftext,mac^.buflen);
  405. mac^.buftext:=nil;
  406. end;
  407. end;
  408. end;
  409. procedure dir_message(t:tdirectivetoken);
  410. var
  411. w : tmsgconst;
  412. begin
  413. case t of
  414. _DIR_STOP,
  415. _DIR_FATAL : w:=scan_f_user_defined;
  416. _DIR_ERROR : w:=scan_e_user_defined;
  417. _DIR_WARNING : w:=scan_w_user_defined;
  418. _DIR_NOTE : w:=scan_n_user_defined;
  419. _DIR_MESSAGE,
  420. _DIR_INFO : w:=scan_i_user_defined;
  421. end;
  422. current_scanner^.skipspace;
  423. Message1(w,current_scanner^.readcomment);
  424. end;
  425. procedure dir_switch(t:tdirectivetoken);
  426. var
  427. sw : tcswitch;
  428. begin
  429. case t of
  430. {$ifdef SUPPORT_MMX}
  431. _DIR_MMX : sw:=cs_mmx;
  432. _DIR_SATURATION : sw:=cs_mmx_saturation;
  433. {$endif}
  434. _DIR_SMARTLINK : sw:=cs_smartlink;
  435. end;
  436. current_scanner^.skipspace;
  437. if c='-' then
  438. aktswitches:=aktswitches-[sw]
  439. else
  440. aktswitches:=aktswitches+[sw];
  441. end;
  442. procedure dir_include(t:tdirectivetoken);
  443. var
  444. hs : string;
  445. path : dirstr;
  446. name : namestr;
  447. ext : extstr;
  448. hp : pinputfile;
  449. found : boolean;
  450. begin
  451. current_scanner^.skipspace;
  452. hs:=current_scanner^.readcomment;
  453. while (hs<>'') and (hs[length(hs)]=' ') do
  454. dec(byte(hs[0]));
  455. hs:=FixFileName(hs);
  456. fsplit(hs,path,name,ext);
  457. { first look in the path of _d then currentmodule }
  458. path:=search(hs,path+';'+current_scanner^.inputfile^.path^+';'+includesearchpath,found);
  459. { shutdown current file }
  460. current_scanner^.close;
  461. { load new file }
  462. hp:=new(pinputfile,init(path+name+ext));
  463. current_scanner^.addfile(hp);
  464. if not current_scanner^.open then
  465. Message1(scan_f_cannot_open_includefile,hs);
  466. Message1(scan_u_start_include_file,current_scanner^.inputfile^.name^);
  467. current_scanner^.reload;
  468. { register for refs }
  469. current_module^.sourcefiles.register_file(hp);
  470. current_module^.current_index:=hp^.ref_index;
  471. end;
  472. procedure dir_description(t:tdirectivetoken);
  473. begin
  474. end;
  475. procedure dir_linkobject(t:tdirectivetoken);
  476. begin
  477. current_scanner^.skipspace;
  478. current_scanner^.readstring;
  479. current_module^.linkofiles.insert(FixFileName(orgpattern));
  480. end;
  481. procedure dir_linklib(t:tdirectivetoken);
  482. begin
  483. current_scanner^.skipspace;
  484. current_scanner^.readstring;
  485. current_module^.linkSharedLibs.insert(orgpattern);
  486. end;
  487. procedure dir_outputformat(t:tdirectivetoken);
  488. begin
  489. if not current_module^.in_main then
  490. Message(scan_w_switch_is_global)
  491. else
  492. begin
  493. current_scanner^.skipspace;
  494. if set_string_asm(current_scanner^.readid) then
  495. aktoutputformat:=target_asm.id
  496. else
  497. Message(scan_w_illegal_switch);
  498. end;
  499. end;
  500. procedure dir_packrecords(t:tdirectivetoken);
  501. var
  502. hs : string;
  503. begin
  504. current_scanner^.skipspace;
  505. if upcase(c)='N' then
  506. begin
  507. hs:=current_scanner^.readid;
  508. if hs='NORMAL' then
  509. aktpackrecords:=2
  510. else
  511. Message(scan_w_only_pack_records);
  512. end
  513. else
  514. begin
  515. case current_scanner^.readval of
  516. 1 : aktpackrecords:=1;
  517. 2 : aktpackrecords:=2;
  518. 4 : aktpackrecords:=4;
  519. else
  520. Message(scan_w_only_pack_records);
  521. end;
  522. end;
  523. end;
  524. procedure dir_wait(t:tdirectivetoken);
  525. begin
  526. Message(scan_i_press_enter);
  527. readln;
  528. end;
  529. procedure dir_asmmode(t:tdirectivetoken);
  530. var
  531. s : string;
  532. begin
  533. current_scanner^.skipspace;
  534. s:=current_scanner^.readid;
  535. if s='DEFAULT' then
  536. aktasmmode:=initasmmode
  537. else
  538. if not set_string_asmmode(s,aktasmmode) then
  539. Comment(V_Warning,'Unsupported asm mode specified '+s);
  540. end;
  541. procedure dir_oldasmmode(t:tdirectivetoken);
  542. begin
  543. {$ifdef i386}
  544. case t of
  545. _DIR_I386_ATT : aktasmmode:=I386_ATT;
  546. _DIR_I386_DIRECT : aktasmmode:=I386_DIRECT;
  547. _DIR_I386_INTEL : aktasmmode:=I386_INTEL;
  548. end;
  549. {$endif}
  550. end;
  551. procedure dir_delphiswitch(t:tdirectivetoken);
  552. var
  553. sw : char;
  554. begin
  555. case t of
  556. _DIR_ALIGN : sw:='A';
  557. _DIR_IOCHECKS : sw:='I';
  558. else
  559. exit;
  560. end;
  561. { c contains the next char, a + or - would be fine }
  562. HandleSwitch(sw,c);
  563. end;
  564. type
  565. tdirectiveproc=procedure(t:tdirectivetoken);
  566. const
  567. directiveproc:array[tdirectivetoken] of tdirectiveproc=(
  568. {_DIR_NONE} nil,
  569. {_DIR_ALIGN} dir_delphiswitch,
  570. {_DIR_ASMMODE} dir_asmmode,
  571. {_DIR_D} dir_description,
  572. {_DIR_DEFINE} dir_define,
  573. {_DIR_DESCRIPTION} dir_description,
  574. {_DIR_ELSE} dir_conditional,
  575. {_DIR_ENDIF} dir_conditional,
  576. {_DIR_ERROR} dir_message,
  577. {_DIR_FATAL} dir_message,
  578. {_DIR_I} dir_include,
  579. {_DIR_I386_ATT} dir_oldasmmode,
  580. {_DIR_I386_DIRECT} dir_oldasmmode,
  581. {_DIR_I386_INTEL} dir_oldasmmode,
  582. {_DIR_IOCHECKS} dir_delphiswitch,
  583. {_DIR_IF} dir_conditional,
  584. {_DIR_IFDEF} dir_conditional,
  585. {_DIR_IFNDEF} dir_conditional,
  586. {_DIR_IFOPT} dir_conditional,
  587. {_DIR_INFO} dir_message,
  588. {_DIR_L} dir_linkobject,
  589. {_DIR_LINKLIB} dir_linklib,
  590. {_DIR_MESSAGE} dir_message,
  591. {_DIR_MMX} dir_switch,
  592. {_DIR_NOTE} dir_message,
  593. {_DIR_OUTPUT_FORMAT} dir_outputformat,
  594. {_DIR_PACKRECORDS} dir_packrecords,
  595. {_DIR_SATURATION} dir_switch,
  596. {_DIR_SMARTLINK} dir_switch,
  597. {_DIR_STOP} dir_message,
  598. {_DIR_UNDEF} dir_undef,
  599. {_DIR_WAIT} dir_wait,
  600. {_DIR_WARNING} dir_message
  601. );
  602. {-------------------------------------------
  603. Main switches handling
  604. -------------------------------------------}
  605. procedure handledirectives;
  606. var
  607. t : tdirectivetoken;
  608. p : tdirectiveproc;
  609. hs : string;
  610. begin
  611. current_scanner^.gettokenpos;
  612. current_scanner^.readchar; {Remove the $}
  613. hs:=current_scanner^.readid;
  614. Message1(scan_d_handling_switch,'$'+hs);
  615. if hs='' then
  616. Message1(scan_w_illegal_switch,'$'+hs);
  617. { Check for compiler switches }
  618. while (length(hs)=1) and (c in ['-','+']) do
  619. begin
  620. HandleSwitch(hs[1],c);
  621. current_scanner^.readchar; {Remove + or -}
  622. if c=',' then
  623. begin
  624. current_scanner^.readchar; {Remove , }
  625. hs:=current_scanner^.readid; {Check for multiple switches on one line}
  626. Message1(scan_d_handling_switch,'$'+hs);
  627. end
  628. else
  629. hs:='';
  630. end;
  631. { directives may follow switches after a , }
  632. if hs<>'' then
  633. begin
  634. t:=Get_Directive(hs);
  635. if t<>_DIR_NONE then
  636. begin
  637. p:=directiveproc[t];
  638. {$ifdef FPC}
  639. if assigned(p) then
  640. {$else}
  641. if @p<>nil then
  642. {$endif}
  643. p(t);
  644. end
  645. else
  646. Message1(scan_w_illegal_directive,'$'+hs);
  647. { conditionals already read the comment }
  648. if (current_scanner^.comment_level>0) then
  649. current_scanner^.readcomment;
  650. end;
  651. end;
  652. {
  653. $Log$
  654. Revision 1.14 1998-07-14 14:47:03 peter
  655. * released NEWINPUT
  656. Revision 1.13 1998/07/07 12:32:54 peter
  657. * status.currentsource is now calculated in verbose (more accurated)
  658. Revision 1.12 1998/07/07 11:20:10 peter
  659. + NEWINPUT for a better inputfile and scanner object
  660. Revision 1.11 1998/06/04 23:51:59 peter
  661. * m68k compiles
  662. + .def file creation moved to gendef.pas so it could also be used
  663. for win32
  664. Revision 1.10 1998/05/30 14:31:10 peter
  665. + $ASMMODE
  666. Revision 1.9 1998/05/23 01:21:28 peter
  667. + aktasmmode, aktoptprocessor, aktoutputformat
  668. + smartlink per module $SMARTLINK-/+ (like MMX) and moved to aktswitches
  669. + $LIBNAME to set the library name where the unit will be put in
  670. * splitted cgi386 a bit (codeseg to large for bp7)
  671. * nasm, tasm works again. nasm moved to ag386nsm.pas
  672. Revision 1.8 1998/05/11 13:07:57 peter
  673. + $ifdef NEWPPU for the new ppuformat
  674. + $define GDB not longer required
  675. * removed all warnings and stripped some log comments
  676. * no findfirst/findnext anymore to remove smartlink *.o files
  677. Revision 1.7 1998/05/08 09:21:20 michael
  678. * Added missing -Fl message to messages file.
  679. * Corrected mangling of file names when doing Linklib
  680. * -Fl now actually WORKS.
  681. * Librarysearchpath is now a field in linker object.
  682. Revision 1.6 1998/05/04 17:54:28 peter
  683. + smartlinking works (only case jumptable left todo)
  684. * redesign of systems.pas to support assemblers and linkers
  685. + Unitname is now also in the PPU-file, increased version to 14
  686. Revision 1.5 1998/04/30 15:59:42 pierre
  687. * GDB works again better :
  688. correct type info in one pass
  689. + UseTokenInfo for better source position
  690. * fixed one remaining bug in scanner for line counts
  691. * several little fixes
  692. Revision 1.4 1998/04/29 13:42:27 peter
  693. + $IOCHECKS and $ALIGN to test already, other will follow soon
  694. * fixed the wrong linecounting with comments
  695. Revision 1.3 1998/04/28 11:45:53 florian
  696. * make it compilable with TP
  697. + small COM problems solved to compile classes.pp
  698. Revision 1.2 1998/04/28 10:09:54 pierre
  699. * typo error in asm style reading corrected
  700. Revision 1.1 1998/04/27 23:13:53 peter
  701. + the new files for the scanner
  702. }