// lab15.cpp (C) 2007 adolfo@di-mare.com

/** \file  lab15.cpp
    \brief Muestra cómo centrar una hilera.
    \author Adolfo Di Mare <adolfo@di-mare.com>
    \date   2007
*/

#include <iostream>
#include <stdlib.h> // malloc() && free()
#include <string.h> // strlen()

/** Retorna el valor de \c "hilera" centrado en una hilera de longitud \c "N".
    - Si <code> N <= strlen( hilera) </code> retorna \c "hilera".
    - El programador cliente siempre debe retornar la memoria de la hilera
      invocando la función de biblioteca \c free() (en <code> #include <stdlib.h> </code>).
*/
char * Centrador( const char * hilera, int N ) {
    unsigned LEN = strlen( hilera );         // LEN es la longitud de "hilera"
    char *   res = (char*) malloc( 1+LEN );  // "res" contiene la hilera a retornar
    if ( N <= LEN ) {
        return (char*) memcpy( res , hilera, 1+LEN ); // copia la hilera y luego la retorna
    }

    int adelante = ( N - LEN ) / 2;
    char * p = res; int i;
    for (i=0; i<adelante; ++i) {
        *p = ' '; ++p; // pone los blancos de adelante
    }
    memcpy( p , hilera, LEN ); // copia la hilera centrada
    p += LEN;
    unsigned atras = N - adelante - LEN;
    for (i=0; i<atras; ++i) {
        *p = ' '; ++p; // pone los blancos de atrás
    }
    *p = 0; // pone el fin de la hilera
    return res;
}

#include <limits.h> // INT_MAX

/// Programa principal.
int main() {

    cout << "Ingrese la hilera a centrar: ";
    char hilera[256];
    cin.get( hilera , sizeof(hilera)-1, '\n' ); // lee la hilera de trabajo
//  cin.ignore(INT_MAX, '\n'); // desecha el resto del renglón

    for ( int i=20; i<=30; ++i ) {
        char * centrada = Centrador( hilera , i );
        cout << "i == " << i << " ==> [" << centrada << ']' << endl;
        free( centrada ); // hay que devolver la memoria dinámica que Centrador() toma
    }
    return 0;
}

// EOF: lab15.cpp