ghidra-master/Ghidra/Features/FunctionID/ghidra_scripts/FunctionIDHeadlessPostscript.java
/* ###
 * IP: GHIDRA
 * REVIEWED: YES
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
//Fixes switch statements and checks number/size of functions after
//analysis has run in headless mode whilst importing a large number of
//.obj files for use in creating a Function ID library.
//@category FunctionID
import ghidra.app.script.GhidraScript;
import ghidra.program.model.address.AddressSetView;
import ghidra.program.model.listing.*;

public class FunctionIDHeadlessPostscript extends GhidraScript {
	public static final int MINIMUM_FUNCTION_SIZE_IN_BYTES = 6;

	@Override
	protected void run() throws Exception {
		runScript("FixSwitchStatementsWithDecompiler.java");

		FunctionManager functionManager = currentProgram.getFunctionManager();
		int functionCount = functionManager.getFunctionCount();
		if (functionCount == 0) {
			printerr(currentProgram.getDomainFile().getPathname() + " has no functions");

			// keep the functionless domain object for now in case user wants to
			// inspect why analysis failed (or didn't)

//			getState().addEnvironmentVar(GhidraScript.SCRIPT_SET_CONTINUATION_STATUS,
//				HeadlessContinuationOption.ABORT_AND_DELETE);
			return;
		}
		FunctionIterator functions = functionManager.getFunctions(true);
		for (Function function : functions) {
			AddressSetView body = function.getBody();
			if (body.getNumAddresses() >= MINIMUM_FUNCTION_SIZE_IN_BYTES) {
				// at least one meets threshold; everything is OK
				return;
			}
		}
		printerr(currentProgram.getDomainFile().getPathname() +
			" has no normal-sized functions (>= " + MINIMUM_FUNCTION_SIZE_IN_BYTES + " bytes long)");

		// keep the functionless domain object for now in case user wants to
		// inspect why analysis failed (or didn't)

//		getState().addEnvironmentVar(GhidraScript.SCRIPT_SET_CONTINUATION_STATUS,
//			HeadlessContinuationOption.ABORT_AND_DELETE);
	}
}
