From 848e37625a01206cda1a46fc2d6abd5b1e935251 Mon Sep 17 00:00:00 2001 From: Chuck Walbourn Date: Tue, 8 Jun 2021 15:00:22 -0700 Subject: [PATCH] texassemble/texconv/texdiag updated with improved -flist support (#239) --- Texassemble/texassemble.cpp | 119 +++++++++++++++++++++++++++--------- Texconv/texconv.cpp | 117 ++++++++++++++++++++++++++--------- Texdiag/texdiag.cpp | 118 ++++++++++++++++++++++++++--------- 3 files changed, 264 insertions(+), 90 deletions(-) diff --git a/Texassemble/texassemble.cpp b/Texassemble/texassemble.cpp index bf264b0..fd1ccd4 100644 --- a/Texassemble/texassemble.cpp +++ b/Texassemble/texassemble.cpp @@ -20,17 +20,21 @@ #define NOHELP #pragma warning(pop) +#include #include #include #include #include #include +#include #include #include #include #include #include #include +#include +#include #include #include @@ -472,6 +476,90 @@ namespace } } + void ProcessFileList(std::wifstream& inFile, std::list& files) + { + std::list flist; + std::set excludes; + wchar_t fname[1024] = {}; + for (;;) + { + inFile >> fname; + if (!inFile) + break; + + if (*fname == L'#') + { + // Comment + } + else if (*fname == L'-') + { + if (flist.empty()) + { + wprintf(L"WARNING: Ignoring the line '%ls' in -flist\n", fname); + } + else + { + if (wcspbrk(fname, L"?*") != nullptr) + { + std::list removeFiles; + SearchForFiles(&fname[1], removeFiles, false); + + for (auto it : removeFiles) + { + _wcslwr_s(it.szSrc); + excludes.insert(it.szSrc); + } + } + else + { + std::wstring name = (fname + 1); + std::transform(name.begin(), name.end(), name.begin(), towlower); + excludes.insert(name); + } + } + } + else if (wcspbrk(fname, L"?*") != nullptr) + { + SearchForFiles(fname, flist, false); + } + else + { + SConversion conv = {}; + wcscpy_s(conv.szSrc, MAX_PATH, fname); + flist.push_back(conv); + } + + inFile.ignore(1000, '\n'); + } + + inFile.close(); + + if (!excludes.empty()) + { + // Remove any excluded files + for (auto it = flist.begin(); it != flist.end();) + { + std::wstring name = it->szSrc; + std::transform(name.begin(), name.end(), name.begin(), towlower); + auto item = it; + ++it; + if (excludes.find(name) != excludes.end()) + { + flist.erase(item); + } + } + } + + if (flist.empty()) + { + wprintf(L"WARNING: No file names found in -flist\n"); + } + else + { + files.splice(files.end(), flist); + } + } + void PrintFormat(DXGI_FORMAT Format) { for (auto pFormat = g_pFormats; pFormat->name; pFormat++) @@ -1070,37 +1158,8 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) wprintf(L"Error opening -flist file %ls\n", pValue); return 1; } - wchar_t fname[1024] = {}; - for (;;) - { - inFile >> fname; - if (!inFile) - break; - if (*fname == L'#') - { - // Comment - } - else if (*fname == L'-') - { - wprintf(L"Command-line arguments not supported in -flist file\n"); - return 1; - } - else if (wcspbrk(fname, L"?*") != nullptr) - { - wprintf(L"Wildcards not supported in -flist file\n"); - return 1; - } - else - { - SConversion conv = {}; - wcscpy_s(conv.szSrc, MAX_PATH, fname); - conversion.push_back(conv); - } - - inFile.ignore(1000, '\n'); - } - inFile.close(); + ProcessFileList(inFile, conversion); } break; diff --git a/Texconv/texconv.cpp b/Texconv/texconv.cpp index ad43369..c6f4d4d 100644 --- a/Texconv/texconv.cpp +++ b/Texconv/texconv.cpp @@ -27,12 +27,14 @@ #include #include #include +#include #include #include #include #include #include #include +#include #include #include @@ -617,6 +619,90 @@ namespace } } + void ProcessFileList(std::wifstream& inFile, std::list& files) + { + std::list flist; + std::set excludes; + wchar_t fname[1024] = {}; + for (;;) + { + inFile >> fname; + if (!inFile) + break; + + if (*fname == L'#') + { + // Comment + } + else if (*fname == L'-') + { + if (flist.empty()) + { + wprintf(L"WARNING: Ignoring the line '%ls' in -flist\n", fname); + } + else + { + if (wcspbrk(fname, L"?*") != nullptr) + { + std::list removeFiles; + SearchForFiles(&fname[1], removeFiles, false, nullptr); + + for (auto it : removeFiles) + { + _wcslwr_s(it.szSrc); + excludes.insert(it.szSrc); + } + } + else + { + std::wstring name = (fname + 1); + std::transform(name.begin(), name.end(), name.begin(), towlower); + excludes.insert(name); + } + } + } + else if (wcspbrk(fname, L"?*") != nullptr) + { + SearchForFiles(fname, flist, false, nullptr); + } + else + { + SConversion conv = {}; + wcscpy_s(conv.szSrc, MAX_PATH, fname); + flist.push_back(conv); + } + + inFile.ignore(1000, '\n'); + } + + inFile.close(); + + if (!excludes.empty()) + { + // Remove any excluded files + for (auto it = flist.begin(); it != flist.end();) + { + std::wstring name = it->szSrc; + std::transform(name.begin(), name.end(), name.begin(), towlower); + auto item = it; + ++it; + if (excludes.find(name) != excludes.end()) + { + flist.erase(item); + } + } + } + + if (flist.empty()) + { + wprintf(L"WARNING: No file names found in -flist\n"); + } + else + { + files.splice(files.end(), flist); + } + } + void PrintFormat(DXGI_FORMAT Format) { for (auto pFormat = g_pFormats; pFormat->name; pFormat++) @@ -1771,37 +1857,8 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) wprintf(L"Error opening -flist file %ls\n", pValue); return 1; } - wchar_t fname[1024] = {}; - for (;;) - { - inFile >> fname; - if (!inFile) - break; - if (*fname == L'#') - { - // Comment - } - else if (*fname == L'-') - { - wprintf(L"Command-line arguments not supported in -flist file\n"); - return 1; - } - else if (wcspbrk(fname, L"?*") != nullptr) - { - wprintf(L"Wildcards not supported in -flist file\n"); - return 1; - } - else - { - SConversion conv = {}; - wcscpy_s(conv.szSrc, MAX_PATH, fname); - conversion.push_back(conv); - } - - inFile.ignore(1000, '\n'); - } - inFile.close(); + ProcessFileList(inFile, conversion); } break; diff --git a/Texdiag/texdiag.cpp b/Texdiag/texdiag.cpp index 951dd05..a3be480 100644 --- a/Texdiag/texdiag.cpp +++ b/Texdiag/texdiag.cpp @@ -26,11 +26,14 @@ #include #include #include +#include #include #include #include #include #include +#include +#include #include #include @@ -477,6 +480,90 @@ namespace } } + void ProcessFileList(std::wifstream& inFile, std::list& files) + { + std::list flist; + std::set excludes; + wchar_t fname[1024] = {}; + for (;;) + { + inFile >> fname; + if (!inFile) + break; + + if (*fname == L'#') + { + // Comment + } + else if (*fname == L'-') + { + if (flist.empty()) + { + wprintf(L"WARNING: Ignoring the line '%ls' in -flist\n", fname); + } + else + { + if (wcspbrk(fname, L"?*") != nullptr) + { + std::list removeFiles; + SearchForFiles(&fname[1], removeFiles, false); + + for (auto it : removeFiles) + { + _wcslwr_s(it.szSrc); + excludes.insert(it.szSrc); + } + } + else + { + std::wstring name = (fname + 1); + std::transform(name.begin(), name.end(), name.begin(), towlower); + excludes.insert(name); + } + } + } + else if (wcspbrk(fname, L"?*") != nullptr) + { + SearchForFiles(fname, flist, false); + } + else + { + SConversion conv = {}; + wcscpy_s(conv.szSrc, MAX_PATH, fname); + flist.push_back(conv); + } + + inFile.ignore(1000, '\n'); + } + + inFile.close(); + + if (!excludes.empty()) + { + // Remove any excluded files + for (auto it = flist.begin(); it != flist.end();) + { + std::wstring name = it->szSrc; + std::transform(name.begin(), name.end(), name.begin(), towlower); + auto item = it; + ++it; + if (excludes.find(name) != excludes.end()) + { + flist.erase(item); + } + } + } + + if (flist.empty()) + { + wprintf(L"WARNING: No file names found in -flist\n"); + } + else + { + files.splice(files.end(), flist); + } + } + void PrintFormat(DXGI_FORMAT Format) { for (auto pFormat = g_pFormats; pFormat->name; pFormat++) @@ -3296,37 +3383,8 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) wprintf(L"Error opening -flist file %ls\n", pValue); return 1; } - wchar_t fname[1024] = {}; - for (;;) - { - inFile >> fname; - if (!inFile) - break; - if (*fname == L'#') - { - // Comment - } - else if (*fname == L'-') - { - wprintf(L"Command-line arguments not supported in -flist file\n"); - return 1; - } - else if (wcspbrk(fname, L"?*") != nullptr) - { - wprintf(L"Wildcards not supported in -flist file\n"); - return 1; - } - else - { - SConversion conv = {}; - wcscpy_s(conv.szSrc, MAX_PATH, fname); - conversion.push_back(conv); - } - - inFile.ignore(1000, '\n'); - } - inFile.close(); + ProcessFileList(inFile, conversion); } break;