diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/cparser/CParserPlugin.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/cparser/CParserPlugin.java index 47f5467958..c02e2a4559 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/cparser/CParserPlugin.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/cparser/CParserPlugin.java @@ -204,6 +204,7 @@ public class CParserPlugin extends ProgramPlugin { ByteArrayOutputStream bos = new ByteArrayOutputStream(); cpp.setOutputStream(bos); + cpp.setMonitor(monitor); try { for (String filename : filenames) { @@ -257,6 +258,7 @@ public class CParserPlugin extends ProgramPlugin { try { parserMessages = ""; cParser.setParseFileName(fName); + cParser.setMonitor(monitor); cParser.parse(bis); } finally { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/cparser/C/CParserUtils.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/cparser/C/CParserUtils.java index e175231fbc..ff8dffb1f1 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/cparser/C/CParserUtils.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/cparser/C/CParserUtils.java @@ -441,6 +441,7 @@ public class CParserUtils { PrintStream old = System.out; System.setOut(os); + cpp.setMonitor(monitor); cpp.setOutputStream(bos); try { @@ -494,6 +495,7 @@ public class CParserUtils { try { parserMessages = ""; cParser.setParseFileName(fName); + cParser.setMonitor(monitor); cParser.parse(bis); } finally { parserMessages = cParser.getParseMessages(); diff --git a/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/C/C.jj b/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/C/C.jj index 2aea289b8d..da979d34dd 100644 --- a/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/C/C.jj +++ b/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/C/C.jj @@ -84,6 +84,7 @@ package ghidra.app.util.cparser.C; import ghidra.program.model.data.*; import ghidra.program.model.data.Enum; import ghidra.util.Msg; +import ghidra.util.task.TaskMonitor; import ghidra.util.InvalidNameException; import ghidra.util.exception.DuplicateNameException; import ghidra.util.exception.InvalidInputException; @@ -138,6 +139,8 @@ public class CParser { // true if parse was successful private boolean parseSuccess = false; + private TaskMonitor monitor = null; + // packing size for structures private int packSize = 0; Stack packStack = new Stack(); @@ -546,6 +549,10 @@ public class CParser { public boolean didParseSucceed() { return parseSuccess; } + + public void setMonitor(TaskMonitor monitor) { + this.monitor = monitor; + } private FunctionDefinitionDataType newAnonymousFunction(FunctionDefinitionDataType currentFuncDT) { if (currentFuncDT != null) { @@ -1440,6 +1447,9 @@ void ExternalDeclaration() : {} ";" ) { + if (monitor != null && monitor.isCancelled()) { + throw new ParseException("Parsing Canceled"); + } typedefParsingStack.clear(); } } diff --git a/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/CPP/CPP.jj b/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/CPP/CPP.jj index 9dd2911675..4db24f649d 100644 --- a/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/CPP/CPP.jj +++ b/Ghidra/Features/Base/src/main/javacc/ghidra/app/util/cparser/CPP/CPP.jj @@ -110,6 +110,7 @@ PARSER_BEGIN(PreProcessor) package ghidra.app.util.cparser.CPP; import ghidra.util.Msg; +import ghidra.util.task.TaskMonitor; import java.util.*; import java.io.*; @@ -549,6 +550,8 @@ public class PreProcessor { // true if parse was successful private boolean parseSuccess = false; + + private TaskMonitor monitor = null; // Toggle printing private int verboseLevel = 0; @@ -1334,6 +1337,10 @@ public class PreProcessor { public PreProcessor() throws ParseException { this(System.in); } + + public void setMonitor(TaskMonitor monitor) { + this.monitor = monitor; + } // Run the parser public static void main(String args[]) { @@ -1359,7 +1366,14 @@ void Input() : ppt.emit(false); } { - ( b=TranslationUnit(){if (b.getTruth()==false) break;})* + ( b=TranslationUnit() + { + if (monitor != null && monitor.isCancelled()) { + throw new ParseException("Parsing Canceled"); + } + if (b.getTruth()==false) break; + } + )* { if (conditionDepth!=execStack.size()) { addParseMessage(null, "Imbalance in sequence/nesting of compile-time conditions/logic in input file "+curFileStackTop());