palabra.cpp

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

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

// Otros módulos de la aplicación

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


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

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

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


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

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

const char NULO = '\0';
const char EOL = '\n';


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

char PAL_car = '\0';    // carácter leído por anticipado

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

// Leer el siguiente carácter de la entrada estándar en PAL_car
void PAL_LeerCar ();


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


//***************************************************************
//
//  FUNCION: PAL_EsSeparadorNulo       TIPO: bool
//
//  DESCRIPCION:
//    Indica si un separador es nulo
//
//  RESTRICCIONES DE USO:
//
//  VARIABLES GLOBALES Y PUBLICAS LEIDAS:
//
//  VARIABLES GLOBALES Y PUBLICAS MODIFICADAS:
//
//***************************************************************
bool PAL_EsSeparadorNulo (PAL_Separador_t separador)
{
    return (separador.PAL_salto <= 0 &&
            separador.PAL_sangrado == 0);

} // PAL_EsSeparadorNulo


//***************************************************************
//
//  FUNCION: PAL_Iniciar               TIPO:
//
//  DESCRIPCION:
//    Inicia la lectura de la entrada estándar.
//    Lee el primer carácter por anticipado
//
//  RESTRICCIONES DE USO:
//    Sólo debe invocarse una vez, antes de leer cualquier palabra
//
//  VARIABLES GLOBALES Y PUBLICAS LEIDAS:
//
//  VARIABLES GLOBALES Y PUBLICAS MODIFICADAS:
//    PAL_car
//
//***************************************************************
void PAL_Iniciar (void)
{
    PAL_LeerCar ();

} // PAL_Iniciar


//***************************************************************
//
//  FUNCION: PAL_Leer                 TIPO:
//
//  DESCRIPCION:
//    Lee una apalbra de la entrada estándar.
//    Devuelve la separación desde la palabra anterior.
//    Devuelve indicación de si se agota el fichero de entrada
//
//  RESTRICCIONES DE USO:
//    Sólo debe invocarse después de iniciar la lectura del fichero
//
//  VARIABLES GLOBALES Y PUBLICAS LEIDAS:
//
//  VARIABLES GLOBALES Y PUBLICAS MODIFICADAS:
//    PAL_car
//
//***************************************************************
void PAL_c::PAL_Leer (
    PAL_Separador_t* separador_p,   // separación desde la palabra anterior
    bool* finDeFichero_p            // indicación de fin de fichero
)
{
    int salto;      // líneas en blanco delante
    int sangra;     // espacios en blanco delante
    int pos;        // posición dentro de la palabra

    //---- Buscar el comienzo de la palabra, leyendo el separador
    salto = -1;
    sangra = 0;
    while (PAL_car == ' ' || PAL_car == EOL){
        if (PAL_car == ' ') {
            sangra++;
        } else if (PAL_car == EOL) {
            salto++;
            sangra = 0;
        }
        PAL_LeerCar ();
    }

    if (salto < 0) {
        sangra = 0;
    }

    separador_p->PAL_salto = salto;
    separador_p->PAL_sangrado = sangra;

    //---- Leer los caracteres de la palabra
    pos = 0;
    while (PAL_car != ' ' && PAL_car != EOL && PAL_car != NULO &&
           pos < PAL_MAXCAR) {
        PAL_texto[pos] = PAL_car;
        pos++;
        PAL_LeerCar ();
    }
    PAL_texto[pos] = NULO;

    //---- Decide si se ha agotado el fichero
    *finDeFichero_p = (pos == 0);

} // PAL_Leer


//***************************************************************
//
//  FUNCION: PAL_Imprimir              TIPO: 
//
//  DESCRIPCION:
//    Imprime la palabra por la salida estándar
//
//  RESTRICCIONES DE USO:
//
//  VARIABLES GLOBALES Y PUBLICAS LEIDAS:
//
//  VARIABLES GLOBALES Y PUBLICAS MODIFICADAS:
//
//***************************************************************
void PAL_c::PAL_Imprimir (void) const
{
    printf ("%s", PAL_texto);
} // PAL_Imprimir


//***************************************************************
//
//  FUNCION: PAL_Longitud              TIPO: 
//
//  DESCRIPCION:
//    Devuelve la longitud de la palabra
//
//  RESTRICCIONES DE USO:
//
//  VARIABLES GLOBALES Y PUBLICAS LEIDAS:
//
//  VARIABLES GLOBALES Y PUBLICAS MODIFICADAS:
//
//***************************************************************
int PAL_c::PAL_Longitud (void) const
{
    return strlen (PAL_texto);

} // PAL_Longitud



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


//***************************************************************
//
//  FUNCION: PAL_LeerCar               TIPO:
//
//  DESCRIPCION:
//    Lee el siguiente carácter por anticipado.
//    Si se agota el fichero, devuelve NULO
//
//  RESTRICCIONES DE USO:
//
//  VARIABLES GLOBALES Y PUBLICAS LEIDAS:
//
//  VARIABLES GLOBALES Y PUBLICAS MODIFICADAS:
//    PAL_car
//
//***************************************************************
void PAL_LeerCar ()
{
    int c;

    c = getchar ();
    if (c != EOF) {
        PAL_car = c;
    } else {
        PAL_car = NULO;
    }
} // PAL_LeerCar