sábado, 26 de noviembre de 2011

Descomentador De C/C++

Una de las primeras cosas que aprendemos cuando nos iniciamos en cualquier lenguaje de programación es que debemos comentar de manera correcta nuestro código, es más, muchos autores han dedicado una buena parte de sus libros con temas relacionados a los comentarios, cómo redactarlos y dónde ponerlos. Pero ¿Qué pasaría si no quisiéramos comentar nuestro código? Mejor aún ¿Qué pasaría si no quisiéramos comentarios de ninguna índole en nuestros ficheros fuente?; el mundo da vueltas (!).

El programa descomentador que presento en este artículo está basado en las especificaciones de esta página COS 217. Solo funciona con ficheros fuentes de C o C++. Si no se especifica ningún fichero en los argumentos, el programa lee de la entrada estándar e imprime por pantalla.

Recuerda que necesitarás una shell para ejecutar los siguientes mandatos, preferiblemente Bash.

Si no quieres leer todo este artículo y solo quieres quitar los comentarios de un fichero, puedes usar la siguiente orden, después de haber compilado el programa correctamente.
./decomment comentado.c 2>/dev/null > comentado.c
Compilar Programa
Para compilar con gcc ejecuta uno de los siguientes mandatos
#Compilar
$ gcc decomment.c -o decomment

# También puede permitir que gcc optimice el código para mayor rapidez 
$ gcc -O2 decomment.c -o decomment

# Optimizar un poco más (quizás)
$ gcc -O2 -fomit-frame-pointer decomment.c -o decomment
Modo de empleo
# Quita comentarios e imprime por pantalla
$ ./decomment comentado.c

# Guardar resultado en un fichero
$ ./decomment comentado.c > nocomentado.c

Si el descomentador llega al final del fichero fuente y no encuentra un cierre de comentario, imprimirá una línea como esta: Error: línea x: comentario no cerrado. Si estás consiente de que tu fichero fuente quizás esté mal formado, podrías obviar ese aviso y quitar los comentarios de todas maneras, así:

# Quita comentarios, imprime por pantalla y obvia errores
$ ./decomment comentado.c 2>/dev/null

# Si quiere redirigir la salida a un fichero solo debe hacer
$ ./decomment comentado 2>/dev/null > nocomentado.c

# también podría hacerlo así
$ ./decomment < comentado.c 2>/dev/null > nocomentado.c

Si tus intenciones son eliminar todos los comentarios de un árbol completo de ficheros fuentes, tan solo debes de poner el siguiente programa para Bash a trabajar dentro del directorio raíz:
#!/bin/bash
DEC=./decomment # ruta absoluta del programa decoment
OLD_IFS=$IFS
IFS=$'\n'
for line in `find -iname '*.c' -or -iname '*.h' -or -iname '*.cpp'`; do
   $DEC $line 2>/dev/null > tmpfile
   mv tmpfile "$line"
done 
IFS=$OLD_IFS
Si lo que deseas es no dejar rastros de comentarios por ninguna parte, entonces deberías ir a por las copias de seguridad que hacen algunos editores de texto. El siguiente script busca los ficheros C o C++ y sus copias de seguridad. Sin misericordia, por ejemplo, este script es capaz de encontrar  "la copia de seguridad de la copia de seguridad de la ...", así una copia de seguridad que tenga el nombre: programa.cpp.old.back.old.old~ será procesada. Ten mucho cuidado con este script, pues no hay vuelta atrás.
#!/bin/bash
DEC=./decomment # ruta absoluta del programa decoment
REGEX='.*\.([ch]|cpp)(\.?(~|old|back))+?$'
OLD_IFS=$IFS
IFS=$'\n'
for line in `find -regextype posix-extended -iregex $REGEX`; do
   $DEC $line 2>/dev/null > tmpfile
   mv tmpfile "$line"
done
IFS=$OLD_IFS
Portabilidad

Este programa se puede ejecutar (compilar) en cualquier sistema operativo que posea un compilador para lenguage C compatible con ANSI C. De todas maneras listaré los sistemas donde no habrá problemas para compilar y ejecutar el descomentador:
  • GNU/Linux
  • FreeBSD, OpenBSD, NetBSD
  • Mac OS X
  • Windows
AVISO

Recuerde que descomentar ficheros fuentes podría resultar en grandes consecuencias morales y económicas, se desaconseja su uso, úselo cuando sea realmente necesario y bajo su propia responsabilidad, no me hago responsable de lo que pueda pasar o de los archivos que se corrompan usándolo.

Despedida

Si  bien hice todo lo posible por seguir buenas maneras y estilo mientras programaba el descomentador, todo se fue a pique cuando tuve que reducirlo a un fichero para poder distribuirlo con Google Docs; mis más sinceras disculpas.

¿Tienes alguna funcionalidad nueva en mente? ¿Encontraste algún error o tienes alguna inquietud? No dude en hacérmela saber.

Descarga Código Fuente Del Programa