/* par 1.10 pag 31 esercizio 1.21
   Rimpiazza le stringhe di spazi bianchi con il numero minimo di caratteri di tabulazione e di
   singoli spazi necessario per ottenere la medesima spaziatura
   N.B. idea tratta da Learn To Solve It
*/

#include <stdio.h>

#define TAB     4       /* numero di spazi bianchi equivalente a una tabulazione */

int main()
{
    int c, i, tab, blank;
    
    i = 0;          /* indica la posizione del cursore tra due tabulazioni */
    tab = 0;        /* numero di caratteri di tabulazione da inserire */
    blank = 0;      /* numero di spazi bianchi da inserire */
    
    while ((c = getchar()) != EOF) {
        ++i;                        /* sposta in avanti il cursore */
        if (c == ' ') {             /* inserito uno spazio bianco */
            if (i % TAB == 0) {         /* posizione del cursore coincidente con una tabulazione */
                ++tab;                      /* incrementa il numero di tab da inserire */
                blank = 0;                  /* azzera gli spazi da inserire */
            }
            else {                      /* cursore non coincidente con la tabulazione */
                ++blank;                    /* incrementa il numero di spazi da inserire */
            }
        }
        else {                      /* carattere diverso da uno spazio bianco */
            for ( ; tab > 0; --tab)     /* scrittura di tutti i tab conteggiati */
                putchar('\t');
            if (c == '\t') {        /* se e' stato inserito direttamente un TAB */
                putchar('\t');          /* ...in output anche lui */
                blank = 0;              /* azzeramento degli spazi bianchi rimanenti */
                i = 0;                  /* cursore coincidente con una posizione di tabulazione */
            }
            else {                  /* se NON e' stato inserito direttamente un TAB */
                for ( ; blank > 0; --blank) /* inserisce gli spazi bianchi accumulatisi... */
                    putchar(' ');           /* ...insufficienti per formare un ulteriore tab */
                putchar(c);         /* output del carattere inserito */
                if (c == '\n') {    /* e se e' un newline */
                    i = 0;          /* rimetti il cursore in coincidenza con la tabulazione */ 
                }
            }
        }
    }
}