/*--------------------------------------------------------------------
 * FICHERO:       Cadena.h
 * OBJETIVO:      Definir el objeto "Cadena"
 * IDENTIFICADOR: Cad
 * AUTOR:         Pedro Reina
 * FECHA:         D.6.8.1995
 * OBJETOS UTILIZADOS: Memoria, Carcter
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------------
 * Funciones pblicas
 *
 *   Cad_Copia()             Cadena.h
 *   Cad_Longitud()          Cadena.h
 *   Cad_Entero()            Cadena.h
 *   Cad_Destruye()          Cadena.h
 *   Cad_Igual()             Cadena.h
 *   Cad_Une()               CadUne.c
 *   Cad_Trozo()             CadTrozo.c
 *   Cad_CarPertenece()      CadCarPe.c
 *   Cad_Cambia()            CadCamb.c
 *   Cad_Mueve()             CadMueve.c
 *   Cad_Subcadena()         CadSub.c
 *   Cad_PrimerUtil()        CadPrimU.c
 *   Cad_QuitaCar()          CadQuita.c
 *   Cad_Crea()              CadCrea.c
 *   Cad_Duplica()           CadDupl.c
 *   Cad_Compara()           CadComp.c
 *   Cad_RecortaFinal()      CadRecFi.c
 *   Cad_Mayus()             CadMayus.c
 *   Cad_Minus()             CadMinus.c
 *   Cad_ConvierteQLaPC()    CadQLaPC.c
 *   Cad_ConviertePCaQL()    CadPCaQL.c
 *   Cad_ConvierteQLaANSI()  CadQLaAN.c
 *   Cad_ConvierteANSIaQL()  CadANaQL.c
 *   Cad_ConviertePCaANSI()  CadPCaAN.c
 *   Cad_ConvierteANSIaPC()  CadANaPC.c
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------------
 * Funciones conocidas
 *
 *   Ninguna
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------------
 * Funciones privadas
 *
 *   Cad_EntPos()            CadEnter.c
 *   Cad_EntSig()            CadEnter.c
 *------------------------------------------------------------------*/

#ifndef _CADENA_
#define _CADENA_

/*--------------------------------------------------------------------
 * Ficheros de cabecera
 *------------------------------------------------------------------*/

#include "Memoria.h"
#include "Caracter.h"

#include <string.h>             /* strcmp()  strcpy()  strlen()     */
#include <stdarg.h>             /* va_list ...                      */

/*--------------------------------------------------------------------
 * Definicin del tipo cadena
 *------------------------------------------------------------------*/

#ifdef OLIMPO_PC
typedef caracter * cadena;
#endif

#ifdef OLIMPO_QL
typedef char * cadena;
#endif

/*--------------------------------------------------------------------
 * Definicin de macros constantes
 *------------------------------------------------------------------*/

#define CAD_FIN  ((cadena)NIL)

/*--------------------------------------------------------------------
 * Declaracin de funciones
 *------------------------------------------------------------------*/

cadena   Cad_Une (cadena C, ...);
cadena   Cad_Crea ();
cadena   Cad_Trozo ();
cadena   Cad_Cambia ();
cadena   Cad_Mueve ();
cadena   Cad_QuitaCar ();
cadena   Cad_Duplica ();
cadena   Cad_EntPos ();
cadena   Cad_EntSig ();
cadena   Cad_Mayus ();
cadena   Cad_Minus ();
cadena   Cad_ConvierteQLaPC ();
cadena   Cad_ConviertePCaQL ();
cadena   Cad_ConvierteQLaANSI ();
cadena   Cad_ConvierteANSIaQL ();
cadena   Cad_ConviertePCaANSI ();
cadena   Cad_ConvierteANSIaPC ();
cadena   Cad_RecortaFinal ();        
contador Cad_Subcadena ();
contador Cad_PrimerUtil ();
contador Cad_CarPertenece ();
contador Cad_Compara ();

/*--------------------------------------------------------------------
 * Definicin de macros funciones
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------Olimpo
 * MACRO:    Cad_Destruye()
 * OBJETIVO: Liberar la memoria reservada para una cadena
 * ENTRADAS: La cadena
 * SALIDAS:  Ninguna
 * EJEMPLO:  Cad_Destruye (Cadena)
 *------------------------------------------------------------------*/

#define Cad_Destruye(c)   Mem_Destruye(c)

/*--------------------------------------------------------------Olimpo
 * MACRO:    Cad_Copia()
 * OBJETIVO: Copiar una cadena en otra
 * ENTRADAS: La cadena destino y la cadena origen
 * SALIDAS:  La cadena destino
 * EJEMPLO:  Cad_Copia (Nombre,"Eustaquio")
 *------------------------------------------------------------------*/

#define Cad_Copia(d,o)  ((cadena)strcpy((char *)d,(char *)o))

/*--------------------------------------------------------------Olimpo
 * MACRO:    Cad_Longitud()
 * OBJETIVO: Calcular la longitud de una cadena
 * ENTRADAS: Una cadena
 * SALIDAS:  Su longitud
 * EJEMPLO:  Cad_Longitud (Nombre)
 *------------------------------------------------------------------*/

#define Cad_Longitud(c)  ((contador)strlen((char *)c))

/*--------------------------------------------------------------Olimpo
 * MACRO:    Cad_Igual()
 * OBJETIVO: Indicar si dos cadenas son iguales
 * ENTRADAS: Las dos cadenas
 * SALIDA:   Lgica
 * EJEMPLO:  Cad_Igual (Nombre,"Eustaquio")
 *------------------------------------------------------------------*/

#define Cad_Igual(c,d)  (!strcmp((char *)c,(char *)d))

/*--------------------------------------------------------------Olimpo
 * MACRO:    Cad_Entero()
 * OBJETIVO: Convertir un nmero en una cadena
 * ENTRADAS: El nmero
 * SALIDAS:  La cadena
 * NOTAS:    1. La cadena devuelta hay que destruirla cuando 
 *              no sea necesaria
 *           2. El nmero se evala dos veces
 * EJEMPLO:  Cad_Entero (130)
 *------------------------------------------------------------------*/

#define Cad_Entero(n)  ( (n)>0 ? Cad_EntPos((entpos)(n)) \
                               : Cad_EntSig((entero)(n)) )

#endif /* _CADENA_ */
