Source File: unexpand.cpp

// https://www.gnu.org/software/coreutils/manual/html_node/unexpand-invocation.html
#include <fmt/core.h>
#include <fstream>


void convert_file(std::istream& in, int tab_stop) {
  std::string in_line;

  while(in) {
    std::string out_line;
    getline(in, in_line);
    int spaces = 0;

    for(size_t i = 0; i < in_line.size(); i++) {
      char ch = in_line[i];

      switch(ch) {
        case ' ':
          if(++spaces % tab_stop == 0) {
            out_line += '\t';
            spaces = 0;
          }
          break;
        default:
          if(spaces < tab_stop) {
            for(int i = 0; i < spaces; i++) {
              out_line += ' ';
              spaces = 0;
            }
          }
          out_line += ch;
      }
    }

    fmt::println("{}", out_line);
  }
}

int main(int argc, char* argv[]) {
  for(int i = 1; i < argc; i++) {
    std::ifstream in_file{argv[i]};
    convert_file(in_file, 2);
  }
}