/*--------------------------------------------------------------------
 * FICHERO:  MmoEscri.c
 * OBJETIVO: Definir la funcin Mmo_Escribe()
 * AUTOR:    Pedro Reina
 * FECHA:    V.14.7.1995
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------------
 * Funciones privadas
 *
 *   Mmo_Cabe()
 *------------------------------------------------------------------*/

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

#include "Memo.h"

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

static logico Mmo_Cabe();

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

/*--------------------------------------------------------------Olimpo
 * FUNCION:  Mmo_Escribe()
 * OBJETIVO: Escribir un registro de un fichero memo
 * ENTRADAS: El objeto memo, el nmero de bloque donde comienza
 *           el registro y la cadena que hay que almacenar
 * SALIDAS:  El nmero de bloque asignado al registro. Puede ser
 *           el mismo que tena u otro nuevo. Si no se ha podido
 *           realizar la operacin se devuelve 0
 * EJEMPLO:  Mmo_Escribe ( Dato, 17, Anotacion )
 * NOTAS:    1. Los fines de lnea en la cadena se deben indican
 *              con el carcter \r
 *           2. Si hay espacio suficiente en el fichero, se
 *              conserva el nmero de bloque; si no, se aade
 *              el registro al final del fichero y se devuelve
 *              un nmero de bloque nuevo
 * ALGORITMO:
 *      Si el modo de apertura es MMO_ACTUALIZACION
 *        Si el texto cabe en el lugar que tena asignado
 *          Colocar el fichero en la posicin adecuada
 *          Anotar el nmero de bloque donde se comienza
 *          Escribir el texto
 *        Si no, llamar a Mmo_Agrega()
 *------------------------------------------------------------------*/
contador Mmo_Escribe (Memo, Numero, Texto)
memo     Memo;
contador Numero;
cadena   Texto;
  {
  contador Respuesta;

  if ( Mmo_ModoApertura(Memo) == MMO_ACTUALIZACION )
    {
    if ( Mmo_Cabe (Memo, Numero) )
      {
      Fch_Coloca (Mmo_Fichero(Memo), (entero)Numero*MMO_TAMANOBLOQUE);
      Mmo_PonNumeroBloque (Memo, Numero);
      if ( Mmo_EscribeTexto (Memo, Texto) )  
        { Respuesta = Numero; }
      else
        { Respuesta = 0; }
      }
    
    else
      { Respuesta = Mmo_Agrega (Memo,Texto); }
    }
    
  else  /* Abierto en modo MMO_LECTURA */
    { Respuesta = 0; }
    
  return ( Respuesta );
  }
  
/*--------------------------------------------------------------------
 * FUNCION:  Mmo_Cabe()
 * OBJETIVO: Calcular si una cadena cabe en el lugar que tiene asignado
 *           un registro en el fichero memo
 * ENTRADAS: El objeto memo, el nmero de bloque donde comienza el registro
 *           y la cadena
 * SALIDAS:  Lgica
 * EJEMPLO:  Mmo_Cabe ( Dato, 17, Anotacion )
 * NOTAS:    1. Los fines de lnea en la cadena se deben indican con 
 *              el carcter \r y ocuparn en el fichero dos lugares
 *           2. El fin de la cadena se indicar en el fichero con Control-Z
 * ALGORITMO:
 *      Calcular el espacio que necesitar la cadena en el fichero
 *      Calcular el espacio disponible en el fichero
 *      Devolver si disponible es mayor o igual que necesario
 *------------------------------------------------------------------*/
static logico Mmo_Cabe (Memo, Numero, Texto)
memo     Memo;
contador Numero;
cadena   Texto;
  {
  entero Necesario=0, Disponible, i;
  
  for ( i=0 ; Texto[i] ; i++ )
    {
    Necesario++;
    if ( Texto[i] == '\r' )  { Necesario++; }
    }
  Necesario++;
  
  Disponible = Mmo_Longitud (Memo, Numero);
  Disponible = MMO_TAMANOBLOQUE * DivEx(Disponible,MMO_TAMANOBLOQUE);
               
  return ( Disponible >= Necesario );
  }
