+ mode mac: added UNDEFINED construct

+ mode mac: added support for include $I
  * renamed one of the readpreproc to preproc_substitutedtoken to avoid confusement
This commit is contained in:
olle 2004-02-23 23:38:25 +00:00
parent d20b73a033
commit ff2c436b78

View File

@ -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