================ @@ -127,16 +133,91 @@ std::string getFormatString() { // GetMainExecutable (since some platforms don't support taking the // address of main, and some platforms can't implement GetMainExecutable // without being given the address of a function in the main executable). -std::string GetExecutablePath(const char *Argv0, void *MainAddr) { +std::string getExecutablePath(const char *Argv0, void *MainAddr) { return llvm::sys::fs::getMainExecutable(Argv0, MainAddr); } +llvm::Error getAssetFiles(clang::doc::ClangDocContext &CDCtx) { + std::error_code Code; + llvm::SmallString<128> FilePath = llvm::SmallString<128>(UserAssetPath); + for (auto DirIt = llvm::sys::fs::directory_iterator(UserAssetPath, Code), + DirEnd = llvm::sys::fs::directory_iterator(); + !Code && DirIt != DirEnd; DirIt.increment(Code)) { + FilePath = llvm::SmallString<128>(DirIt->path()); + if (llvm::sys::fs::is_regular_file(FilePath)) { + if (llvm::sys::path::extension(FilePath) == ".css") { + CDCtx.UserStylesheets.insert(CDCtx.UserStylesheets.begin(), + std::string(FilePath)); + } else if (llvm::sys::path::extension(FilePath) == ".js") { + CDCtx.FilesToCopy.emplace_back(FilePath.str()); + } + } + } + if (Code) { + return llvm::createFileError(FilePath, Code); + } + return llvm::Error::success(); +} + +llvm::Error getDefaultAssetFiles(const char *Argv0, + clang::doc::ClangDocContext &CDCtx) { + void *MainAddr = (void *)(intptr_t)getExecutablePath; + std::string ClangDocPath = getExecutablePath(Argv0, MainAddr); + llvm::SmallString<128> NativeClangDocPath; + llvm::sys::path::native(ClangDocPath, NativeClangDocPath); + + llvm::SmallString<128> AssetsPath; + AssetsPath = llvm::sys::path::parent_path(NativeClangDocPath); + llvm::sys::path::append(AssetsPath, "..", "share", "clang"); + llvm::SmallString<128> DefaultStylesheet; + llvm::sys::path::native(AssetsPath, DefaultStylesheet); + llvm::sys::path::append(DefaultStylesheet, + "clang-doc-default-stylesheet.css"); + llvm::SmallString<128> IndexJS; + llvm::sys::path::native(AssetsPath, IndexJS); + llvm::sys::path::append(IndexJS, "index.js"); + + if (!llvm::sys::fs::is_regular_file(IndexJS)) { + return llvm::createStringError(llvm::inconvertibleErrorCode(), + "error default index.js file missing at " + + IndexJS + "\n"); + } + + if (!llvm::sys::fs::is_regular_file(DefaultStylesheet)) { + return llvm::createStringError( + llvm::inconvertibleErrorCode(), + "error default clang-doc-default-stylesheet.css file missing at " + + DefaultStylesheet + "\n"); + } + + CDCtx.UserStylesheets.insert(CDCtx.UserStylesheets.begin(), + std::string(DefaultStylesheet)); + CDCtx.FilesToCopy.emplace_back(IndexJS.str()); + + llvm::outs() << "Using default asset: " << AssetsPath << "\n"; + + return llvm::Error::success(); +} + +llvm::Error getHtmlAssetFiles(const char *Argv0, + clang::doc::ClangDocContext &CDCtx) { + if (!UserAssetPath.empty() && + !llvm::sys::fs::is_directory(std::string(UserAssetPath))) { + llvm::outs() << "Asset path supply is not a directory: " << UserAssetPath + << " falling back to default\n"; + } + if (llvm::sys::fs::is_directory(std::string(UserAssetPath))) { + return getAssetFiles(CDCtx); + } ---------------- ilovepi wrote:
nit: braces https://github.com/llvm/llvm-project/pull/94717 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits