Utilería, reemplazar TAB por " "

Iniciado por Yoel Alejandro, 11 Marzo 2014, 04:15 AM

0 Miembros y 1 Visitante están viendo este tema.

Yoel Alejandro

Hola, comparto un programilla que puede ser útil en este mismo foro. Encuentro que al subir código con la etiqueta code, los tabuladores son reemplazados por una cantidad de espacios que a mi entender son demasiados (son como 8). El código entonces toma una aparienci anti-estética  :-\. Se me ocurrió hacer un programa llamado "tab" que reemplace todos los TAB en el fichero .c original por una cantidad de espacios determinada, y vuelque su salida a un fichero auxiliar, cuyo contenido copiaré dentro de la etiqueta code.

La sintaxis (UNIX)

./tab fichero_entrada fichero_salida N_spaces

y en DOS quitar el "./" que antecede a tab. Por ejemplo, "tab code.c code2.c 3". Si no se indica N_spaces se toman 3, y si no se indica fichero de salida toma la salida estándar.

Código (cpp) [Seleccionar]

#include <stdlib.h>
#include <stdio.h>

/* Este programa reemplaza los caracteres TAB del fichero de texto
* pasado como primer argumento por una cantidad determinada de espacios,
* y escribe su salida en el fichero pasado como segundo argumento.
* El tercer argumento (opcional) especifica cuántos caracteres ' '
* reemplazarán el TAB, y si no se indica, se tomará una cantidad de tres.
*/

int main( int argc, char *argv[]) {
   
   int i, N_spaces;
   char c;
   char * in_fname, * out_fname;
   FILE * in_fptr = NULL, * out_fptr = NULL;
   
   if ( argc < 2 ) {
      printf("Use:\n tab in_file out_file\n tab in_file out_file N_spaces\n");
      goto failure;
   }
   
   in_fname = argv[1];
   
   if ( argc > 3 ) {
      N_spaces = atoi( argv[3] );
      if ( N_spaces < 1 )
         N_spaces = 3;
      }
   else
      N_spaces = 3;
   
   if ( ( in_fptr = fopen( in_fname, "r" ) ) == NULL ) {
      printf( "No existe o no se pudo abrir '%s'\n", in_fname );
      goto failure;
   }
   
   /* toma stdout si falta fichero de salida */
   if ( argc < 3 )
      out_fptr = stdout;
   else   {
      out_fname = argv[2];
      if ( ( out_fptr = fopen( out_fname, "w" ) ) == NULL ) {
         printf( "Imposible crear, abrir o escribir en '%s'\n", out_fname );
         goto failure;
      }
   }
   
   /* reemplazando TAB por N_spaces caracteres ' ' */
   while ( ( c = fgetc( in_fptr ) ) != EOF ) {
      if ( c != '\t' )
         fputc( c, out_fptr );
      else
         for ( i = 0; i < N_spaces; i++ )
            fputc( ' ', out_fptr );
   }
   
   if ( in_fptr != NULL ) fclose( in_fptr);
   if ( out_fptr != NULL ) fclose( out_fptr);
   return 0;
   
failure:
   if ( in_fptr != NULL ) fclose( in_fptr);
   if ( out_fptr != NULL ) fclose( out_fptr);
   return -1;
}


NOTA. Una alternativa es la utilería "sed" (UNIX), pero no se si tiene alternativa Windows.
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

vangodp


amchacon

Interesante, es muy util para python sobre todo (anda que no dan errores las tabulaciones ni nada).

PD: Un programa que te identase el código sería gracioso ;D
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

eferion

Cita de: amchacon en 11 Marzo 2014, 11:44 AM
Interesante, es muy util para python sobre todo (anda que no dan errores las tabulaciones ni nada).

PD: Un programa que te identase el código sería gracioso ;D

Ya existen ese tipo de programas... se denominan "beautifier" y hacen bastantes más cosas aparte de indentar el código.

A título personal, para C / C++ me gusta mucho Uncrustify. Tiene muchísimas opciones de configuración.

Precisamente debido a su libertad en cuanto a configuraciones es recomendable descargarse UniversalIndent. Es un GUI Genérico que permite configurar de forma bastante amigable un buen número de indentadores.

amchacon

Yo por comodidad, uso un plugin que viene en el codeblocks. Así no tengo que estar abriendo un programa cada vez.

De todas formas, me refería a intentar hacer el tuyo propio. Es un reto interesante.

Cita de: eferion en 11 Marzo 2014, 11:56 AMse denominan "beautifier" y hacen bastantes más cosas aparte de indentar el código.
¿Que más hacen esos programas a parte de indentar?
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar

eferion

Básicamente permiten presentar el código con un estilo uniforme ( no renombran métodos ni variables, pero son capaces de formatear todo el código ).

Por poner algunas cosas:

* Limitar la longitud máxima de cada línea.
* Permite convertir tabs a espacios y viceversa.
* Indica si se añaden o no espacios dentro de paréntesis, llaves, etc.
* Indica cómo se deben tabular las indentaciones ( bucles, switch, if, etc )
* Permite que todos los archivos de un proyecto tengan el mismo formato ( UTF-8, ASCII, etc. )
* Establece un formato común para los saltos de línea ( Windows, Linux, Mac )
* Elegir si antes y/o después de separadores ( comas, puntos, paréntesis, operadores ) se añaden o se eliminan los espacios.
* Permite unir / separar líneas bajo ciertas condiciones ( bucles, condicionales, ... )
* Permite alinear código.


Sus configuraciones son de lo más variopintas y, dedicando tiempo a la configuración se puede conseguir el formato de código deseado cuidando hasta el más pequeño detalle.

Eso sí, para configurar un beautifier completo de forma seria hay que tener al menos dos virtudes:

* Saber inglés
* Tener paciencia.

Aún así hay opciones que, a primera vista, no queda muy claro qué hacen, pero bueno, todo es cuestión de copiar en el GUI un archivo de código y aplicarle el formato para ver qué sucede al cambiar determinadas configuraciones.

Aunque bueno, el GUI permite guardar la configuración en un archivo de texto, por lo que la configuración solo tenemos que prepararla una vez :)

rir3760

Cita de: amchacon en 11 Marzo 2014, 12:44 PMDe todas formas, me refería a intentar hacer el tuyo propio. Es un reto interesante.
¿Que más hacen esos programas a parte de indentar?
Otro aplicación de ese tipo es astyle, un listado de sus opciones se encuentra en su documentacion en linea.

Un saludo
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language

Yoel Alejandro

#7
Bueno, una cosa es hacer un programilla a gusto propio en 5 ó 10 min (y justo para eso estamos, pues es un foro de programadores) para solucionar alguna necesidad sobre la marcha, y otra es ir más allá y probar una herramienta profesional, jeje.

Me parece interesante el "astyle" (Artistic Style), y sobre todo porque funciona por ordenes de comandos (en lo particular uso mucho más el teclado que el ratón), y por lo que leí permite crear y cargar un fichero de configuración con tus opciones preferidas, con la orden --options=opt_file

Por lo general creo no necesitar un embellecedor de código si el mismo lo hice yo (jeje) porque trato de ser prolijo en la escritura. Pero sí que sería necesario al abrir el código fuente que suben algunos usuarios (principiantes más que todo) de este foro, y los hacen feiiiiiísimos :o, con el beautifier se acomoda rápido y se puede editar más cómodamente.

Quizá termine proponiendo presentar nuestros propios minicódigos que imiten algunas de las funcionalidades de los buautifiers, .... ya saben, a manera de ejercicio para nosotros mismos  :D

=================================
EDITO:

Este astyle es fantástico, en primer lugar es tipo command-line lo que imagino lo hace muy potente. Para imitar el comportamiento de mi programa tab, la orden correspondiente es:

astyle --indent=spaces=3 < source.c > out.txt

para sacar la salida en un txt, reemplazando los TAB por 3 espacios.

Thanks.
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)

eferion

Cita de: yoel_alejandro en 12 Marzo 2014, 00:35 AM
Este astyle es fantástico, en primer lugar es tipo command-line lo que imagino lo hace muy potente. Para imitar el comportamiento de mi programa tab, la orden correspondiente es:

astyle --indent=spaces=3 < source.c > out.txt

para sacar la salida en un txt, reemplazando los TAB por 3 espacios.

Uncrustify también funciona por línea de comandos... este modo de funcionamiento es casi un estándar para este tipo de programas.

Por eso se diseñó UniversalIndent... para dotar de interfaz gráfica a éste tipo de programas.

Yoel Alejandro

Interfaz gráfica que difícilmente usaré, jajajaja, deben saber que soy un "talibán" de la consola, jeje

Pero bueno como he dicho antes, cada quién con su gusto, hay quiénes gustan de la GUI's y a quiénes gustan de la consola, saludos  :D
Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)