|
@@ -227,6 +227,7 @@ interface
|
|
|
procedure skipoldtpcomment(read_first_char:boolean);
|
|
|
procedure readtoken(allowrecordtoken:boolean);
|
|
|
function readpreproc:ttoken;
|
|
|
+ function readpreprocint(var value:int64;const place:string):boolean;
|
|
|
function asmgetchar:char;
|
|
|
end;
|
|
|
|
|
@@ -276,7 +277,6 @@ interface
|
|
|
Function SetCompileModeSwitch(s:string; changeInit: boolean):boolean;
|
|
|
procedure SetAppType(NewAppType:tapptype);
|
|
|
|
|
|
-
|
|
|
implementation
|
|
|
|
|
|
uses
|
|
@@ -924,8 +924,10 @@ type
|
|
|
function evaluate(v:texprvalue;op:ttoken):texprvalue;
|
|
|
procedure error(expecteddef, place: string);
|
|
|
function isBoolean: Boolean;
|
|
|
+ function isInt: Boolean;
|
|
|
function asBool: Boolean;
|
|
|
function asInt: Integer;
|
|
|
+ function asInt64: Int64;
|
|
|
function asStr: String;
|
|
|
destructor destroy; override;
|
|
|
end;
|
|
@@ -1140,6 +1142,12 @@ type
|
|
|
begin
|
|
|
if isBoolean then
|
|
|
result:=texprvalue.create_bool(not asBool)
|
|
|
+ else if is_ordinal(def) then
|
|
|
+ begin
|
|
|
+ result:=texprvalue.create_ord(value.valueord);
|
|
|
+ result.def:=def;
|
|
|
+ calc_not_ordvalue(result.value.valueord,result.def);
|
|
|
+ end
|
|
|
else
|
|
|
begin
|
|
|
error('Boolean', 'NOT');
|
|
@@ -1156,6 +1164,14 @@ type
|
|
|
v.error('Boolean','OR');
|
|
|
result:=texprvalue.create_error;
|
|
|
end
|
|
|
+ else if is_ordinal(def) then
|
|
|
+ if is_ordinal(v.def) then
|
|
|
+ result:=texprvalue.create_ord(value.valueord or v.value.valueord)
|
|
|
+ else
|
|
|
+ begin
|
|
|
+ v.error('Ordinal','OR');
|
|
|
+ result:=texprvalue.create_error;
|
|
|
+ end
|
|
|
else
|
|
|
begin
|
|
|
error('Boolean','OR');
|
|
@@ -1172,6 +1188,14 @@ type
|
|
|
v.error('Boolean','XOR');
|
|
|
result:=texprvalue.create_error;
|
|
|
end
|
|
|
+ else if is_ordinal(def) then
|
|
|
+ if is_ordinal(v.def) then
|
|
|
+ result:=texprvalue.create_ord(value.valueord xor v.value.valueord)
|
|
|
+ else
|
|
|
+ begin
|
|
|
+ v.error('Ordinal','XOR');
|
|
|
+ result:=texprvalue.create_error;
|
|
|
+ end
|
|
|
else
|
|
|
begin
|
|
|
error('Boolean','XOR');
|
|
@@ -1188,6 +1212,14 @@ type
|
|
|
v.error('Boolean','AND');
|
|
|
result:=texprvalue.create_error;
|
|
|
end
|
|
|
+ else if is_ordinal(def) then
|
|
|
+ if is_ordinal(v.def) then
|
|
|
+ result:=texprvalue.create_ord(value.valueord and v.value.valueord)
|
|
|
+ else
|
|
|
+ begin
|
|
|
+ v.error('Ordinal','AND');
|
|
|
+ result:=texprvalue.create_error;
|
|
|
+ end
|
|
|
else
|
|
|
begin
|
|
|
error('Boolean','AND');
|
|
@@ -1323,16 +1355,21 @@ type
|
|
|
|
|
|
function texprvalue.isBoolean: Boolean;
|
|
|
var
|
|
|
- i: integer;
|
|
|
+ i: int64;
|
|
|
begin
|
|
|
result:=is_boolean(def);
|
|
|
if not result and is_integer(def) then
|
|
|
begin
|
|
|
- i:=asInt;
|
|
|
+ i:=asInt64;
|
|
|
result:=(i=0)or(i=1);
|
|
|
end;
|
|
|
end;
|
|
|
|
|
|
+ function texprvalue.isInt: Boolean;
|
|
|
+ begin
|
|
|
+ result:=is_integer(def);
|
|
|
+ end;
|
|
|
+
|
|
|
function texprvalue.asBool: Boolean;
|
|
|
begin
|
|
|
result:=value.valueord<>0;
|
|
@@ -1343,6 +1380,11 @@ type
|
|
|
result:=value.valueord.svalue;
|
|
|
end;
|
|
|
|
|
|
+ function texprvalue.asInt64: Int64;
|
|
|
+ begin
|
|
|
+ result:=value.valueord.svalue;
|
|
|
+ end;
|
|
|
+
|
|
|
function texprvalue.asStr: String;
|
|
|
var
|
|
|
b:byte;
|
|
@@ -5614,6 +5656,25 @@ exit_label:
|
|
|
end;
|
|
|
|
|
|
|
|
|
+ function tscannerfile.readpreprocint(var value:int64;const place:string):boolean;
|
|
|
+ var
|
|
|
+ hs : texprvalue;
|
|
|
+ begin
|
|
|
+ hs:=preproc_comp_expr;
|
|
|
+ if hs.isInt then
|
|
|
+ begin
|
|
|
+ value:=hs.asInt64;
|
|
|
+ result:=true;
|
|
|
+ end
|
|
|
+ else
|
|
|
+ begin
|
|
|
+ hs.error('Integer',place);
|
|
|
+ result:=false;
|
|
|
+ end;
|
|
|
+ hs.free;
|
|
|
+ end;
|
|
|
+
|
|
|
+
|
|
|
function tscannerfile.asmgetchar : char;
|
|
|
begin
|
|
|
readchar;
|