scandir.inc 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783
  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 (cs_support_macro in aktmoduleswitches) 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_moduleswitch(t:tdirectivetoken);
  426. var
  427. sw : tmoduleswitch;
  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. aktmoduleswitches:=aktmoduleswitches-[sw]
  439. else
  440. aktmoduleswitches:=aktmoduleswitches+[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(name+ext,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^.path^+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') or (hs='DEFAULT') 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. 16 : aktpackrecords:=16;
  520. else
  521. Message(scan_w_only_pack_records);
  522. end;
  523. end;
  524. end;
  525. procedure dir_wait(t:tdirectivetoken);
  526. begin
  527. Message(scan_i_press_enter);
  528. readln;
  529. end;
  530. procedure dir_asmmode(t:tdirectivetoken);
  531. var
  532. s : string;
  533. begin
  534. current_scanner^.skipspace;
  535. s:=current_scanner^.readid;
  536. if s='DEFAULT' then
  537. aktasmmode:=initasmmode
  538. else
  539. if not set_string_asmmode(s,aktasmmode) then
  540. Message1(scan_w_unsupported_asmmode_specifier,s);
  541. end;
  542. procedure dir_oldasmmode(t:tdirectivetoken);
  543. begin
  544. {$ifdef i386}
  545. case t of
  546. _DIR_I386_ATT : aktasmmode:=I386_ATT;
  547. _DIR_I386_DIRECT : aktasmmode:=I386_DIRECT;
  548. _DIR_I386_INTEL : aktasmmode:=I386_INTEL;
  549. end;
  550. {$endif}
  551. end;
  552. procedure dir_delphiswitch(t:tdirectivetoken);
  553. var
  554. sw : char;
  555. begin
  556. case t of
  557. _DIR_ALIGN : sw:='A';
  558. _DIR_IOCHECKS : sw:='I';
  559. else
  560. exit;
  561. end;
  562. { c contains the next char, a + or - would be fine }
  563. HandleSwitch(sw,c);
  564. end;
  565. type
  566. tdirectiveproc=procedure(t:tdirectivetoken);
  567. const
  568. directiveproc:array[tdirectivetoken] of tdirectiveproc=(
  569. {_DIR_NONE} nil,
  570. {_DIR_ALIGN} dir_delphiswitch,
  571. {_DIR_ASMMODE} dir_asmmode,
  572. {_DIR_D} dir_description,
  573. {_DIR_DEFINE} dir_define,
  574. {_DIR_DESCRIPTION} dir_description,
  575. {_DIR_ELSE} dir_conditional,
  576. {_DIR_ENDIF} dir_conditional,
  577. {_DIR_ERROR} dir_message,
  578. {_DIR_FATAL} dir_message,
  579. {_DIR_I} dir_include,
  580. {_DIR_I386_ATT} dir_oldasmmode,
  581. {_DIR_I386_DIRECT} dir_oldasmmode,
  582. {_DIR_I386_INTEL} dir_oldasmmode,
  583. {_DIR_IOCHECKS} dir_delphiswitch,
  584. {_DIR_IF} dir_conditional,
  585. {_DIR_IFDEF} dir_conditional,
  586. {_DIR_IFNDEF} dir_conditional,
  587. {_DIR_IFOPT} dir_conditional,
  588. {_DIR_INFO} dir_message,
  589. {_DIR_L} dir_linkobject,
  590. {_DIR_LINKLIB} dir_linklib,
  591. {_DIR_MESSAGE} dir_message,
  592. {_DIR_MMX} dir_moduleswitch,
  593. {_DIR_NOTE} dir_message,
  594. {_DIR_OUTPUT_FORMAT} dir_outputformat,
  595. {_DIR_PACKRECORDS} dir_packrecords,
  596. {_DIR_SATURATION} dir_moduleswitch,
  597. {_DIR_SMARTLINK} dir_moduleswitch,
  598. {_DIR_STOP} dir_message,
  599. {_DIR_UNDEF} dir_undef,
  600. {_DIR_WAIT} dir_wait,
  601. {_DIR_WARNING} dir_message
  602. );
  603. {-------------------------------------------
  604. Main switches handling
  605. -------------------------------------------}
  606. procedure handledirectives;
  607. var
  608. t : tdirectivetoken;
  609. p : tdirectiveproc;
  610. hs : string;
  611. begin
  612. current_scanner^.gettokenpos;
  613. current_scanner^.readchar; {Remove the $}
  614. hs:=current_scanner^.readid;
  615. Message1(scan_d_handling_switch,'$'+hs);
  616. if hs='' then
  617. Message1(scan_w_illegal_switch,'$'+hs);
  618. { Check for compiler switches }
  619. while (length(hs)=1) and (c in ['-','+']) do
  620. begin
  621. HandleSwitch(hs[1],c);
  622. current_scanner^.readchar; {Remove + or -}
  623. if c=',' then
  624. begin
  625. current_scanner^.readchar; {Remove , }
  626. hs:=current_scanner^.readid; {Check for multiple switches on one line}
  627. Message1(scan_d_handling_switch,'$'+hs);
  628. end
  629. else
  630. hs:='';
  631. end;
  632. { directives may follow switches after a , }
  633. if hs<>'' then
  634. begin
  635. t:=Get_Directive(hs);
  636. if t<>_DIR_NONE then
  637. begin
  638. p:=directiveproc[t];
  639. {$ifdef FPC}
  640. if assigned(p) then
  641. {$else}
  642. if @p<>nil then
  643. {$endif}
  644. p(t);
  645. end
  646. else
  647. Message1(scan_w_illegal_directive,'$'+hs);
  648. { conditionals already read the comment }
  649. if (current_scanner^.comment_level>0) then
  650. current_scanner^.readcomment;
  651. end;
  652. end;
  653. {
  654. $Log$
  655. Revision 1.18 1998-08-10 14:50:25 peter
  656. + localswitches, moduleswitches, globalswitches splitting
  657. Revision 1.17 1998/08/10 09:56:04 peter
  658. * path to the include file is also written to the debug output
  659. Revision 1.16 1998/08/04 22:03:44 michael
  660. + fixed dir_include search() call
  661. Revision 1.15 1998/07/14 21:46:55 peter
  662. * updated messages file
  663. Revision 1.14 1998/07/14 14:47:03 peter
  664. * released NEWINPUT
  665. Revision 1.13 1998/07/07 12:32:54 peter
  666. * status.currentsource is now calculated in verbose (more accurated)
  667. Revision 1.12 1998/07/07 11:20:10 peter
  668. + NEWINPUT for a better inputfile and scanner object
  669. Revision 1.11 1998/06/04 23:51:59 peter
  670. * m68k compiles
  671. + .def file creation moved to gendef.pas so it could also be used
  672. for win32
  673. Revision 1.10 1998/05/30 14:31:10 peter
  674. + $ASMMODE
  675. Revision 1.9 1998/05/23 01:21:28 peter
  676. + aktasmmode, aktoptprocessor, aktoutputformat
  677. + smartlink per module $SMARTLINK-/+ (like MMX) and moved to aktswitches
  678. + $LIBNAME to set the library name where the unit will be put in
  679. * splitted cgi386 a bit (codeseg to large for bp7)
  680. * nasm, tasm works again. nasm moved to ag386nsm.pas
  681. Revision 1.8 1998/05/11 13:07:57 peter
  682. + $ifdef NEWPPU for the new ppuformat
  683. + $define GDB not longer required
  684. * removed all warnings and stripped some log comments
  685. * no findfirst/findnext anymore to remove smartlink *.o files
  686. Revision 1.7 1998/05/08 09:21:20 michael
  687. * Added missing -Fl message to messages file.
  688. * Corrected mangling of file names when doing Linklib
  689. * -Fl now actually WORKS.
  690. * Librarysearchpath is now a field in linker object.
  691. Revision 1.6 1998/05/04 17:54:28 peter
  692. + smartlinking works (only case jumptable left todo)
  693. * redesign of systems.pas to support assemblers and linkers
  694. + Unitname is now also in the PPU-file, increased version to 14
  695. Revision 1.5 1998/04/30 15:59:42 pierre
  696. * GDB works again better :
  697. correct type info in one pass
  698. + UseTokenInfo for better source position
  699. * fixed one remaining bug in scanner for line counts
  700. * several little fixes
  701. Revision 1.4 1998/04/29 13:42:27 peter
  702. + $IOCHECKS and $ALIGN to test already, other will follow soon
  703. * fixed the wrong linecounting with comments
  704. Revision 1.3 1998/04/28 11:45:53 florian
  705. * make it compilable with TP
  706. + small COM problems solved to compile classes.pp
  707. Revision 1.2 1998/04/28 10:09:54 pierre
  708. * typo error in asm style reading corrected
  709. Revision 1.1 1998/04/27 23:13:53 peter
  710. + the new files for the scanner
  711. }