/*--------------------------------------------------------------------
 * FICHERO:  General.h
 * OBJETIVO: Establecer definiciones generales
 * AUTOR:    Pedro Reina
 * FECHA:    S.8.7.1995
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------------
 * Tipos pblicos
 *
 *   logico                General.h
 *   octeto                General.h
 *   menudo                General.h
 *   contador              General.h
 *   contpos               General.h
 *   entero                General.h
 *   entpos                General.h
 *   real                  General.h
 *------------------------------------------------------------------*/

/*--------------------------------------------------------------------
 * Funciones pblicas
 *
 *   Abs()                 General.h
 *   Min()                 General.h
 *   Max()                 General.h
 *   Signo()               General.h
 *   DivEx()               General.h
 *------------------------------------------------------------------*/

#ifndef _GENERAL_
#define _GENERAL_

/*--------------------------------------------------------------------
 * Definicin del ordenador objetivo: QL o PC
 *------------------------------------------------------------------*/

#define OLIMPO_QL

/*--------------------------------------------------------------------
 * Desconexin del aviso de Turbo C "Code has no effect"
 *------------------------------------------------------------------*/

#ifdef OLIMPO_PC
#pragma warn -eff
#endif

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

#include <stdio.h>            /*  NULL  */

/*--------------------------------------------------------------------
 * Constantes NULO y NIL
 *------------------------------------------------------------------*/

#define NULO NULL
#define NIL  0

/*--------------------------------------------------------------------
 * Tipo de datos para manejar valores lgicos
 *------------------------------------------------------------------*/

typedef unsigned char logico;

#define NO ((logico)0)
#define SI ((logico)1)

/*--------------------------------------------------------------------
 * Tipos de datos para manejar nmeros enteros
 *------------------------------------------------------------------*/

typedef unsigned char      octeto;   /* Enteros de 8 bits sin signo */
typedef signed char        menudo;   /* Enteros de 8 bits con signo */
typedef unsigned short int contpos;  /* Enteros de 16 bits sin signo */
typedef signed short int   contador; /* Enteros de 16 bits con signo */
typedef unsigned long int  entpos;   /* Enteros de 32 bits sin signo */
typedef signed long int    entero;   /* Enteros de 32 bits con signo */

/*--------------------------------------------------------------------
 * Tipos de datos para manejar nmeros reales
 *------------------------------------------------------------------*/

typedef float real;

/*--------------------------------------------------------------------
 * Definicin de variables globales
 *------------------------------------------------------------------*/

   /* Ninguna */

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

   /* Ninguna */

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

/*--------------------------------------------------------------Olimpo
 * MACRO:    Abs()
 * OBJETIVO: Calcular el valor absoluto de un nmero
 * ENTRADAS: Un nmero
 * SALIDAS:  El valor absoluto
 * NOTA:     El argumento se evala dos veces
 * EJEMPLO:  Abs(-3)
 *------------------------------------------------------------------*/
#define Abs(x)     ( ((x)>0) ? (x) : (-(x)) )

/*--------------------------------------------------------------Olimpo
 * MACRO:    Min()
 * OBJETIVO: Calcular el mnimo de dos nmeros
 * ENTRADAS: Los nmeros
 * SALIDAS:  El menor de ellos
 * NOTA:     El argumento devuelto se evala dos veces
 * EJEMPLO:  Min (2,5)
 *------------------------------------------------------------------*/
#define Min(x,y)   ( ((x)<(y)) ? (x) : (y) )

/*--------------------------------------------------------------Olimpo
 * MACRO:    Max()
 * OBJETIVO: Calcular el mximo de dos nmeros
 * ENTRADAS: Los nmeros
 * SALIDAS:  El mayor de ellos
 * NOTA:     El argumento devuelto se evala dos veces
 * EJEMPLO:  Max (2,5)
 *------------------------------------------------------------------*/
#define Max(x,y)   ( ((x)>(y)) ? (x) : (y) )

/*--------------------------------------------------------------Olimpo
 * MACRO:    Signo()
 * OBJETIVO: Calcular el signo de un nmero
 * ENTRADAS: El nmero
 * SALIDAS:  Un menudo con el signo del nmero
 * NOTA:     El argumento se evala dos veces
 * EJEMPLO:  Signo ( -1.3 )
 *------------------------------------------------------------------*/
#define Signo(x)  ((menudo)(((x)>0)-((x)<0)))

/*--------------------------------------------------------------Olimpo
 * MACRO:    DivEx()
 * OBJETIVO: Calcular la divisin por exceso de dos nmeros
 * ENTRADAS: Los dos nmeros
 * SALIDAS:  La divisin por exceso del primer nmero entre
 *           el segundo
 * NOTA:     Los argumentos se evalan dos veces
 * EJEMPLO:  DivEx ( 8, 5 )
 *------------------------------------------------------------------*/
#define DivEx(x,y)  (((x)/(y))+(((x)%(y))>0))

#endif  /* _GENERAL_ */
