Una nueva versión de fmt(1) (English)

Solía publicar artículos relacionados con este tema aquí, pero en algún momento juzgué mejor dedicar este sitio web exclusivamente a su objetivo original, que es publicar mi obra literaria.  Haré una excepción con este pequeño programa que escribí en C, ya que está indirectamente relacionado.

Si usted utiliza sistemas tipo Unix seguramente está acostumbrado a editar texto plano utilizando su editor de texto preferido.  Mientras que los editores populares modernos como Vim o GNU Emacs incluyen funciones de formato de párrafo, con los más tradicionales y básicos, como BSD nvi, cabe usar herramientas externas como fmt(1) (a las que también se las puede invocar desde el mismo editor con combinaciones de teclado).  De todos modos, como explico en el comentario principal en el código mismo, ninguna de las herramientas existentes para formatear párrafos de texto plano me satisfacía por completo, por eso decidí escribir la mía propia.

Y si conoce Unix también sabe qué es troff, un muy versátil lenguaje de etiquetas para formatear texto, que entre otras cosas ha sido utilizado por muchos para editar conocidos libros publicados.  Para editar mis novelas utilicé groff, la versión GNU.  La herramienta que estoy publicando aquí, además de mejorar algunas características presentes en otras versiones de fmt, también trae una innovación para facilitar el trabajo con archivos troff.

Descargar (fmtroff.c)

Probado en OpenBSD y Linux.  Espero que lo encuentre útil.

«¿Algunas de sus funciones parecen comenzar con una versión de cosecha propia de strcpy() o algo así?»

Me preguntó un usuario de las listas de correo de OpenBSD y me sugirió usar strlcpy().  Esto es lo que le respondí:

Conozco strlcpy() y otras funciones que podría haber usado, incluidas
las de caracteres anchos para lidiar con caracteres no ASCII.  Habrá
notado que ni siquiera usé reallocarray().  Elegí la forma "manual" a
propósito, en primer lugar porque mi objetivo era aprender C y porque,
entre otras cosas, hacerlo de esta manera permite compilarlo también bajo
Linux o Mac.

Si su preocupación es que pueda corromper memoria, pruébelo.  Puede
agregar valores a la variable MALLOC_OPTIONS en OpenBSD o en Linux puede
pasar -fsanitize=dirección a gcc o usar herramientas como valgrind.  Ya
me dirá si algo funciona mal ;-).

Cronología de cambios


VOLVER A LA PORTADA