// Entfernung mehrfacher Leerzeichen
// 
// Aufruf: unindent infile outfile
// 
// Klaus Kusche, 2012

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
#include <errno.h>

const char *progName;  // Der Programmname (argv[0]), für Fehlermeldungen

void errMsg(const char *operation, const char *fileName);

// Gib eine schöne Fehlermeldung aus und beende das Programm
// operation ... wobei ist der Fehler passiert?
// fileName  ... welcher File war betroffen?
void errMsg(const char *operation, const char *fileName)
{
  fprintf(stderr, "%s: error %s %s: %s\n",
          progName, operation, fileName, strerror(errno));
  exit(EXIT_FAILURE);
}

int main(int argc, const char *argv[])
{
  FILE *inFile, *outFile;               // Eingabe-File und Ausgabe-File
  const char *inFileName, *outFileName; // Filenamen der beiden Files

  progName = argv[0];
  if (argc != 3) {
    fprintf(stderr, "Aufruf: %s infile outfile\n", progName);
    exit(EXIT_FAILURE);
  }
  inFileName = argv[1];
  if ((inFile = fopen(inFileName, "r")) == NULL) {
    errMsg("opening (for reading)", inFileName);
  }
  outFileName = argv[2];
  if ((outFile = fopen(outFileName, "w")) == NULL) {
    errMsg("opening (for writing)", outFileName);
  }

  int c;         // der aktuelle Buchstabe, int statt char wegen EOF
  int len = 0;   // Anzahl aufeinanderfolgender Leerzeichen
                 // unmittelbar vor dem aktuellen Zeichen
  int max = 0;   // bisher größte Anzahl aufeinanderfolgender Leerzeichen
  int del = 0;   // Anzahl der bisher insgesamt gelöschten Zeichen
  while ((c = fgetc(inFile)) != EOF) {
    if (isspace(c)) {
      if (len == 0) { // erstes Leerzeichen nach echtem Text ==> ausgeben
        if (fputc(c, outFile) == EOF) {
          errMsg("writing", outFileName);
        }
      } else {   // zweites, drittes, ... Leerzeichen: ignorieren
        ++del;
      }
      ++len;  // in beiden Fällen: Zeichen zählen, auf neues Maximum prüfen!
      if (len > max) {
        max = len;
      }
    } else { // kein Leerzeichen
      if (fputc(c, outFile) == EOF) {
        errMsg("writing", outFileName);
      }
      len = 0;  // aktuell keine Leerzeichenfolge
    }
  }
  // wenn die Datei mit einem Leerraum endete: Wie lange war er?
  if (len > max) {
    max = len;
  }

  if (ferror(inFile)) {
    errMsg("reading", inFileName);
  }
  if (fclose(inFile) == EOF) {
    errMsg("closing", inFileName);
  }
  if (fclose(outFile) == EOF) {
    errMsg("closing", outFileName);
  }

  // max enthält Länge der längsten Leerzeiche-Kette (incl. erstem Leerzeichen),
  // Länge der gelöschten Zeichen ist eins kürzer
  fprintf(stderr, "%s: %d chars deleted, longest %d\n",
          inFileName, del, max - 1);
  
  exit(EXIT_SUCCESS);
}
