#include #include #include #include #include #include #include int main(int argc, char* argv[]) { if (argc < 3) { std::cerr << "Usage: " << argv[0] << " \n"; return 1; } // Read file into buffer std::ifstream infile(argv[1], std::ios::binary); if (!infile) { std::cerr << "Error opening input file.\n"; return 1; } std::vector buffer((std::istreambuf_iterator(infile)), std::istreambuf_iterator()); infile.close(); if (buffer.empty()) { std::cerr << "Input file is empty.\n"; return 1; } // 1) Remove all ASCII 155 (0x9B) buffer.erase(std::remove_if(buffer.begin(), buffer.end(), [](char c){ return static_cast(c) == 155 || (c) == 62; }), buffer.end()); // 2) Remove form feed (0x0C) from the last 16 bytes only if (!buffer.empty()) { size_t start = (buffer.size() > 16) ? buffer.size() - 16 : 0; buffer.erase(std::remove(buffer.begin() + start, buffer.end(), (char)12), buffer.end()); } // 3) Remove one space preceding every occurrence of: digit '/' space digit // i.e. remove the single space immediately before the pattern "x/ x" (x = digit) std::vector out; out.reserve(buffer.size()); const size_t n = buffer.size(); for (size_t i = 0; i < n; ++i) { // If current char is a space and the next 4 characters exist and match: // [digit] '/' ' ' [digit] starting at i+1 -> remove this current space (skip it) if (buffer[i] == ' ' && i + 4 < n && std::isdigit(static_cast(buffer[i + 1])) && buffer[i + 2] == '/' && buffer[i + 3] == ' ' && std::isdigit(static_cast(buffer[i + 4]))) { // skip this single space (do not push it to out) continue; } // Otherwise, keep the character out.push_back(buffer[i]); } // 4) Write output std::ofstream outfile(argv[2], std::ios::binary); if (!outfile) { std::cerr << "Error opening output file.\n"; return 1; } if (!out.empty()) { outfile.write(out.data(), out.size()); } outfile.close(); return 0; }