/*
    unidades: conversion de unidades con GNU units, como biblioteca.
    Copyright 2026 Diego Saravia Alia.  GPL 3 o posterior (la de GNU units).

    Las definiciones se cargan una sola vez por proceso (unidades_iniciar,
    o la primera conversion) y despues quedan de solo lectura: las
    conversiones se pueden hacer a la vez desde varios hilos.
*/
#ifndef UNIDADES_H
#define UNIDADES_H

#ifdef __cplusplus
extern "C" {
#endif

/* Carga las definiciones.  archivo NULL: $UNIDADES_ARCHIVO si esta
   definida, si no las instaladas con la biblioteca.  Solo la primera
   llamada carga; las siguientes devuelven lo mismo.  0 si anduvo, -1 si
   no (unidades_error dice por que). */
int unidades_iniciar(const char *archivo);

/* La cantidad de ("760 mmHg", "tempF(77)", "3 ft + 2 in") expresada en la
   unidad a ("pascal", "tempC", "m").  0 si anduvo, -1 si no. */
int unidades_convertir(const char *de, const char *a, double *resultado);

/* El numero x en la unidad de, expresado en la unidad a:
   unidades_valor(77, "tempF", "tempC", &r) da 25. */
int unidades_valor(double x, const char *de, const char *a, double *resultado);

/* El numero x en la unidad de, pasado a las unidades de base del SI.
   Si base no es NULL recibe esas unidades ("kg m^2 / s^2", "" si no
   tiene dimension), para liberar con free. */
int unidades_a_si(double x, const char *de, double *resultado, char **base);

/* Por que fallo la ultima llamada de este hilo. */
const char *unidades_error(void);

#ifdef __cplusplus
}
#endif

#endif
