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);
}
}