// Ghidra headless post-script: export all decompiled functions.

import java.io.File;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;

import ghidra.app.decompiler.DecompInterface;
import ghidra.app.decompiler.DecompileResults;
import ghidra.app.script.GhidraScript;
import ghidra.program.model.listing.Function;
import ghidra.program.model.listing.FunctionIterator;

public class ExportDecompiled extends GhidraScript {
    @Override
    protected void run() throws Exception {
        File out = new File("D:\\project\\CVD_ALG\\stm32F103\\recovered\\ghidra_decompiled.c");

        DecompInterface decomp = new DecompInterface();
        decomp.openProgram(currentProgram);

        try (PrintWriter pw = new PrintWriter(out, StandardCharsets.UTF_8)) {
            pw.println("/* Decompiled by Ghidra headless from STM32_FlashLoader.axf */");
            pw.println();

            FunctionIterator funcs = currentProgram.getFunctionManager().getFunctions(true);
            while (funcs.hasNext() && !monitor.isCancelled()) {
                Function f = funcs.next();
                pw.printf("/* %s @ %s */%n", f.getName(), f.getEntryPoint());

                DecompileResults res = decomp.decompileFunction(f, 60, monitor);
                if (res != null && res.decompileCompleted()) {
                    pw.println(res.getDecompiledFunction().getC());
                } else {
                    pw.println("/* decompile failed */");
                }

                pw.println();
            }
        } finally {
            decomp.dispose();
        }
    }
}
