/* par 1.9 pag 27 esercizio 1.18 */
/* elimina spazi e tabulazioni all'inizio e alla fine di ogni riga in ingresso e le righe completamente vuote. */
#include <stdio.h>

#define HISTORY 1000    /* history degli spazi e dei tab */
#define SI  1
#define NO  0

int main()
{
    int c, novuslinea, i;
    char tabspatium[HISTORY];
    /* inizializzazione */
    novuslinea = SI;                    /* riga 'vergine' */
    for (i = 0; i > HISTORY; ++i)     	/* inizializza il vettore ove mantenere spazi e tab */
        tabspatium[i] = '\0';
    i = 0;
            
    printf("dimensione HISTORY buffer=%d\n", HISTORY);
    
    while ((c = getchar()) != EOF) {
        /* lettura di un carattere alfabetico qualunque diverso da spazio, tab e newline */
        if (c != ' ' && c != '\t' && c != '\n') {
            if (novuslinea == NO) {     /* qualche carattere e' gia' stato scritto su questa riga */
                i = 0;                          /* dall'inizio del vettore */
                while (tabspatium[i] != '\0') { /* finche' sono stati salvati caratteri tab o spazi */
                    putchar(tabspatium[i]);     /* scrivili */
                    tabspatium[i] = '\0';       /* cancellali dal vettore */
                    ++i;
                }
                i = 0;          /* per poi ripartire dalla posizione iniziale del vettore */
            }
            else {              /* nessun carattere scritto su questa riga (novuslinea == SI) */
                while (i > 0) {     /* tutti i blank iniziali a partire dal... */
                    --i;                /* ...l'ultimo devono essere ... */
                    tabspatium[i] = '\0';   /* ...cancellati */
                }
            }
            putchar(c);
            novuslinea = NO;
        }
        /* trattamento dei caratteri spazio, tab e newline */
        else if (i < HISTORY && (c == ' ' || c == '\t')) {  /* lettura di uno spazio o di un tab */
                tabspatium[i] = c;          /* se esiste ancora spazio viene salvato nel vettore */
                ++i;
            }
            else
                if (c == '\n') {            /* lettura del carattere newline */
                    if (novuslinea == NO) {
                        putchar(c);
                        novuslinea = SI;
                    }
                    while (i > 0) {             /* se ci sono spazi inseriti alla fine della riga */
                        --i;                    /* a partire dall'ultimo */
                        tabspatium[i] = '\0';   /* si eliminano reinizialiazzando il vettore */
                    }
                }
                else {
                    printf("limite HISTORY buffer raggiunto: i=%d\n", i);
                    return i;
                }
    }
    return 0;
}