// --------------------------------------------------------------------------------------------
// archivo  : xsstdlib.h
// --------------------------------------------------------------------------------------------

#ifndef __xsStdlib_H__
#define __xsStdlib_H__

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

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

// Tipos
DefineTipo size_t  Longitud;

// Constantes
#define SALIDA_FALLIDA EXIT_FAILURE
#define SALIDA_EXITOSA EXIT_SUCESS
#define MAX_ALEATORIO  RAND_MAX

// Objetivo : Asignar memoria en ejecución
// Retorna  : Un apuntador a la memoria asignada
//            En caso de error devuelve NULL
Vacio* asignarMemoria(Longitud cantidad);  // Cantidad de Memoria a Reservar

// Objetivo : Convertir una cadena en Binario a Entero
// Retorna  : El entero o -1 en caso de error
Entero binarioAEntero(Caracter* binario); 

// Objetivo : Borrar directorio
// Retorna  : VERDAD/FALSO
Logico borrarDirectorio(Caracter* directorio); 

// Objetivo : Ejecuta un Comando del Sistema
// Retorna  : Si comando es NULO, se retorna un valor diferente de 0 para indicar que el Sistema
//            esta disponible; en caso de que no devuelve 0
//            Si el comando es una instrucción, depende del resultado de ejecución de la misma
Entero comandoSistema(Constante Caracter* comando); 

// Objetivo : Crea un directorio
// Retorna  : VERDAD/FALSO
Logico crearDirectorio(Caracter* directorio); 

// Objetivo : Convertir un Entero a Binario
// Retorna  : La Cadena que representa el entero en binario
Caracter* enteroABinario(Entero entero); 

// Objetivo : convertir un Entero a Cadena
// Retorna  : La Cadena que representa el entero
Caracter* enteroACadena(Entero entero); 

// Objetivo : convertir un Entero a Hexadecimal
// Retorna  : La Cadena que representa el entero en hexadecimal
Caracter* enteroAHexadecimal(Entero entero); 

// Objetivo : convertir un Entero a Octal
// Retorna  : La Cadena que representa el entero en octal
Caracter* enteroAOctal(Entero entero); 

// Objetivo : Verifica si existe un directorio
// Retorna  : VERDAD/FALSO
Logico existeDirectorio(Caracter* directorio); 

// Objetivo : Establecer que función se ejecutará cuando haya una salida del Sistema
// Retorna  : 0 si se registró con éxito la función
//            Un valor distinto de 0 en caso de error
Entero funcionSalida(Vacio (*func)(Vacio)); 

// Objetivo : Convertir una cadena en Hexadecimal a Entero
// Retorna  : El entero o -1 en caso de error
Entero hexadecimalAEntero(Caracter* hexadecimal); 

// Objetivo : Inicializar la Generación de Números Aleatorios
// Retorna  : Nada
Vacio inicializarAleatorios();
								 
// Objetivo : Libera Memoria dinámica
// Retorna  : Nada
Vacio liberarMemoria(Vacio* apuntador); // El apuntador de la memoria que se libera

// Objetivo : Genera un Número Aleatorio entre 0 y MAX_ALEATORIO
// Retorna  : El Número Aleatorio ente 0 y MAX_ALEATORIO
Entero numeroAleatorio(); 

// Objetivo : convertir una cadena en octal a Entero
// Retorna  : El entero o -1 en caso de error
Entero octalAEntero(Caracter* octal); 

// Objetivo : Reasignar Memoria cambiando el tamaño de memoria asignada
// Retorna  : Un apuntador a la memoria reasignada
//            Null en caso de error
Vacio* reasignarMemoria(Vacio* apuntador, Longitud longitud); 

// Objetivo : Salir del Programa retornando un estado
// Retorna  : Nada
Vacio* salirAplicacion(Entero estado); 

// Objetivo : Obtener el Valor Absoluto 
// Retorna  : El valor absoluto de un número
Entero valorAbsoluto(Entero numero); 

// Objetivo : Obtener el valor de una variable de Entorno del Sistema
// Retorna  : El contenido de la variable de entorno indicada
//            NULL en caso de error
Caracter* variableEntorno(Caracter* variable); 

#endif