Browse Source

* Flag to allow unknown macros

Michaël Van Canneyt 12 hours ago
parent
commit
012b53c451
1 changed files with 39 additions and 33 deletions
  1. 39 33
      packages/pastojs/src/pas2jscompiler.pp

+ 39 - 33
packages/pastojs/src/pas2jscompiler.pp

@@ -282,7 +282,7 @@ type
     function IndexOf(const aName: string): integer;
     procedure Delete(Index: integer);
     function FindMacro(const aName: string): TPas2jsMacro;
-    procedure Substitute(var s: string; Sender: TObject = nil; Lvl: integer = 0);
+    procedure Substitute(var s: string; Sender: TObject = nil; Lvl: integer = 0; SkipUnknown : boolean = false);
     property Macros[Index: integer]: TPas2jsMacro read GetMacros; default;
     property MaxLevel: integer read FMaxLevel write FMaxLevel;
   end;
@@ -928,8 +928,7 @@ begin
     Result:=nil;
 end;
 
-procedure TPas2jsMacroEngine.Substitute(var s: string; Sender: TObject;
-  Lvl: integer);
+procedure TPas2jsMacroEngine.Substitute(var s: string; Sender: TObject; Lvl: integer; SkipUnknown: boolean);
 // Rules:
 //   $macro or $macro$
 // if Macro.OnSubstitute is set then optional brackets are allowed: $macro(params)
@@ -951,37 +950,44 @@ begin
       MacroName:=copy(s,StartP+1,p-StartP-1);
       Macro:=FindMacro(MacroName);
       if Macro=nil then
-        raise EPas2jsMacro.Create('macro not found "'+MacroName+'" in "'+s+'"');
-      NewValue:='';
-      if Macro.CanHaveParams and (p<=length(s)) and (s[p]='(') then
       begin
-        // read NewValue
-        inc(p);
-        ParamStartP:=p;
-        BracketLvl:=1;
-        repeat
-          if p>length(s) then
-            raise EPas2jsMacro.Create('missing closing bracket ) in "'+s+'"');
-          case s[p] of
-          '(': inc(BracketLvl);
-          ')':
-            if BracketLvl=1 then
-            begin
-              NewValue:=copy(s,ParamStartP,p-ParamStartP);
-              break;
-            end else begin
-              dec(BracketLvl);
-            end;
-          end;
-        until false;
-      end else if (p<=length(s)) and (s[p]='$') then
-        inc(p);
-      if Assigned(Macro.OnSubstitute) then
+        if not SkipUnknown then
+          raise EPas2jsMacro.Create('macro not found "'+MacroName+'" in "'+s+'"')
+        else
+          NewValue:=MacroName;
+      end
+      else
       begin
-        if not Macro.OnSubstitute(Sender,NewValue,Lvl+1) then
-          raise EPas2jsMacro.Create('macro "'+MacroName+'" failed in "'+s+'"');
-      end else
-        NewValue:=Macro.Value;
+        if Macro.CanHaveParams and (p<=length(s)) and (s[p]='(') then
+        begin
+          // read NewValue
+          inc(p);
+          ParamStartP:=p;
+          BracketLvl:=1;
+          repeat
+            if p>length(s) then
+              raise EPas2jsMacro.Create('missing closing bracket ) in "'+s+'"');
+            case s[p] of
+            '(': inc(BracketLvl);
+            ')':
+              if BracketLvl=1 then
+              begin
+                NewValue:=copy(s,ParamStartP,p-ParamStartP);
+                break;
+              end else begin
+                dec(BracketLvl);
+              end;
+            end;
+          until false;
+        end else if (p<=length(s)) and (s[p]='$') then
+          inc(p);
+        if Assigned(Macro) and Assigned(Macro.OnSubstitute) then
+        begin
+          if not Macro.OnSubstitute(Sender,NewValue,Lvl+1) then
+            raise EPas2jsMacro.Create('macro "'+MacroName+'" failed in "'+s+'"');
+        end else
+          NewValue:=Macro.Value;
+      end;
       s:=LeftStr(s,StartP-1)+NewValue+copy(s,p,length(s));
       p:=StartP;
     end;
@@ -3904,7 +3910,7 @@ begin
       Log.LogMsgIgnoreFilter(nHandlingOption,[QuoteStr(Param)]);
   if Param='' then exit;
   FCurParam:=Param;
-  ParamMacros.Substitute(Param,Self);
+  ParamMacros.Substitute(Param,Self,0,True);
   if Param='' then exit;
 
   if Quick and ((Param='-h') or (Param='-?') or (Param='--help')) then