30 for (
const auto &entry : fs::directory_iterator(
".")) {
31 std::string name = entry.path().filename().string();
33 if (name.empty() || name[0] ==
'.') {
39 if (name.find(
"config") == std::string::npos &&
40 name.find(
"ini") == std::string::npos) {
45 auto upos = name.rfind(
'_');
46 if (upos == std::string::npos) {
51 auto dpos = name.rfind(
'.');
52 if (dpos == std::string::npos || dpos <= upos) {
56 std::string numstr = name.substr(upos + 1, dpos - upos - 1);
59 std::from_chars(numstr.data(), numstr.data() + numstr.size(), value);
60 if (parsed.ec == std::errc{} && parsed.ptr != numstr.data()) {
61 const int i = value + 1;
72 std::vector<std::string> filenames;
74 for (
const auto &entry : fs::directory_iterator(
".")) {
75 std::string originalFilename = entry.path().filename().string();
77 if (originalFilename.empty() || originalFilename[0] ==
'.') {
81 if (std::ranges::count(originalFilename,
'_') < 1) {
86 auto upos = originalFilename.rfind(
'_');
87 if (upos == std::string::npos) {
92 auto dpos = originalFilename.rfind(
'.');
93 if (dpos == std::string::npos || dpos <= upos) {
99 const size_t numBegin = upos + 1;
100 size_t numEnd = numBegin;
101 while (numEnd < originalFilename.size() &&
102 std::isdigit(
static_cast<unsigned char>(originalFilename[numEnd]))) {
105 if (numEnd == numBegin || numEnd >= originalFilename.size() ||
106 originalFilename[numEnd] !=
'.') {
109 int bundleNumber = 0;
111 std::from_chars(originalFilename.data() + numBegin,
112 originalFilename.data() + numEnd, bundleNumber);
113 if (parsed.ec != std::errc{} ||
114 parsed.ptr != originalFilename.data() + numEnd) {
117 if (bundleNumber != number) {
121 std::string baseName = originalFilename.substr(0, upos);
126 originalFilename.find_first_not_of(
"0123456789", upos + 1);
127 if (extStart == std::string::npos) {
128 extStart = originalFilename.size();
130 std::string newFilename = baseName + originalFilename.substr(extStart);
133 fs::copy_file(originalFilename, newFilename,
134 fs::copy_options::overwrite_existing);
135 filenames.push_back(newFilename);
136 }
catch (
const fs::filesystem_error &e) {
137 EONC_LOG_ERROR(
"unbundle: problem copying {} to {}: {}", originalFilename,
138 newFilename, e.what());
180void bundle(
int number,
const std::vector<std::string> &filenames,
181 std::vector<std::string> *bundledFilenames) {
182 for (
const auto &filename : filenames) {
183 const auto [baseName, ext] = splitBundleExtension(filename);
184 const std::string newFilename =
185 std::format(
"{}_{}{}", baseName, number, ext);
188 fs::rename(filename, newFilename);
189 bundledFilenames->push_back(newFilename);
190 }
catch (
const fs::filesystem_error &e) {
192 newFilename, e.what());