From bed1c7f20d7402f93877a61189277e9111f85a5a Mon Sep 17 00:00:00 2001 From: xp986 <> Date: Wed, 8 Oct 2025 23:37:25 -0500 Subject: [PATCH 1/6] Initail commit with working version. --- ReportTruncate-Robinson.cpp | 163 ++++++++++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 ReportTruncate-Robinson.cpp diff --git a/ReportTruncate-Robinson.cpp b/ReportTruncate-Robinson.cpp new file mode 100644 index 0000000..16ef265 --- /dev/null +++ b/ReportTruncate-Robinson.cpp @@ -0,0 +1,163 @@ +#include +#include +#include +#include +#include +#include + +static const std::regex number_regex_full(R"(\d+)"); +static const std::regex number_regex_1to3(R"(\b\d{1,3}\b)"); + +// Find the first number in a line using the given regex +bool find_first_number_in_line(const std::string& s, int& out, const std::regex& rx) { + std::smatch m; + if (std::regex_search(s, m, rx)) { + out = std::stoi(m.str()); + return true; + } + return false; +} + +// Check if a line contains exactly 24 consecutive '?' +bool has_exactly_24_A(const std::string& s) { + int count = 0; + for (size_t i = 0; i <= s.size(); ++i) { + if (i < s.size() && s[i] == (char)196) { + count++; + } + else { + if (count == 24) return true; // exact match found + count = 0; // reset counter + } + } + return false; +} + +int main(int argc, char* argv[]) { + if (argc < 3) { + std::cerr << "Usage: " << argv[0] << " \n"; + return 1; + } + + std::ifstream infile(argv[1]); + if (!infile) { + std::cerr << "Error opening input file.\n"; + return 1; + } + + std::ofstream outfile(argv[2]); + if (!outfile) { + std::cerr << "Error opening output file.\n"; + return 1; + } + + std::vector lines; + std::string line; + while (std::getline(infile, line)) { + lines.push_back(line); + } + + const std::string marker = "F.L.C.M. %"; + + // === 1) Find marker index === + bool marker_found = false; + size_t marker_index = 0; + for (size_t i = 0; i < lines.size(); ++i) { + if (lines[i].find(marker) != std::string::npos) { + marker_found = true; + marker_index = i; + break; + } + } + + if (!marker_found) { + for (const auto& l : lines) outfile << l << '\n'; + return 0; + } + + // === 2) Extract gyros from "BBGYRO" line === + int gyros = 0; + bool gyros_found = false; + size_t bbgyro_index = std::string::npos; + const std::string bbgyro_token = "BBGYRS"; + + for (size_t i = 0; i < lines.size(); ++i) { + size_t pos = lines[i].find(bbgyro_token); + if (pos != std::string::npos) { + bbgyro_index = i; + std::string tail = lines[i].substr(pos + bbgyro_token.size()); + if (find_first_number_in_line(tail, gyros, number_regex_full)) { + gyros_found = true; + } + break; + } + } + + // === 3) Extract total_subs === + int total_subs = 0; + + auto find_total_after_start_index = [&](size_t start_index) -> bool { + for (size_t j = start_index; j < lines.size(); ++j) { + if (has_exactly_24_A(lines[j])) { + if (j + 1 < lines.size()) { + if (find_first_number_in_line(lines[j + 1], total_subs, number_regex_1to3)) { + return true; + } + } + } + } + return false; + }; + + if (gyros_found) { + find_total_after_start_index(bbgyro_index + 1); + } + else { + // Fallback: second "SUBS" + int subs_count = 0; + size_t subs_index = std::string::npos; + for (size_t i = 0; i < lines.size(); ++i) { + if (lines[i].find("SUBS") != std::string::npos) { + subs_count++; + if (subs_count == 2) { + subs_index = i; + break; + } + } + } + if (subs_index != std::string::npos) { + find_total_after_start_index(subs_index + 1); + } + } + + // === 4) Truncate document after the marker === + std::vector truncated(lines.begin(), lines.begin() + marker_index + 1); + + // === 5) Insert TOTAL SUBS --- diff before first form feed === + int diff = total_subs - gyros; + const std::string insert_line = "\n\n\r ROLLS USED --- " + std::to_string(diff); + + bool inserted = false; + for (const auto& l : truncated) { + size_t ff_pos = l.find('\f'); + if (!inserted && ff_pos != std::string::npos) { + std::string modified = l.substr(0, ff_pos) + insert_line + l.substr(ff_pos); + outfile << modified << '\n'; + inserted = true; + } + else { + outfile << l << '\n'; + } + } + + if (!inserted) { + outfile << insert_line << '\n'; + } + + if (inserted) { + // === 6) Append a form feed to the very end of the truncated document === + outfile << '\f'; + } + + return 0; +} From ee5368cf1936e9264a4ea4363507d04a44511c2b Mon Sep 17 00:00:00 2001 From: xp986 Date: Wed, 8 Oct 2025 23:30:41 -0500 Subject: [PATCH 2/6] Initial commit --- LICENSE | 18 ++++++++++++++++++ README.md | 3 +++ 2 files changed, 21 insertions(+) create mode 100644 LICENSE create mode 100644 README.md diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..52331d9 --- /dev/null +++ b/LICENSE @@ -0,0 +1,18 @@ +MIT License + +Copyright (c) 2025 xp986 + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and +associated documentation files (the "Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial +portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT +LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO +EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..3883f92 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# ReportTruncate-Robinson + +Truncates the daily report from the BonAppetit system. Modifications for the Robinson store. \ No newline at end of file From 28f6c6d46c2cbfa24fe748909e6e8d4d75ca6cc3 Mon Sep 17 00:00:00 2001 From: xp986 <> Date: Thu, 9 Oct 2025 00:18:55 -0500 Subject: [PATCH 3/6] Removed adding newlines to non-daily reports. --- ReportTruncate-Robinson.cpp | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/ReportTruncate-Robinson.cpp b/ReportTruncate-Robinson.cpp index 16ef265..661174d 100644 --- a/ReportTruncate-Robinson.cpp +++ b/ReportTruncate-Robinson.cpp @@ -146,14 +146,10 @@ int main(int argc, char* argv[]) { inserted = true; } else { - outfile << l << '\n'; + outfile << l; } } - if (!inserted) { - outfile << insert_line << '\n'; - } - if (inserted) { // === 6) Append a form feed to the very end of the truncated document === outfile << '\f'; From 2647432b04065cef0fe35cbafe6390f29c11223a Mon Sep 17 00:00:00 2001 From: xp986 <> Date: Thu, 9 Oct 2025 00:30:45 -0500 Subject: [PATCH 4/6] Fixed line endings. --- ReportTruncate-Robinson.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ReportTruncate-Robinson.cpp b/ReportTruncate-Robinson.cpp index 661174d..1625776 100644 --- a/ReportTruncate-Robinson.cpp +++ b/ReportTruncate-Robinson.cpp @@ -142,7 +142,7 @@ int main(int argc, char* argv[]) { size_t ff_pos = l.find('\f'); if (!inserted && ff_pos != std::string::npos) { std::string modified = l.substr(0, ff_pos) + insert_line + l.substr(ff_pos); - outfile << modified << '\n'; + outfile << modified; inserted = true; } else { From 55ac790b43a7836f5a55f8008762680f250d6bfb Mon Sep 17 00:00:00 2001 From: xp986 <> Date: Thu, 9 Oct 2025 01:21:30 -0500 Subject: [PATCH 5/6] Switch to alameda code, with search for BBGYRS instead of BBGYRO --- ReportTruncate-Robinson.cpp | 340 +++++++++++++++++++----------------- 1 file changed, 181 insertions(+), 159 deletions(-) diff --git a/ReportTruncate-Robinson.cpp b/ReportTruncate-Robinson.cpp index 1625776..d63057b 100644 --- a/ReportTruncate-Robinson.cpp +++ b/ReportTruncate-Robinson.cpp @@ -1,159 +1,181 @@ -#include -#include -#include -#include -#include -#include - -static const std::regex number_regex_full(R"(\d+)"); -static const std::regex number_regex_1to3(R"(\b\d{1,3}\b)"); - -// Find the first number in a line using the given regex -bool find_first_number_in_line(const std::string& s, int& out, const std::regex& rx) { - std::smatch m; - if (std::regex_search(s, m, rx)) { - out = std::stoi(m.str()); - return true; - } - return false; -} - -// Check if a line contains exactly 24 consecutive '?' -bool has_exactly_24_A(const std::string& s) { - int count = 0; - for (size_t i = 0; i <= s.size(); ++i) { - if (i < s.size() && s[i] == (char)196) { - count++; - } - else { - if (count == 24) return true; // exact match found - count = 0; // reset counter - } - } - return false; -} - -int main(int argc, char* argv[]) { - if (argc < 3) { - std::cerr << "Usage: " << argv[0] << " \n"; - return 1; - } - - std::ifstream infile(argv[1]); - if (!infile) { - std::cerr << "Error opening input file.\n"; - return 1; - } - - std::ofstream outfile(argv[2]); - if (!outfile) { - std::cerr << "Error opening output file.\n"; - return 1; - } - - std::vector lines; - std::string line; - while (std::getline(infile, line)) { - lines.push_back(line); - } - - const std::string marker = "F.L.C.M. %"; - - // === 1) Find marker index === - bool marker_found = false; - size_t marker_index = 0; - for (size_t i = 0; i < lines.size(); ++i) { - if (lines[i].find(marker) != std::string::npos) { - marker_found = true; - marker_index = i; - break; - } - } - - if (!marker_found) { - for (const auto& l : lines) outfile << l << '\n'; - return 0; - } - - // === 2) Extract gyros from "BBGYRO" line === - int gyros = 0; - bool gyros_found = false; - size_t bbgyro_index = std::string::npos; - const std::string bbgyro_token = "BBGYRS"; - - for (size_t i = 0; i < lines.size(); ++i) { - size_t pos = lines[i].find(bbgyro_token); - if (pos != std::string::npos) { - bbgyro_index = i; - std::string tail = lines[i].substr(pos + bbgyro_token.size()); - if (find_first_number_in_line(tail, gyros, number_regex_full)) { - gyros_found = true; - } - break; - } - } - - // === 3) Extract total_subs === - int total_subs = 0; - - auto find_total_after_start_index = [&](size_t start_index) -> bool { - for (size_t j = start_index; j < lines.size(); ++j) { - if (has_exactly_24_A(lines[j])) { - if (j + 1 < lines.size()) { - if (find_first_number_in_line(lines[j + 1], total_subs, number_regex_1to3)) { - return true; - } - } - } - } - return false; - }; - - if (gyros_found) { - find_total_after_start_index(bbgyro_index + 1); - } - else { - // Fallback: second "SUBS" - int subs_count = 0; - size_t subs_index = std::string::npos; - for (size_t i = 0; i < lines.size(); ++i) { - if (lines[i].find("SUBS") != std::string::npos) { - subs_count++; - if (subs_count == 2) { - subs_index = i; - break; - } - } - } - if (subs_index != std::string::npos) { - find_total_after_start_index(subs_index + 1); - } - } - - // === 4) Truncate document after the marker === - std::vector truncated(lines.begin(), lines.begin() + marker_index + 1); - - // === 5) Insert TOTAL SUBS --- diff before first form feed === - int diff = total_subs - gyros; - const std::string insert_line = "\n\n\r ROLLS USED --- " + std::to_string(diff); - - bool inserted = false; - for (const auto& l : truncated) { - size_t ff_pos = l.find('\f'); - if (!inserted && ff_pos != std::string::npos) { - std::string modified = l.substr(0, ff_pos) + insert_line + l.substr(ff_pos); - outfile << modified; - inserted = true; - } - else { - outfile << l; - } - } - - if (inserted) { - // === 6) Append a form feed to the very end of the truncated document === - outfile << '\f'; - } - - return 0; -} +#include +#include +#include +#include +#include +#include + +static const std::regex number_regex_full(R"(\d+)"); +static const std::regex number_regex_1to3(R"(\b\d{1,3}\b)"); + +// Find the first number in a line using the given regex +bool find_first_number_in_line(const std::string& s, int& out, const std::regex& rx) { + std::smatch m; + if (std::regex_search(s, m, rx)) { + out = std::stoi(m.str()); + return true; + } + return false; +} + +// Check if a line contains exactly 24 consecutive 'Ä' +bool has_exactly_24_A(const std::string& s) { + int count = 0; + for (size_t i = 0; i <= s.size(); ++i) { + if (i < s.size() && s[i] == (char)196) { + count++; + } + else { + if (count == 24) return true; // exact match found + count = 0; // reset counter + } + } + return false; +} + +int main(int argc, char* argv[]) { + if (argc < 3) { + std::cerr << "Usage: " << argv[0] << " \n"; + return 1; + } + + // Read entire file into memory as lines + std::ifstream infile(argv[1], std::ios::binary); + if (!infile) { + std::cerr << "Error opening input file.\n"; + return 1; + } + + std::ofstream outfile(argv[2], std::ios::binary); + if (!outfile) { + std::cerr << "Error opening output file.\n"; + return 1; + } + + std::vector lines; + std::string line; + while (std::getline(infile, line)) { + if (!infile.eof()) line += '\n'; // preserve original line endings + lines.push_back(line); + } + + // Detect if document should be modified + bool has_bbgyro = false; + bool has_subs = false; + for (const auto& l : lines) { + if (!has_bbgyro && l.find("BBGYRS") != std::string::npos) has_bbgyro = true; + if (!has_subs && l.find("SUBS") != std::string::npos) has_subs = true; + if (has_bbgyro || has_subs) break; + } + + // If neither BBGYRO nor SUBS appears, pass file through unmodified + if (!has_bbgyro && !has_subs) { + infile.clear(); + infile.seekg(0, std::ios::beg); + outfile << infile.rdbuf(); // exact byte-for-byte copy + return 0; + } + + const std::string marker = "F.L.C.M. %"; + + // === 1) Find marker index === + bool marker_found = false; + size_t marker_index = 0; + for (size_t i = 0; i < lines.size(); ++i) { + if (lines[i].find(marker) != std::string::npos) { + marker_found = true; + marker_index = i; + break; + } + } + + if (!marker_found) { + // Marker not found, write original file unchanged + infile.clear(); + infile.seekg(0, std::ios::beg); + outfile << infile.rdbuf(); + return 0; + } + + // === 2) Extract gyros from "BBGYRO" line === + int gyros = 0; + bool gyros_found = false; + size_t bbgyro_index = std::string::npos; + const std::string bbgyro_token = "BBGYRO"; + + for (size_t i = 0; i < lines.size(); ++i) { + size_t pos = lines[i].find(bbgyro_token); + if (pos != std::string::npos) { + bbgyro_index = i; + std::string tail = lines[i].substr(pos + bbgyro_token.size()); + if (find_first_number_in_line(tail, gyros, number_regex_full)) { + gyros_found = true; + } + break; + } + } + + // === 3) Extract total_subs === + int total_subs = 0; + + auto find_total_after_start_index = [&](size_t start_index) -> bool { + for (size_t j = start_index; j < lines.size(); ++j) { + if (has_exactly_24_A(lines[j])) { + if (j + 1 < lines.size()) { + if (find_first_number_in_line(lines[j + 1], total_subs, number_regex_1to3)) { + return true; + } + } + } + } + return false; + }; + + if (gyros_found) { + find_total_after_start_index(bbgyro_index + 1); + } + else { + // Fallback: second "SUBS" + int subs_count = 0; + size_t subs_index = std::string::npos; + for (size_t i = 0; i < lines.size(); ++i) { + if (lines[i].find("SUBS") != std::string::npos) { + subs_count++; + if (subs_count == 2) { + subs_index = i; + break; + } + } + } + if (subs_index != std::string::npos) { + find_total_after_start_index(subs_index + 1); + } + } + + // === 4) Truncate document after the marker === + std::vector truncated(lines.begin(), lines.begin() + marker_index + 1); + + // === 5) Insert TOTAL SUBS --- diff before first form feed === + int diff = total_subs - gyros; + const std::string insert_line = "\n\n\r ROLLS USED --- " + std::to_string(diff); + + bool inserted = false; + for (const auto& l : truncated) { + size_t ff_pos = l.find('\f'); + if (!inserted && ff_pos != std::string::npos) { + std::string modified = l.substr(0, ff_pos) + insert_line + l.substr(ff_pos); + outfile << modified; + inserted = true; + } + else { + outfile << l; + } + } + + if (inserted) { + // === 6) Append a form feed to the very end of the truncated document === + outfile << '\f'; + } + + return 0; +} \ No newline at end of file From 70c9e35ae428665a852ddc1c8cb8e0f4c8fa3040 Mon Sep 17 00:00:00 2001 From: xp986 <> Date: Thu, 9 Oct 2025 01:31:27 -0500 Subject: [PATCH 6/6] Missed a reference to BBGYRO --- ReportTruncate-Robinson.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ReportTruncate-Robinson.cpp b/ReportTruncate-Robinson.cpp index d63057b..a23bff1 100644 --- a/ReportTruncate-Robinson.cpp +++ b/ReportTruncate-Robinson.cpp @@ -101,7 +101,7 @@ int main(int argc, char* argv[]) { int gyros = 0; bool gyros_found = false; size_t bbgyro_index = std::string::npos; - const std::string bbgyro_token = "BBGYRO"; + const std::string bbgyro_token = "BBGYRS"; for (size_t i = 0; i < lines.size(); ++i) { size_t pos = lines[i].find(bbgyro_token); @@ -178,4 +178,4 @@ int main(int argc, char* argv[]) { } return 0; -} \ No newline at end of file +}