/*  paragrafo 1.9   pagina 31   esercizio 1.22
    Spezza le righe in ingresso troppo lunghe in due o piu' righe brevi; la riga e' interrotta dopo
    l'ultimo carattere diverso da uno spazio che occorra prima dell'n-esima colonna di testo in
    ingresso.
*/
#include <stdio.h>
#define MAXLINE 1000    /*  lunghezza massima della riga in input */
#define MARGINE 30      /*  massima lunghezza in output della riga */

int getline(char line[], int maxline);  /*  input di una riga terminata da newline */
int is_separator(char c);               /*  verifica se c e' una lettera o un numero */

int main()
{
    char line[MAXLINE];
    int i, j, len;
    
    printf("Dimensione buffer: %4d caratteri, limite output: %3d\n", MAXLINE, MARGINE);
    while ((len = getline(line, MAXLINE)) > 0) {
        i = 0;
        j = MARGINE - 1;
        while (j < len) {
            while (j > i &&  is_separator(line[j]) == 0)
                --j;
            if (j == i)
                j = j + MARGINE - 1;
            for ( ; i <= j; ++i)
                putchar(line[i]);
            if (line[i] != '\n' && line[i] != '\0')
                putchar('\n');
            j = i + MARGINE - 1;
        }
        for ( ; i <= len; ++i)
            putchar(line[i]);
        if (line[len - 1] != '\n')
            putchar('\n');
    }
    return 0;
}

/*  getline: legge una riga in ingresso, la assegna a s, ne restituisce la lunghezza */
int getline(char s[], int lim)
{
    int c, i;
    
    for (i = 0; i < lim - 1 && (c = getchar()) != EOF && c != '\n'; ++i) {
        s[i] = c;
    }
    if (c == '\n') {
        s[i] = c;
        ++i;
    }
    s[i] = '\0';
    return i;
}

/*  is_separator: verifica se il carattere e' un separatore di parole.
    Considera appartenente all'alfabeto le lettere maiuscole e minuscole e le cifre. Qualunque altro
    carattere ascii e' un separatore.
    Se e' un separatore restituisce 1, se e' una lettera o una cifra restituisce 0.
    Non ho idea di come funzioni coi caratteri Unicode e le lettere accentate!
*/
int is_separator(char c)
{
    if ((c >= '0' && c <= '9') || (c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'))
        return 0;
    else
        return 1;
}