mem_util
========

Utilidades de base que comparten Siru, Simusol y Tabular. No resuelve un
problema del dominio: junta las cuatro cosas que todos esos programas
necesitan y que de otro modo cada uno reimplementa.

  memoria    add_memory() hace crecer un vector reservado con malloc/realloc
             siguiendo el par (occupy, available), que es el patron que usan
             las tablas de Tabular. memory_vector(), dupstr().

  archivos   open_file(), file_exists(), filetype(), readfile(),
             readfileuno(), whereisdata(), finddir().

  rutas      abs2rel() y rel2abs(), conversion entre rutas absolutas y
             relativas. Vienen de Shigio Yamaguchi y Tama Communications,
             con su propia licencia BSD; ver src/LGPLabs2relrel2abspathconv.txt.

  fechas     datetime(), julian_day(), ymd(), baset(), integer(), mmod().

  cadenas    trim(), rep_char(), process_string().

Las declaraciones estan en mem.h, util.h, pathconv.h y time_mem.h.

Fechas y horas (cambio posterior a 1.0-2)
---------------------------------------

datetime() reconoce fechas ISO YYYY-MM-DD, los formatos historicos de fecha y una hora opcional HH:MM[:SS[.fraccion]], separada de la fecha por T o blancos. Exige consumir toda la entrada y valida el calendario.

- Con fecha devuelve tipo 'd' y segundos epoch POSIX desde 1970-01-01T00:00:00Z. Conserva segundos fraccionarios como double.
- Sin zona explicita usa la zona horaria de la maquina, o TZ si esta definida. Aplica las reglas historicas de horario de verano del sistema. No modifica TZ.
- Z y los desplazamientos +HH:MM, -HH:MM, +HHMM o -HHMM fijan la zona de la entrada. No dependen de la zona local.
- Una fecha sin hora usa medianoche. Una hora sin fecha devuelve tipo 't' y segundos desde medianoche; no se le inventa una fecha ni se convierte a epoch.
- Rechaza fechas imposibles, sufijos sobrantes, segundos intercalares y horas locales inexistentes por el cambio de horario. Una hora local ambigua sigue la eleccion de mktime del sistema; indicar un offset explicito para distinguir sus dos ocurrencias.
- Un texto no reconocido devuelve tipo 'u' y no modifica el resultado numerico. Los argumentos nulos devuelven -1.
- No cambiar TZ ni el entorno mientras otros hilos convierten fechas.

Incompatibilidad de unidades: hasta 1.0-2, datetime() devolvia dias desde 2000-01-01 y perdia la hora. Los programas que interpretaban esa unidad deben adaptarse; los consumidores que solo interpolan reciben ahora segundos. julian_day(), ymd() y baset() mantienen el calendario y las unidades julianas.

make check incluye t_datetime: 55 casos y 8000 conversiones concurrentes, con zonas UTC, UTC-3 y una zona con cambios estacionales. Tambien admite horas con una sola cifra, como 1:00 en los CSV meteorologicos.


Compilar e instalar
-------------------

Hace falta: autoconf, automake, libtool y pkg-config.

    autoreconf --install
    ./configure
    make
    sudo make install
    sudo ldconfig

`autoreconf` solo se corre la primera vez, cuando todavia no existe el
sistema de construccion. Despues, al cambiar un Makefile.am o configure.ac,
`make` regenera lo que corresponda.

Para instalar fuera del sistema, por ejemplo en el arbol de siru:

    ./configure --prefix=/home/usuario/svn/siru/local


Usarla desde otro proyecto
--------------------------

La instalacion deja un archivo pkg-config, asi que no hace falta escribir
rutas a mano. Desde autotools:

    PKG_CHECK_MODULES([MEM_UTIL], [mem_util])

y en el Makefile.am del programa:

    programa_CFLAGS = $(MEM_UTIL_CFLAGS)
    programa_LDADD  = $(MEM_UTIL_LIBS)

Desde un Makefile escrito a mano:

    CFLAGS  += $(shell pkg-config --cflags mem_util)
    LDLIBS  += $(shell pkg-config --libs mem_util)

Si la biblioteca se instalo en un prefijo propio, hay que indicarselo a
pkg-config:

    export PKG_CONFIG_PATH=/home/usuario/svn/siru/local/lib/pkgconfig


Autoria y licencia
------------------

Diego Saravia <dsa@unsa.edu.ar>, con la colaboracion de Dolores Alia.
GPL version 3 o posterior; ver COPYING. Las excepciones estan indicadas en
el archivo que corresponde: abs2rel.c, rel2abs.c y pathconv.h llevan la
licencia BSD de sus autores originales.
