1- { uPSPreProcessor.pas } // version: 2022.1123.1400
1+ { uPSPreProcessor.pas } // version: 2022.1123.1500
22{ ----------------------------------------------------------------------------}
33{ RemObjects Pascal Script }
44{ ----------------------------------------------------------------------------}
@@ -175,10 +175,12 @@ TPSDefineStates = class
175175implementation
176176
177177{ +}
178- { $IFDEF DELPHI12UP}
179178uses
180- AnsiStrings;
181- { $ENDIF}
179+ StrUtils
180+ { $IFDEF DELPHI12UP}
181+ ,AnsiStrings
182+ { $ENDIF}
183+ ;
182184{ +.}
183185
184186{ $if (defined(DELPHI3UP) or defined(FPC))}
@@ -192,6 +194,8 @@ implementation
192194 RPS_IncludeNotFoundFrom = ' used from '' %s'' ' ;
193195 { +.}
194196 RPS_DefineTooManyParameters = ' Too many parameters in '' %s'' at %d:%d' ;
197+ RPS_DefineTooLessParameters = ' Too less parameters in '' %s'' at %d:%d' ;
198+ RPS_DefineInvalidParameters = ' Invalid parameters in '' %s'' at %d:%d' ;
195199 RPS_NoIfdefForEndif = ' No IFDEF for ENDIF in '' %s'' at %d:%d' ;
196200 RPS_NoIfdefForElse = ' No IFDEF for ELSE in '' %s'' at %d:%d' ;
197201 RPS_ElseTwice = ' Can'' t use ELSE twice in '' %s'' at %d:%d' ;
@@ -578,15 +582,19 @@ procedure TPSPreProcessor.doAddStdPredefines;
578582
579583procedure TPSPreProcessor.IntPreProcess (Level: Integer; const OrgFileName, AFileName: TbtString;
580584 Dest: TStream);
585+ const // TetzkatLipHoka: implement "$IF Defined" https://github.com/remobjects/pascalscript/pull/265
586+ sDEFINED = ' DEFINED(' ;
587+ sNOT = ' NOT' ;
588+ sAND = ' AND' ;
589+ sOR = ' OR' ;
590+ sANDNOT = ' ANDNOT' ;
591+ sORNOT = ' ORNOT' ;
592+ sCompilerVersion = ' COMPILERVERSION' ;
581593var
582594 Parser: TPSPascalPreProcessorParser;
583- FileName, dta: TbtString;
584- item: TPSLineInfo;
585- s, name : TbtString;
586- current, i: Longint;
587- ds: TPSDefineState;
588- AppContinue: Boolean;
589- ADoWrite: Boolean;
595+ dta: TbtString; item: TPSLineInfo; FileName, s, ts, name : TbtString;
596+ current, i, j: Longint; ds: TPSDefineState;
597+ OK, AppContinue, ADoWrite: Boolean;
590598begin
591599 FileName := AFileName;
592600 if Level > MaxLevel then
@@ -677,7 +685,7 @@ procedure TPSPreProcessor.IntPreProcess(Level: Integer; const OrgFileName, AFile
677685 ADoWrite := (FCurrentDefines.IndexOf(UpperCase(string(s))) < 0 ) and FDefineState.DoWrite;
678686 FDefineState.Add.DoWrite := ADoWrite;
679687 { +.}
680- end else if (Name = ' ENDIF' ) then begin
688+ end else if (Name = ' ENDIF' ) or ( Name = ' IFEND ' ) then begin
681689 // - jgv remove - borland use it (sysutils.pas)
682690 // - if s <> '' then raise EPSPreProcessor.CreateFmt(RPS_DefineTooManyParameters, [string(FileName), Parser.Row, Parser.Col]);
683691 if FDefineState.Count = 0 then
@@ -694,8 +702,107 @@ procedure TPSPreProcessor.IntPreProcess(Level: Integer; const OrgFileName, AFile
694702 ds.FInElse := True;
695703 // JeromeWelsh - nesting fix
696704 ds.DoWrite := not ds.DoWrite and FDefineState.DoPrevWrite;
697- end
698- else begin
705+ end else if (Name = ' IF' ) then begin
706+ OK := PosT(' ' , S) <= 0 ;
707+ if OK then
708+ raise EPSPreProcessor.CreateFmt(RPS_DefineTooLessParameters, [FileName, Parser.Row, Parser.Col]);
709+ S := Trim(S);
710+ S := UpperCase(S);
711+ S := StringReplaceT(S, #32 #32 , #32 , [rfReplaceAll]);
712+ S := StringReplaceT(S, ' (' , ' (' , [rfReplaceAll]);
713+ S := StringReplaceT(S, ' ( ' , ' (' , [rfReplaceAll]);
714+ S := StringReplaceT(S, ' )' , ' )' , [rfReplaceAll]);
715+ S := StringReplaceT(S, ' ) ' , ' )' , [rfReplaceAll]);
716+ OK := (Copy(S, 1 , Length(sDEFINED))=sDEFINED)
717+ or (Copy(S, 1 , Length(sNOT) + Length(sDEFINED)) = sNOT + sDEFINED)
718+ or (Copy(S, 1 , Length(sNOT) + Length(sDEFINED) + 1 ) = sNOT + ' ' + sDEFINED)
719+ ;
720+ if OK then begin // MS
721+ S := StringReplaceT(S, ' NOT' , ' NOT' , [rfReplaceAll]);
722+ S := StringReplaceT(S, ' NOT ' , ' NOT' , [rfReplaceAll]);
723+ S := StringReplaceT(S, ' AND' , ' AND' , [rfReplaceAll]);
724+ S := StringReplaceT(S, ' AND ' , ' AND' , [rfReplaceAll]);
725+ S := StringReplaceT(S, ' OR' , ' OR' , [rfReplaceAll]);
726+ S := StringReplaceT(S, ' OR ' , ' OR' , [rfReplaceAll]);
727+ ADoWrite := FDefineState.DoWrite;
728+ ts := S;
729+ if (Copy(ts, 1 , Length(sNOT)) = sNOT) then begin
730+ j := 2 ;
731+ ts := Copy(ts, Length(sNOT)+1 , Length(ts)-Length(sNOT));
732+ end else
733+ j := 0 ; // AND
734+ while (ts <> ' ' ) do begin
735+ i := PosExT(' )' , ts, Length(sDEFINED)+1 );
736+ if (i = 0 ) then begin
737+ raise EPSPreProcessor.CreateFmt(RPS_DefineInvalidParameters, [FileName, Parser.Row, Parser.Col]);
738+ Break;
739+ end ;
740+ case j of
741+ 0 : // AND
742+ ADoWrite := ADoWrite and
743+ (FCurrentDefines.IndexOf(string(Copy(ts, Length(sDefined)+1 , i-Length(sDefined)-1 ))) >= 0 );
744+ 1 : // OR
745+ ADoWrite := ADoWrite or
746+ (FCurrentDefines.IndexOf(string(Copy(ts, Length(sDefined)+1 , i-Length(sDefined)-1 ))) >= 0 );
747+ 2 : // (AND) NOT
748+ ADoWrite := ADoWrite and
749+ (FCurrentDefines.IndexOf(string(Copy(ts, Length(sDefined)+1 , i-Length(sDefined)-1 ))) < 0 );
750+ 3 : // OR NOT
751+ ADoWrite := ADoWrite or
752+ (FCurrentDefines.IndexOf(string(Copy(ts, Length(sDefined)+1 , i-Length(sDefined)-1 ))) < 0 );
753+ else
754+ ADoWrite := ADoWrite or
755+ (FCurrentDefines.IndexOf(string(Copy(ts, Length(sDefined)+1 , i-Length(sDefined)-1 ))) >= 0 );
756+ end ; // case j
757+ ts := Copy(ts, i+1 , Length( ts )-i);
758+ if (Copy(ts, 1 , Length(sANDNOT)) = sANDNOT ) then begin
759+ j := 2 ;
760+ ts := Copy(ts, Length(sANDNOT)+1 , Length(ts)-Length(sANDNOT));
761+ end else if (Copy(ts, 1 , Length(sORNOT)) = sORNOT) then begin
762+ j := 3 ;
763+ ts := Copy(ts, Length(sORNOT)+1 , Length(ts)-Length(sORNOT));
764+ end else if (Copy(ts, 1 , Length(sAND)) = sAND) then begin
765+ j := 0 ;
766+ ts := Copy(ts, Length(sAND)+1 , Length(ts)-Length(sAND));
767+ end else if (Copy(ts, 1 , Length(sOR)) = sOR) then begin
768+ j := 1 ;
769+ ts := Copy(ts, Length(sOR)+1 , Length(ts)-Length(sOR));
770+ end ;
771+ end ; // "while (ts <> '')"
772+ FDefineState.Add.DoWrite := ADoWrite;
773+ end else if (Copy(S, 1 , Length(sCompilerVersion)) = sCompilerVersion) then begin
774+ S := StringReplaceT(S, #32 , ' ' , [rfReplaceAll]);
775+ if (Copy(S, 16 , 2 ) = ' >=' ) then
776+ FDefineState.Add.DoWrite := ( StrToIntDef(Copy(S, 18 , Length(S)-17 ), -1 ) >= CompilerVersion )
777+ else if (Copy(S, 16 , 2 ) = ' <=' ) then
778+ FDefineState.Add.DoWrite := ( StrToIntDef(Copy(S, 18 , Length(S)-17 ), High( Integer ) ) <= CompilerVersion )
779+ else if (Copy(S, 16 , 1 ) = ' <' ) then
780+ FDefineState.Add.DoWrite := ( StrToIntDef(Copy(S, 17 , Length(S)-16 ), High( Integer ) ) < CompilerVersion )
781+ else if (Copy(S, 16 , 1 ) = ' >' ) then
782+ FDefineState.Add.DoWrite := ( StrToIntDef(Copy(S, 17 , Length(S)-16 ), -1 ) > CompilerVersion )
783+ else if (Copy(S, 16 , 1 ) = ' =' ) then
784+ FDefineState.Add.DoWrite := ( StrToIntDef(Copy(S, 17 , Length(S)-16 ), -1 ) = CompilerVersion )
785+ else
786+ raise EPSPreProcessor.CreateFmt(RPS_DefineInvalidParameters, [FileName, Parser.Row, Parser.Col]);
787+ end else begin
788+ // -- jgv: 20050710 custom application error process
789+ if @OnProcessUnknowDirective <> nil then begin
790+ OnProcessUnknowDirective(Self, Parser, FDefineState.DoWrite, name , { +} TbtString(s){ +.} , AppContinue);
791+ end ;
792+ if AppContinue then
793+ // -- jgv.
794+ raise EPSPreProcessor.CreateFmt(RPS_UnknownCompilerDirective, [string(FileName), Parser.Row, Parser.Col]);
795+ end ;
796+ // Compatibility Dummys
797+ end else if (Name = ' UNSAFE_TYPE' ) or (Name = ' UNSAFE_CODE' ) or (Name = ' UNSAFE_CAST' ) OR (Name = ' SYMBOL_PLATFORM' )
798+ or (Name = ' GARBAGE' ) or (Name = ' WARN' ) or (Name = ' RANGECHECKS' )
799+ or (Name = ' WEAKPACKAGEUNIT' ) or (Name = ' EXTERNALSYM' ) or (Name = ' NODEFINE' )
800+ then begin
801+ SetLength(s, Length(Parser.Token));
802+ for i := Length(s) downto 1 do begin
803+ s[i] := #32 ; // space
804+ end ;
805+ end else begin
699806 // -- jgv: 20050710 custom application error process
700807 if @OnProcessUnknowDirective <> nil then begin
701808 OnProcessUnknowDirective(Self, Parser, FDefineState.DoWrite, name , { +} TbtString(s){ +.} , AppContinue);
0 commit comments