linea.cpp

// $Id:$
//***************************************************************
//
//  PROYECTO: AJUSTAR
//
//  NOMBRE MODULO: Linea
//  PREFIJO:       LIN
//
//  AUTOR/ES: M. Collado
//
//  DESCRIPCION DEL MODULO:
//    Clase Linea
//
//***************************************************************

// Módulos de sistema
#include <stdio.h>

// Otros módulos de la aplicación

// Este mismo módulo
#include "linea.h"


//***************************************************************
//  PARTE PUBLICA:
//***************************************************************

//---------------------------------------------------------------
// Constantes públicas:
//---------------------------------------------------------------

//---------------------------------------------------------------
// Variables públicas:
//---------------------------------------------------------------


//***************************************************************
//  PARTE PRIVADA:
//***************************************************************

//---------------------------------------------------------------
// Literales, macros, constantes y tipos privados:
//---------------------------------------------------------------

//---------------------------------------------------------------
// Variables globales del módulo:
//---------------------------------------------------------------

//---------------------------------------------------------------
// Prototipos de las funciones privadas:
//---------------------------------------------------------------


//***************************************************************
//  DEFINICION DE LAS FUNCIONES PUBLICAS DEL MODULO
//***************************************************************


//***************************************************************
//
//  FUNCION: LIN_Iniciar               TIPO:
//
//  DESCRIPCION:
//    Inicializa la linea de salida vacia, sin palabras, solo con
//    el sangrado inicial.
//
//  EXCEPCIÓN:
//    Si el sangrado es mayor que la longitud maxima, lo limita a
//    la longitud maxima.
//
//  RESTRICCIONES DE USO:
//
//  VARIABLES GLOBALES Y PUBLICAS LEIDAS:
//
//  VARIABLES GLOBALES Y PUBLICAS MODIFICADAS:
//
//***************************************************************
void LIN_c::LIN_Iniciar (int sangrado)
{
    if (sangrado > LIN_MAXCAR) {
        LIN_sangrado = LIN_MAXCAR;
    } else {
        LIN_sangrado = sangrado;
    }
    LIN_numPal = 0;
    LIN_longitud = LIN_sangrado;
} // LIN_Iniciar


//***************************************************************
//
//  FUNCION: LIN_PonerPalabra          TIPO:
//
//  DESCRIPCION:
//    Pone la palabra en la línea, a continuación de las anteriores.
//
//  RESTRICCIONES DE USO:
//    La palabra debe caber en el espacio libre en la línea.
//
//  VARIABLES GLOBALES Y PUBLICAS LEIDAS:
//
//  VARIABLES GLOBALES Y PUBLICAS MODIFICADAS:
//
//***************************************************************
void LIN_c::LIN_PonerPalabra (const PAL_c* palabra_p)
{
    if (LIN_numPal > 0) LIN_longitud++;
    LIN_palabras[LIN_numPal] = *palabra_p;
    LIN_numPal++;
    LIN_longitud += palabra_p->PAL_Longitud ();

} // LIN_PonerPalabra


//***************************************************************
//
//  FUNCION: LIN_Imprimir              TIPO:
//
//  DESCRIPCION:
//    Imprime la linea, separando las palabras con un blanco entre ellas.
//    El sangrado se respeta exactamente.
//
//  RESTRICCIONES DE USO:
//    La linea debe estar iniciada.
//
//  VARIABLES GLOBALES Y PUBLICAS LEIDAS:
//
//  VARIABLES GLOBALES Y PUBLICAS MODIFICADAS:
//
//***************************************************************
void LIN_c::LIN_Imprimir () const
{
    int k;      // contador de palabras

    if (LIN_numPal > 0) {
        if (LIN_sangrado > 0) {
            printf ("%*s", LIN_sangrado, " ");
        }
        LIN_palabras[0].PAL_Imprimir ();
        for (k = 1; k < LIN_numPal; k++) {
            putchar (' ');
            LIN_palabras[k].PAL_Imprimir ();
        }
    }
    printf ("\n");

} // LIN_Imprimir


//***************************************************************
//
//  FUNCION: LIN_ImprimirAjustada      TIPO:
//
//  DESCRIPCION:
//    Imprime la linea en curso, repartiendo el espacio sobrante
//    entre las palabras para justificar el margen derecho.
//    El sangrado se respeta exactamente.
//
//    Si sólo hay una palabra, se deja el espacio sobrante al final
//    de la línea.
//    Si no hay palabras, se imprime una línea en blanco, vacía.
//
//  RESTRICCIONES DE USO:
//    La linea debe estar iniciada.
//
//  VARIABLES GLOBALES Y PUBLICAS LEIDAS:
//
//  VARIABLES GLOBALES Y PUBLICAS MODIFICADAS:
//
//***************************************************************
void LIN_c::LIN_ImprimirAjustada () const
{
    int k;          // contador de palabras
    int quedan;     // número de palabras que faltan por imprimir
    int blancos;    // espacio en blanco a repartir entre palabras
    int delante;    // espacio en blanco delante de una palabra

    if (LIN_numPal > 0) {
        if (LIN_sangrado > 0) {
            printf ("%*s", LIN_sangrado, " ");
        }
        LIN_palabras[0].PAL_Imprimir ();
        quedan = LIN_numPal - 1;
        blancos = LIN_MAXCAR - LIN_longitud + quedan;
        for (k = 1; k < LIN_numPal; k++) {
            delante = (blancos + quedan / 2) / quedan;
            printf ("%*s", delante, " ");
            LIN_palabras[k].PAL_Imprimir ();
            blancos -= delante;
            quedan--;
        }
    }
    printf ("\n");

} // LIN_ImprimirAjustada


//***************************************************************
//
//  FUNCION: LIN_CabePalabra           TIPO: bool
//
//  DESCRIPCION:
//    Indica si la palabra cabe en la línea, incluyendo el espacio
//    necesario para separarla de la anterior.
//
//  RESTRICCIONES DE USO:
//    La linea debe estar iniciada.
//
//  VARIABLES GLOBALES Y PUBLICAS LEIDAS:
//
//  VARIABLES GLOBALES Y PUBLICAS MODIFICADAS:
//
//***************************************************************
bool LIN_c::LIN_CabePalabra (const PAL_c* palabra_p) const
{
    return LIN_longitud + palabra_p->PAL_Longitud () < LIN_MAXCAR;

} // LIN_CabePalabra


//***************************************************************
//  DEFINICION DE LAS FUNCIONES PRIVADAS DEL MODULO
//***************************************************************