// --------------------------------------------------------------------------------------------
// archivo  : stdio.h
// objetivo : archivo de cabecera del módulo funciones de entrada y salida estandar
// --------------------------------------------------------------------------------------------

#ifndef __xsStdio_H__
#define __xsStdio_H__

// Incluyo la librería Easy
#include "xsEasyC.h"

// Se Incluyen librerias de c
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "time.h"
#include <stdbool.h>

// Constantes
#define FORMATO_DEFAULT      CADENA_VACIA
#define CON_CAMBIO_LINEA     VERDAD
#define SIN_CAMBIO_LINEA     FALSO
#define TODOS_CARACTERES     CADENA_VACIA


// Objetivo : Desplegar una cadena en la pantalla indicando formato y cambio de línea
// Retorna  : En caso de éxito el número de caracteres impresos
//            En caso de error, devuelve -1 y activa el indicador de error (ferror)
Entero imprimirCadena(Caracter *cadena,        // Cadena a desplegar
                      Caracter *formato,       // Cadena con el Formato para el despliegue
                      Logico    cambiolinea);  // Indica si requiere cambio de linea


// Objetivo : Desplegar un caracter en la pantalla indicando formato y cambio de linea
// Retorna  : En caso de éxito retorna el número de caracteres desplegados
//            En caso de error, devuelve EOF y activa el indicador de error (ferror)
Entero imprimirCaracter(Caracter  caracter,      // Caracter a  desplegar
                        Caracter *formato,       // Cadena con el Formato para el despliegue
                        Logico    cambiolinea);  // Indica si requiere cambio de linea

// Objetivo : Desplegar un Doble en la pantalla
// Retorna  : El número de caracteres desplegados en la pantalla
//            En caso de error, devuelve EOF y activa el indicador de error (ferror)
Entero imprimirDoble(Doble     doble,         // Doble a desplegar
                     Caracter *formato,       // Cadena con el Formato para el despliegue
				     Logico    cambiolinea);  // Indica si requiere cambio de linea

// Objetivo : Desplegar un entero en la pantalla
// Retorna  : El número de caracteres desplegados en la pantalla
//            En caso de error, devuelve EOF y activa el indicador de error (ferror)
Entero imprimirEntero(Entero  entero,          // Entero a desplegar
                      Caracter *formato,       // Cadena con el Formato para el despliegue
                      Logico cambiolinea);     // Indica si requiere cambio de linea

// Objetivo : Desplegar un flotante en la pantalla
// Retorna  : El número de caracteres desplegados en la pantalla
//            En caso de error, devuelve EOF y activa el indicador de error (ferror)
Entero imprimirFlotante(Flotante flotante,     // Flotante a desplegar
                        Caracter *formato,     // Cadena con el Formato para el despliegue
                        Logico  cambiolinea);  // Indica si requiere cambio de linea

					  
// Objetivo : Capturar una cadena desde el teclado
// Retorna  : La cadena capturada en la variable y el num de caracteres capturados
//            En caso de error devuelve -1
Entero leerCadena(Caracter *cadena,     // Variable donde se lee la cadena
                  Constante Caracter *validos,    // Caracteres válidos
                  Entero   longitud);   // Cuantos caracteres se van a permitir

// Objetivo : Capturar una cadena con formato
// Retorna  : La cadena capturada en la variable
// Formatos : L-Alfabetico N-Numerico  A-Alfanumerico X-Cualquiera
Entero leerCadenaFormato(Caracter *cadena,      // Variable donde se lee la cadena
                         Caracter *formato);    // Formato
				
					  
// Objetivo : Capturar un caracter desde el teclado
// Retorna  : El caracter leido
//            En caso de error, devuelve EOF y se activa el indicador de error (ferror)
Caracter leerCaracter(Caracter *validos); // Caracteres válidos

// Objetivo : Capturar un caracter desde el teclado y lo despliega
// Retorna  : El caracter leido
//            En caso de error, devuelve EOF y se activa el indicador de error (ferror)
Caracter leerCaracterD(Caracter *validos); // Caracteres válidos

// Objetivo : Capturar una cadena desde el teclado pero en Clave; es decir mostrando *'s
// Retorna  : La cadena capturada en la variable y el num de caracteres capturados
//            En caso de error devuelve -1
Entero leerClave(Caracter *cadena,     // Variable donde se lee la cadena
                 Caracter *validos,    // Caracteres válidos
                 Entero   longitud);   // Cuantos caracteres se van a permitir

// Objetivo : Capturar un doble
// Retorna  : El Doble leído
//            En caso de error, devuelve -1
Doble leerDoble(Entero enteros,    // Cuantos caracteres para los enteros
                Entero decimales); // Cuantos caracteres para los decimales
					  
// Objetivo : Capturar un entero
// Retorna  : El entero leído
//            En caso de error, devuelve -1
Entero leerEntero(Entero caracteres);// Cuantos caracteres puede tener el entero
					  					  
// Objetivo : Capturar una fecha
// Retorna  : La cadena con la fecha capturada validada
//            En caso de cancelación o error devuelve Cadena vacía CV
Caracter* leerFecha(Entero formato,      // Formato 0=dd/mm/yyyy Formato 1=mm/dd/yyyy
                    Caracter separador); // El caracter separador de la fecha
				  
// Objetivo : Capturar un flotante
// Retorna  : El Flotante leído
//            En caso de error, devuelve -1
Flotante leerFlotante(Entero enteros,    // Cuantos caracteres para los enteros
                      Entero decimales); // Cuantos caracteres para los decimales
				  
#endif