switches.pas 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244
  1. {
  2. $Id$
  3. Copyright (c) 1998 by Peter Vreman
  4. This unit implements the parsing of the switches like $I-
  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. unit switches;
  19. interface
  20. procedure HandleSwitch(switch,state:char);
  21. function CheckSwitch(switch,state:char):boolean;
  22. implementation
  23. uses
  24. globtype,systems,
  25. globals,verbose,files;
  26. {****************************************************************************
  27. Main Switches Parsing
  28. ****************************************************************************}
  29. type
  30. TSwitchType=(ignoredsw,localsw,modulesw,globalsw,illegalsw,unsupportedsw);
  31. SwitchRec=record
  32. typesw : TSwitchType;
  33. setsw : byte;
  34. end;
  35. const
  36. SwitchTable:array['A'..'Z'] of SwitchRec=(
  37. {A} (typesw:unsupportedsw; setsw:ord(cs_localnone)),
  38. {B} (typesw:unsupportedsw; setsw:ord(cs_localnone)),
  39. {C} (typesw:localsw; setsw:ord(cs_do_assertion)),
  40. {D} (typesw:modulesw; setsw:ord(cs_debuginfo)),
  41. {E} (typesw:globalsw; setsw:ord(cs_fp_emulation)),
  42. {F} (typesw:ignoredsw; setsw:ord(cs_localnone)),
  43. {G} (typesw:ignoredsw; setsw:ord(cs_localnone)),
  44. {H} (typesw:localsw; setsw:ord(cs_ansistrings)),
  45. {I} (typesw:localsw; setsw:ord(cs_check_io)),
  46. {J} (typesw:illegalsw; setsw:ord(cs_localnone)),
  47. {K} (typesw:unsupportedsw; setsw:ord(cs_localnone)),
  48. {L} (typesw:modulesw; setsw:ord(cs_local_browser)),
  49. {M} (typesw:localsw; setsw:ord(cs_generate_rtti)),
  50. {N} (typesw:unsupportedsw; setsw:ord(cs_localnone)),
  51. {O} (typesw:unsupportedsw; setsw:ord(cs_localnone)),
  52. {P} (typesw:modulesw; setsw:ord(cs_openstring)),
  53. {Q} (typesw:localsw; setsw:ord(cs_check_overflow)),
  54. {R} (typesw:localsw; setsw:ord(cs_check_range)),
  55. {S} (typesw:localsw; setsw:ord(cs_check_stack)),
  56. {T} (typesw:localsw; setsw:ord(cs_typed_addresses)),
  57. {U} (typesw:illegalsw; setsw:ord(cs_localnone)),
  58. {V} (typesw:localsw; setsw:ord(cs_strict_var_strings)),
  59. {W} (typesw:unsupportedsw; setsw:ord(cs_localnone)),
  60. {X} (typesw:modulesw; setsw:ord(cs_extsyntax)),
  61. {Y} (typesw:modulesw; setsw:ord(cs_browser)),
  62. {Z} (typesw:illegalsw; setsw:ord(cs_localnone))
  63. );
  64. procedure HandleSwitch(switch,state:char);
  65. begin
  66. switch:=upcase(switch);
  67. { Is the Switch in the letters ? }
  68. if not ((switch in ['A'..'Z']) and (state in ['-','+'])) then
  69. begin
  70. Message(scan_w_illegal_switch);
  71. exit;
  72. end;
  73. { Handle the switch }
  74. with SwitchTable[switch] do
  75. begin
  76. case typesw of
  77. ignoredsw : Message1(scan_n_ignored_switch,'$'+switch);
  78. illegalsw : Message1(scan_w_illegal_switch,'$'+switch);
  79. unsupportedsw : Message1(scan_w_unsupported_switch,'$'+switch);
  80. localsw : begin
  81. if state='+' then
  82. aktlocalswitches:=aktlocalswitches+[tlocalswitch(setsw)]
  83. else
  84. aktlocalswitches:=aktlocalswitches-[tlocalswitch(setsw)];
  85. { Message for linux which has global checking only }
  86. if (switch='S') and (
  87. {$ifdef i386}
  88. (target_info.target = target_i386_linux)
  89. {$ifdef m68k}
  90. or
  91. {$endif m68k}
  92. {$endif i386}
  93. {$ifdef m68k}
  94. (target_info.target = target_m68k_linux)
  95. {$endif m68k}
  96. ) then
  97. Message(scan_n_stack_check_global_under_linux);
  98. end;
  99. modulesw : begin
  100. if current_module^.in_global then
  101. begin
  102. if state='+' then
  103. aktmoduleswitches:=aktmoduleswitches+[tmoduleswitch(setsw)]
  104. else
  105. aktmoduleswitches:=aktmoduleswitches-[tmoduleswitch(setsw)];
  106. end
  107. else
  108. Message(scan_w_switch_is_global);
  109. end;
  110. globalsw : begin
  111. if current_module^.in_global and (current_module=main_module) then
  112. begin
  113. if state='+' then
  114. aktglobalswitches:=aktglobalswitches+[tglobalswitch(setsw)]
  115. else
  116. aktglobalswitches:=aktglobalswitches-[tglobalswitch(setsw)];
  117. end
  118. else
  119. Message(scan_w_switch_is_global);
  120. end;
  121. end;
  122. end;
  123. end;
  124. function CheckSwitch(switch,state:char):boolean;
  125. var
  126. found : boolean;
  127. begin
  128. switch:=upcase(switch);
  129. { Is the Switch in the letters ? }
  130. if not ((switch in ['A'..'Z']) and (state in ['-','+'])) then
  131. begin
  132. Message(scan_w_illegal_switch);
  133. CheckSwitch:=false;
  134. exit;
  135. end;
  136. { Check the switch }
  137. with SwitchTable[switch] do
  138. begin
  139. case typesw of
  140. localsw : found:=(tlocalswitch(setsw) in aktlocalswitches);
  141. modulesw : found:=(tmoduleswitch(setsw) in aktmoduleswitches);
  142. globalsw : found:=(tglobalswitch(setsw) in aktglobalswitches);
  143. else
  144. found:=false;
  145. end;
  146. if state='-' then
  147. found:=not found;
  148. CheckSwitch:=found;
  149. end;
  150. end;
  151. end.
  152. {
  153. $Log$
  154. Revision 1.18 1998-12-11 00:03:47 peter
  155. + globtype,tokens,version unit splitted from globals
  156. Revision 1.17 1998/11/27 14:50:46 peter
  157. + open strings, $P switch support
  158. Revision 1.16 1998/10/13 16:50:22 pierre
  159. * undid some changes of Peter that made the compiler wrong
  160. for m68k (I had to reinsert some ifdefs)
  161. * removed several memory leaks under m68k
  162. * removed the meory leaks for assembler readers
  163. * cross compiling shoud work again better
  164. ( crosscompiling sysamiga works
  165. but as68k still complain about some code !)
  166. Revision 1.15 1998/10/13 13:10:29 peter
  167. * new style for m68k/i386 infos and enums
  168. Revision 1.14 1998/10/13 08:19:41 pierre
  169. + source_os is now set correctly for cross-processor compilers
  170. (tos contains all target_infos and
  171. we use CPU86 and CPU68 conditionnals to
  172. get the source operating system
  173. this only works if you do not undefine
  174. the source target !!)
  175. * several cg68k memory leaks fixed
  176. + started to change the code so that it should be possible to have
  177. a complete compiler (both for m68k and i386 !!)
  178. Revision 1.13 1998/09/22 17:13:52 pierre
  179. + browsing updated and developed
  180. records and objects fields are also stored
  181. Revision 1.12 1998/09/01 12:52:05 peter
  182. + a lot of delphi switches
  183. Revision 1.11 1998/08/18 20:52:21 peter
  184. * renamed in_main to in_global which is more logical
  185. Revision 1.10 1998/08/14 18:14:57 peter
  186. * forgot to check the target for linux for $S switch message
  187. Revision 1.9 1998/08/10 15:47:08 peter
  188. * reinstantited stackcheck note for linux
  189. Revision 1.8 1998/08/10 14:50:27 peter
  190. + localswitches, moduleswitches, globalswitches splitting
  191. Revision 1.7 1998/07/24 22:17:00 florian
  192. * internal error 10 together with array access fixed. I hope
  193. that's the final fix.
  194. Revision 1.6 1998/07/18 17:11:13 florian
  195. + ansi string constants fixed
  196. + switch $H partial implemented
  197. Revision 1.5 1998/06/04 23:52:00 peter
  198. * m68k compiles
  199. + .def file creation moved to gendef.pas so it could also be used
  200. for win32
  201. Revision 1.4 1998/05/21 19:33:36 peter
  202. + better procedure directive handling and only one table
  203. Revision 1.3 1998/05/01 07:43:56 florian
  204. + basics for rtti implemented
  205. + switch $m (generate rtti for published sections)
  206. Revision 1.2 1998/04/28 11:45:53 florian
  207. * make it compilable with TP
  208. + small COM problems solved to compile classes.pp
  209. Revision 1.1 1998/04/27 23:13:53 peter
  210. + the new files for the scanner
  211. }