/*--------------------------------------------------------------------
 * FICHERO:       Memo.h
 * OBJETIVO:      Definir el objeto "Memo"
 * IDENTIFICADOR: Mmo
 * AUTOR:         Pedro Reina
 * FECHA:         X.12.7.1995
 * OBJETOS UTILIZADOS: Memoria, Cadena, Usuario, Fichero
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------------
 * Funciones pblicas
 *
 *   Mmo_Abre()              MmoAbre.c
 *   Mmo_Crea()              MmoCrea.c
 *   Mmo_Cierra()            MmoCreOb.c
 *   Mmo_Lee()               MmoLee.c
 *   Mmo_Agrega()            MmoAgreg.c
 *   Mmo_Escribe()           MmoEscri.c
 *------------------------------------------------------------------*/

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

/*--------------------------------------------------------------------
 * Funciones privadas
 *
 *   Mmo_Fichero()              Memo.h
 *   Mmo_PonFichero()           Memo.h
 *   Mmo_Modificado()           Memo.h
 *   Mmo_PonModificado()        Memo.h
 *   Mmo_ModoApertura()         Memo.h
 *   Mmo_PonModoApertura()      Memo.h
 *   Mmo_Disponible()           Memo.h
 *   Mmo_PonDisponible()        Memo.h
 *   Mmo_NumeroBloque()         Memo.h
 *   Mmo_PonNumeroBloque()      Memo.h
 *   Mmo_IncrementaNumBloque()  Memo.h
 *   Mmo_Posicion()             Memo.h
 *   Mmo_PonPosicion()          Memo.h
 *   Mmo_IncrementaPosicion()   Memo.h
 *   Mmo_Dato()                 Memo.h
 *   Mmo_PonDato()              Memo.h
 *   Mmo_CreaObjeto()           MmoCreOb.c
 *   Mmo_LeeBloque()            MmoLeeBl.c
 *   Mmo_Longitud()             MmoLong.c
 *   Mmo_Destruye()             MmoCreOb.c
 *   Mmo_Limpia()               MmoLimpi.c
 *   Mmo_Anota()                MmoAnota.c
 *   Mmo_EscribeBloque()        MmoEscBl.c
 *   Mmo_EscribeTexto()         MmoEsTex.c
 *------------------------------------------------------------------*/

#ifndef _MEMO_
#define _MEMO_

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

#include "Memoria.h"
#include "Cadena.h"
#include "Usuario.h"
#include "Fichero.h"

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

#define MMO_LECTURA       (octeto)0
#define MMO_ACTUALIZACION (octeto)1

#define MMO_TAMANOBLOQUE 512   /* Tamao de cada bloque */

/*--------------------------------------------------------------------
 * Definicin del tipo "memo"
 *------------------------------------------------------------------*/
typedef struct {
               fichero  Fichero;
               logico   Modificado;
               octeto   ModoApertura;
               contador Disponible;
               contador NumeroBloque;
               contador Posicion;
               memoria  Dato;
               } Mmo_st, *memo;

/*--------------------------------------------------------------------
 * Variables globales
 *------------------------------------------------------------------*/

   /* Ninguna */

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

memo     Mmo_CreaObjeto();
memo     Mmo_Abre();
void     Mmo_Cierra();
void     Mmo_Limpia();
logico   Mmo_Anota();
memo     Mmo_Crea();
void     Mmo_Destruye();
cadena   Mmo_Lee();
contador Mmo_Escribe();
entero   Mmo_Longitud();
logico   Mmo_EscribeBloque();
logico   Mmo_EscribeTexto();

/*--------------------------------------------------------------------
 * Estructura de los ficheros .DBT
 *
 * Un fichero .DBT se compone de una serie de bloques de 512 octetos
 * (Algunas aplicaciones no rellenan el ltimo bloque)
 *
 * El bloque 0 es la cabecera
 *   Los primeros 4 octetos especifican el nmero de bloque disponible
 *     para anotar otro campo memo
 *   El resto de la cabecera no tiene significado (dBase IV s
 *     aade algn significado a ciertas posiciones)
 *
 * Los bloques que no son la cabecera contienen el texto del campo
 *   memo, pudiendo ocupar un nico campo varios bloques.
 *   El fin de campo se marca con el octeto 26 (Control-Z)
 *   Se pueden insertar fines de lnea con los octetos 13 y 10
 *   consecutivos
 *------------------------------------------------------------------*/

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

/*--------------------------------------------------------------------
 * MACRO:    Mmo_Fichero()
 * OBJETIVO: Decir el fichero asociado con un objeto memo
 * ENTRADAS: El objeto memo
 * SALIDAS:  El fichero asociado
 * EJEMPLO:  Mmo_Fichero ( Nota )
 *------------------------------------------------------------------*/
#define Mmo_Fichero(m)  ((m)->Fichero)

/*--------------------------------------------------------------------
 * MACRO:    Mmo_PonFichero()
 * OBJETIVO: Poner el fichero asociado con un objeto memo
 * ENTRADAS: El objeto memo y el fichero
 * SALIDAS:  El fichero asociado
 * EJEMPLO:  Mmo_PonFichero ( Nota, Fichero )
 *------------------------------------------------------------------*/
#define Mmo_PonFichero(m,f)  ((m)->Fichero=(f))

/*--------------------------------------------------------------------
 * MACRO:    Mmo_Modificado()
 * OBJETIVO: Decir si un objeto memo ha sido modificado
 * ENTRADAS: El objeto memo
 * SALIDAS:  Lgica, que indica si ha sido modificado
 * EJEMPLO:  Mmo_Modificado ( Nota )
 *------------------------------------------------------------------*/
#define Mmo_Modificado(m)  ((m)->Modificado)

/*--------------------------------------------------------------------
 * MACRO:    Mmo_PonModificado()
 * OBJETIVO: Anotar si un objeto memo ha sido modificado
 * ENTRADAS: El objeto memo y el valor lgico
 * SALIDAS:  El valor lgico
 * EJEMPLO:  Mmo_PonModificado ( Nota, SI )
 *------------------------------------------------------------------*/
#define Mmo_PonModificado(m,l)  ((m)->Modificado=(l))

/*--------------------------------------------------------------------
 * MACRO:    Mmo_ModoApertura()
 * OBJETIVO: Decir el modo en que se ha abierto un objeto memo
 * ENTRADAS: El objeto memo
 * SALIDAS:  El modo de apertura
 * EJEMPLO:  Mmo_ModoApertura ( Nota )
 *------------------------------------------------------------------*/
#define Mmo_ModoApertura(m)  ((m)->ModoApertura)

/*--------------------------------------------------------------------
 * MACRO:    Mmo_PonModoApertura()
 * OBJETIVO: Poner el modo en que se ha abierto un objeto memo
 * ENTRADAS: El objeto memo y el modo de apertura
 * SALIDAS:  El modo de apertura
 * EJEMPLO:  Mmo_PonModoApertura ( Nota, MMO_LECTURA )
 *------------------------------------------------------------------*/
#define Mmo_PonModoApertura(m,d)  ((m)->ModoApertura=(d))

/*--------------------------------------------------------------------
 * MACRO:    Mmo_Disponible()
 * OBJETIVO: Decir el nmero de bloque disponible de un objeto memo
 * ENTRADAS: El objeto memo
 * SALIDAS:  Un contador con el nmero de bloque disponible
 * EJEMPLO:  Mmo_Disponible ( Nota )
 *------------------------------------------------------------------*/
#define Mmo_Disponible(m)  ((m)->Disponible)

/*--------------------------------------------------------------------
 * MACRO:    Mmo_PonDisponible()
 * OBJETIVO: Poner el nmero de bloque disponible de un objeto memo
 * ENTRADAS: El objeto memo y el nmero de bloque
 * SALIDAS:  El nmero de bloque
 * EJEMPLO:  Mmo_PonDisponible ( Nota, 45 )
 *------------------------------------------------------------------*/
#define Mmo_PonDisponible(m,d)  ((m)->Disponible=(d))

/*--------------------------------------------------------------------
 * MACRO:    Mmo_NumeroBloque()
 * OBJETIVO: Decir el nmero de bloque en memoria de un objeto memo
 * ENTRADAS: El objeto memo
 * SALIDAS:  Un contador con el nmero de bloque
 * EJEMPLO:  Mmo_NumeroBloque ( Nota )
 *------------------------------------------------------------------*/
#define Mmo_NumeroBloque(m)  ((m)->NumeroBloque)

/*--------------------------------------------------------------------
 * MACRO:    Mmo_PonNumeroBloque()
 * OBJETIVO: Poner el nmero de bloque en memoria de un objeto memo
 * ENTRADAS: El objeto memo y el nmero de bloque
 * SALIDAS:  El nmero de bloque
 * EJEMPLO:  Mmo_PonNumeroBloque ( Nota, 120 )
 *------------------------------------------------------------------*/
#define Mmo_PonNumeroBloque(m,n)  ((m)->NumeroBloque=(n))

/*--------------------------------------------------------------------
 * MACRO:    Mmo_IncrementaNumBloque()
 * OBJETIVO: Incrementar el nmero de bloque en memoria de un objeto memo
 * ENTRADAS: El objeto memo
 * SALIDAS:  Un contador con el nuevo nmero de bloque
 * EJEMPLO:  Mmo_IncrementaNumBloque ( Nota )
 *------------------------------------------------------------------*/
#define Mmo_IncrementaNumBloque(m)  (((m)->NumeroBloque)++)

/*--------------------------------------------------------------------
 * MACRO:    Mmo_Dato()
 * OBJETIVO: Decir la direccin en memoria donde se almacena un bloque
 *           de un objeto memo
 * ENTRADAS: El objeto memo
 * SALIDAS:  La direccin de memoria
 * EJEMPLO:  Mmo_Dato ( Nota )
 *------------------------------------------------------------------*/
#define Mmo_Dato(m)  ((m)->Dato)

/*--------------------------------------------------------------------
 * MACRO:    Mmo_PonDato()
 * OBJETIVO: Poner la direccin en memoria donde se almacena un bloque
 *           de un objeto memo
 * ENTRADAS: El objeto memo y la direccin de memoria
 * SALIDAS:  La direccin de memoria
 * EJEMPLO:  Mmo_PonDato ( Nota, Direccion )
 *------------------------------------------------------------------*/
#define Mmo_PonDato(m,d)  ((m)->Dato=(d))

/*--------------------------------------------------------------------
 * MACRO:    Mmo_Posicion()
 * OBJETIVO: Decir la posicin del ltimo caracter de un bloque
 *           de un objeto memo
 * ENTRADAS: El objeto memo
 * SALIDAS:  La posicin
 * EJEMPLO:  Mmo_Posicion ( Nota )
 *------------------------------------------------------------------*/
#define Mmo_Posicion(m)  ((m)->Posicion)

/*--------------------------------------------------------------------
 * MACRO:    Mmo_PonPosicion()
 * OBJETIVO: Poner la posicin del ltimo caracter de un bloque
 *           de un objeto memo
 * ENTRADAS: El objeto memo y la posicin
 * SALIDAS:  La posicin
 * EJEMPLO:  Mmo_PonPosicion ( Nota, 16 )
 *------------------------------------------------------------------*/
#define Mmo_PonPosicion(m,p)  ((m)->Posicion=(p))

/*--------------------------------------------------------------------
 * MACRO:    Mmo_IncrementaPosicion()
 * OBJETIVO: Incrementar la posicin del ltimo caracter de un bloque
 *           de un objeto memo
 * ENTRADAS: El objeto memo
 * SALIDAS:  La nueva posicin
 * EJEMPLO:  Mmo_IncrementaPosicion ( Nota )
 *------------------------------------------------------------------*/
#define Mmo_IncrementaPosicion(m)  (((m)->Posicion)++)

#endif /* _MEMO_ */                                    