From 1dae41c607e008800657dfa5cfe590cb02265719 Mon Sep 17 00:00:00 2001 From: Powei Feng Date: Mon, 27 Jan 2025 11:51:48 -0800 Subject: [PATCH] matdbg: fix two bugs with formatting (#8388) - return original source when on an unsupported platform - check clang-format is available and return original source. --- libs/matdbg/src/SourceFormatter.cpp | 42 ++++++++++++++++++----------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/libs/matdbg/src/SourceFormatter.cpp b/libs/matdbg/src/SourceFormatter.cpp index c068a34f4b..fe7c3f88ed 100644 --- a/libs/matdbg/src/SourceFormatter.cpp +++ b/libs/matdbg/src/SourceFormatter.cpp @@ -25,14 +25,32 @@ namespace filament::matdbg { #if defined(__linux__) || defined(__APPLE__) std::string SourceFormatter::format(char const* source) { - std::string const TMP_FILENAME = "/tmp/matdbg-tmp-src.cpp"; + char output[1024]; - std::string original(source); - FILE* fp; - fp = fopen(TMP_FILENAME.c_str(), "w"); - if (!fp) { - return original; + // First check if clang-format is available. + FILE* fp = popen("clang-format -version", "r"); + + // Need to drain the output + while (fgets(output, 1024, fp) != NULL) {} + + int status = pclose(fp); + if (!fp || !WEXITSTATUS(status)) { + std::call_once(mClangWarningFlag, []() { + utils::slog.w << "[matdbg] unable to run clang-format to format shader file. " + << "Please make sure it's installed." << utils::io::endl; + }); + return source; } + + // Write the source to a temp file for formatting + char const* TMP_FILENAME = "/tmp/matdbg-tmp-src.cpp"; + fp = fopen(TMP_FILENAME, "w"); + if (!fp) { + return source; + } + + // Unknown if the input is 0-terminated so we put it in a string first. + std::string original(source); fputs(original.c_str(), fp); fflush(fp); pclose(fp); @@ -45,22 +63,16 @@ std::string SourceFormatter::format(char const* source) { "}'"; fp = popen(("clang-format " + CLANG_FORMAT_OPTIONS + "< " + TMP_FILENAME).c_str(), "r"); - if (!fp) { - std::call_once(mClangWarningFlag, []() { - utils::slog.w << "[matdbg] unable to run clang-format to format shader file. " - << "Please make sure it's installed."; - }); return original; } - char output[1024]; std::stringstream outStream; while (fgets(output, 1024, fp) != NULL) { outStream << output; } - int status = pclose(fp); + status = pclose(fp); if (WEXITSTATUS(status)) { utils::slog.w << "[matdbg] clang-format failed with code=" << WEXITSTATUS(status) << utils::io::endl; @@ -69,11 +81,11 @@ std::string SourceFormatter::format(char const* source) { } #else std::string SourceFormatter::format(char const* source) { - std::call_once(mClangWarningFlag, []() { + std::call_once(mClangWarningFlag, []() { utils::slog.w <<"[matdbg]: source formatting is not available on this platform" << utils::io::endl; }); - return ""; + return source; } #endif