Implementación de locale y xlocale sobre libc de OpenBSD
Objetivos:
- Modificar la librería del OpenBSD estable más reciente o de current
- Cumplir la implementación más reciente de POSIX lo mejor posible http://pubs.opengroup.org/onlinepubs/9699919799/
- Como fuente prioritaria en localización de cada país utilizar versión reciente de CLDR http://cldr.unicode.org/index/downloads
- En los locales dar prioridad a español y los paises donde se habla.
- Soportar sólo las codificaciones US-ASCII y UTF-8 (únicas soportadas por OpenBSD).
- 3 mecanismos para ubicar un locale (digamos LC_TIME de es_CO.UTF-8):
- que sea un archivo regular en el formato correcto en
/usr/share/locale/es_CO.UTF-8/LC_TIME
- que la ubicación anterior sea un enlace a otro correcto
- Emplear una heurística para sustituir:
- Intentar con
/usr/share/locale/es.UTF-8/LC_TIME
- Si el anterior falla intentar con
/usr/share/locale/UTF-8/LC_TIME
- Intentar con
- que sea un archivo regular en el formato correcto en
- El locale C o POSIX se soporta en fuentes de libc con codificación
ASCII, se soporta con codificación UTF-8 en
/usr/share/locale/UTF-8/
para operar por omisión cuando no se encuentra uno mejor con codificación UTF-8. - Documentar cada función y programa en páginas man
- Pruebas de regresión para la funcionalidad añadida
Estado actual:
- Versión de OpenBSD: actualizando a 6.2 (publicado en Oct.2017)
- POSIX: Se cumple hasta 2008 con extensiones de FreeBSD
- CLDR: Sólo se usa una versión de 2015 para LC_TIME, para las otras categorias (y el país faltante en CLDR: Cuba) se importaron, mezclaron y mejoraron locales de FreeBSD y NetBSD de 2015.
- Prioridad español: completa
- Codificaciones US-ASCII y UTF-8. Bien en todas las categorias excepto UTF-8 en LC_COLLATE pues sólo se soportan primeros 254 puntos de Unicode (los equivalentes a ISO8859-1 que es suficiente para lenguas basadas en alfabateo latino como español, italiano, frances y alemán, ver http://www.utf8-chartable.de/).
- Mecanismos para ubicar locale: implementado para todas las categorias, puede
mejorarse (ver prueba de regresión
check_monetary
funcióntest_switch
parte comentada de localealgo_loco.UTF-8
). - POSIX en
/usr/share/locale/UTF-8/
: implementado - Páginas man: realizado falta manual para utilidades localedef y colldef
- Pruebas de regresión: bastante completas
Estrategia para actualizar:
- Se parchan fuentes de OpenBSD en un orden lógico-histórico:
- locale global:
- LC_CTYPE solo reorganizar
- LC_TIME emplea formato tipo texto
- LC_COLLATE emplea formato binario
- LC_MONETARY emplea formato tipo texto (reusando detalles de LC_TIME)
- LC_NUMERIC emplea formato tipo texto.
- perl: requerido tras soportar LC_NUMERIC
- xlocale
- ctype 1: conversión single byte, multi-byte y wide character.
- ctype 2: tradución de minúscula a mayúscula y funciones para verificar tipo de caracteres.
- cotejación
- localeconv_l
- númerico y monetario
- tiempo
- extensiones de Darwin
- locale global:
Ayudas para actualizar
- Primero actualizar libc
- Verificar que pasan pruebas de regresión nuevas de regress/lib/libc/locale
- Después de pasar por locale de LC_NUMERIC es necesario recompilar perl:
cd /usr/src/gnu/usr.bin/perl
doas make -f Makefile.bsd-wrapper
doas make -f Makefile.bsd-wrapper install
si no se hace, hasta lo más simple con perl fallará, por ejemplo:
$ pkg_info
Invalid version format (non-numeric data) at /usr/libdata/perl5/Carp.pm line 3.
BEGIN failed--compilation aborted at /usr/libdata/perl5/Carp.pm line 3.
Compilation failed in require at /usr/libdata/perl5/OpenBSD/State.pm line 86.
BEGIN failed--compilation aborted at /usr/libdata/perl5/OpenBSD/State.pm line 86.
Compilation failed in require at /usr/libdata/perl5/OpenBSD/PkgInfo.pm line 22.
BEGIN failed--compilation aborted at /usr/libdata/perl5/OpenBSD/PkgInfo.pm line 22.
Compilation failed in require at (eval 1) line 2.
- Para depurar libc con gdb:
- En
lib/libc/Makefile
añadir-g -O0
aCFLAGS
, eliminar código objeto y volver a compilar
- En