|Portada|Blog|Space|

[Índice] > Aprolijamiento de código a escala global

Como no podía ser menos, aquí volvemos con una entrega más de mi blog, y
para no perder la costumbre es que nuevamente vamos a mostrar unos
lindos ejemplos prácticos en sed.

¿Cómo aprolijar el código fuente?

A lo largo de la historia se han presentado varias soluciones, aunque
ninguna perfecta, la más cercana parecería ser usar el programa indent,
aunque lamentablemente este programa no soporta la sintaxis que a mí
tanto me gusta.

Es bien sabido también que las tareas hay que modularizarlas, por eso
ahora vamos a ir separando el problema en secciones y mostrando aquí
soluciones prácticas usando pequeños scripts en sed.

Problema 1:

  Gente que por alguna razón se entretiene poniendo espacios al final de
  las líneas. La solución es fácil.

  Solución:

  sed -e 's/[ 	]*$//'
	      ^esto es un espacio seguido de una tabulación

Problema 2:

  Tipos que abren las llaves en líneas separadas. Ejemplo:

  mi_funcion(void)
  {
    ...

  Solución:

  sed -e ':a;N;s/) *\n[ 	]*{/) {/;t;P;s/.*\n//;ta'
			  ^esto es un espacio seguido de una tabulación

Problema 3:

  Tipos que ponen los tipos de datos en la línea anterior a la
  definición de la función. Ejemplo:

  int *
  mi_funcion(){
    ...

  Solución:

  Habiendo solucionado los problemas anteriores procedemos a ejecutar el
  siguiente script:

  sed -e ':a;N;/[^} ] *\n[^ 	].*{/s/\n/ /;t;P;s/.*\n//;ta'
			      ^esto es un espacio con una tabulación

Problema 4:

  Gente que coloca los punteros de forma aleatoria.

  Solución:

  sed -e 's/\([[:alnum:]_]\) *\* */\1 * /g'
  sed -e 's/\(^[[:blank:]]*\|[^[:alnum:]_ ] *\)\* */\1*/g'

Problema 5:

  Espacio adictos segunda parte, gente que le gusta poner muchos
  espacios entre palabras.

  Solución:

  sed -e 's/\([[:alnum:]_]\)  *\([[:alnum:]_]\)/\1 \2/g'

Problema 6:

  Finalmente hay gente que no le gusta colocar los márgenes
  correctamente, así que a esa gente les digo esto:

  Solución:

  sed -e '/^$/b;/[[:blank:]]*#/b;s/^[[:blank:]]*//
  /} *\(\/\*\([^*]\|\*[^/]\)*\*\/ *\)*\(\/\/.*\)\?$/{x;s/  -*$//;x};G
  ta;:a;s/\(\n.*\)-/\1 /;ta;s/\(.*\)\n\(.*\)/\2\1/
  /{ *\(\/\*\([^*]\|\*[^/]\)*\*\/ *\)*\(\/\/.*\)\?$/{x;s/$/  /;x}
  /[^{;} ] *\(\/\*\([^*]\|\*[^/]\)*\*\/ *\)*\(\/\/.*\)\?$/{x;s/$/--/;x}
  /; *\(\/\*\([^*]\|\*[^/]\)*\*\/ *\)*\(\/\/.*\)\?$/{x;s/-*$//;x}'

Nota: Los scripts anteriores deberán ser ejecutados en orden sobre el
archivo en cuestión para obtener el resultado deseable.

---------
Los documentos en este sitio se encuentran licenciados bajo la GFDL.
Ver comentarios: [Hay i comentarios]
Para agregar un comentario: agregue a la URL: ?do=show_comment_form (explicación)