Permalink
Fetching contributors…
Cannot retrieve contributors at this time
93 lines (84 sloc) 4.64 KB

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:
      1. Intentar con /usr/share/locale/es.UTF-8/LC_TIME
      2. Si el anterior falla intentar con /usr/share/locale/UTF-8/LC_TIME
  • 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ón test_switch parte comentada de locale algo_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

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 a CFLAGS, eliminar código objeto y volver a compilar