From ff2c436b780d4a9855b15c1d81791a84bdff658a Mon Sep 17 00:00:00 2001 From: olle Date: Mon, 23 Feb 2004 23:38:25 +0000 Subject: [PATCH] + mode mac: added UNDEFINED construct + mode mac: added support for include $I * renamed one of the readpreproc to preproc_substitutedtoken to avoid confusement --- compiler/scanner.pas | 56 +++++++++++++++++++++++++++++++++----------- 1 file changed, 42 insertions(+), 14 deletions(-) diff --git a/compiler/scanner.pas b/compiler/scanner.pas index 654a413798..24b3ef64bf 100644 --- a/compiler/scanner.pas +++ b/compiler/scanner.pas @@ -328,14 +328,14 @@ implementation current_scanner.preproc_token:=current_scanner.readpreproc; end; - function readpreproc: string; + function preproc_substitutedtoken: string; var hs: string; mac : tmacro; len : integer; begin - readpreproc := current_scanner.preproc_pattern; - mac:=tmacro(current_scanner.macros.search(readpreproc)); + preproc_substitutedtoken := current_scanner.preproc_pattern; + mac:=tmacro(current_scanner.macros.search(preproc_substitutedtoken)); if assigned(mac) then begin if mac.defined and assigned(mac.buftext) then @@ -349,7 +349,7 @@ implementation len:=mac.buflen; hs[0]:=char(len); move(mac.buftext^,hs[1],len); - readpreproc:=upcase(hs); + preproc_substitutedtoken:=upcase(hs); end; end; end; @@ -363,7 +363,7 @@ implementation begin if current_scanner.preproc_token=_ID then begin - if readpreproc='DEFINED' then + if preproc_substitutedtoken='DEFINED' then begin preproc_consume(_ID); current_scanner.skipspace; @@ -394,7 +394,27 @@ implementation Message(scan_e_error_in_preproc_expr); end else - if readpreproc='DECLARED' then + if (m_mac in aktmodeswitches) and (preproc_substitutedtoken='UNDEFINED') then + begin + preproc_consume(_ID); + current_scanner.skipspace; + if current_scanner.preproc_token =_ID then + begin + hs := current_scanner.preproc_pattern; + mac := tmacro(current_scanner.macros.search(hs)); + if assigned(mac) then + hs := '0' + else + hs := '1'; + read_factor := hs; + preproc_consume(_ID); + current_scanner.skipspace; + end + else + Message(scan_e_error_in_preproc_expr); + end + else + if preproc_substitutedtoken='DECLARED' then begin preproc_consume(_ID); current_scanner.skipspace; @@ -424,7 +444,7 @@ implementation Message(scan_e_error_in_preproc_expr); end else - if readpreproc='NOT' then + if preproc_substitutedtoken='NOT' then begin preproc_consume(_ID); hs:=read_expr; @@ -435,7 +455,7 @@ implementation end else begin - hs:=readpreproc; + hs:=preproc_substitutedtoken; preproc_consume(_ID); read_factor:=hs; end @@ -460,7 +480,7 @@ implementation repeat if (current_scanner.preproc_token<>_ID) then break; - if readpreproc<>'AND' then + if preproc_substitutedtoken<>'AND' then break; preproc_consume(_ID); hs2:=read_expr; @@ -485,7 +505,7 @@ implementation repeat if (current_scanner.preproc_token<>_ID) then break; - if readpreproc<>'OR' then + if preproc_substitutedtoken<>'OR' then break; preproc_consume(_ID); hs2:=read_expr; @@ -673,7 +693,6 @@ implementation end else begin - Message1(parser_c_macro_defined,mac.name); mac.defined:=true; { delete old definition } if assigned(mac.buftext) then @@ -692,7 +711,7 @@ implementation current_scanner.skipspace; { may be a macro? } - //both versions with := and = are allowed + { assignment can be both := and = } if c=':' then current_scanner.readchar; @@ -702,6 +721,7 @@ implementation hs:= parse_compiler_expr; if length(hs) <> 0 then begin + Message2(parser_c_macro_set_to,mac.name,hs); { free buffer of macro ?} if assigned(mac.buftext) then freemem(mac.buftext,mac.buflen); @@ -2702,6 +2722,7 @@ exit_label: case c of 'A'..'Z', 'a'..'z', + //'$', {for hexadecimal numbers, allowed in mode mac OR} '_','0'..'9' : begin current_scanner.preproc_pattern:=readid; readpreproc:=_ID; @@ -2883,10 +2904,12 @@ exit_label: turbo_scannerdirectives:=TDictionary.Create; mac_scannerdirectives:=TDictionary.Create; + { Default directives and conditionals for all modes } + AddDirective('I',directive_all, {$ifdef FPCPROCVAR}@{$endif}dir_include); + { Default Turbo directives and conditionals } AddDirective('DEFINE',directive_turbo, {$ifdef FPCPROCVAR}@{$endif}dir_define); AddDirective('UNDEF',directive_turbo, {$ifdef FPCPROCVAR}@{$endif}dir_undef); - AddDirective('I',directive_turbo, {$ifdef FPCPROCVAR}@{$endif}dir_include); AddDirective('INCLUDE',directive_turbo, {$ifdef FPCPROCVAR}@{$endif}dir_include); AddConditional('ELSE',directive_turbo, {$ifdef FPCPROCVAR}@{$endif}dir_else); @@ -2916,7 +2939,12 @@ exit_label: end. { $Log$ - Revision 1.69 2004-02-11 14:46:59 daniel + Revision 1.70 2004-02-23 23:38:25 olle + + mode mac: added UNDEFINED construct + + mode mac: added support for include $I + * renamed one of the readpreproc to preproc_substitutedtoken to avoid confusement + + Revision 1.69 2004/02/11 14:46:59 daniel * Better fix for case sensitive macro handling Revision 1.68 2004/02/11 14:13:10 daniel