elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Utilería, reemplazar TAB por " "
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Utilería, reemplazar TAB por " "  (Leído 6,457 veces)
Yoel Alejandro

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Utilería, reemplazar TAB por " "
« en: 11 Marzo 2014, 04:15 am »

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
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3.  
  4. /* Este programa reemplaza los caracteres TAB del fichero de texto
  5.  * pasado como primer argumento por una cantidad determinada de espacios,
  6.  * y escribe su salida en el fichero pasado como segundo argumento.
  7.  * El tercer argumento (opcional) especifica cuántos caracteres ' '
  8.  * reemplazarán el TAB, y si no se indica, se tomará una cantidad de tres.
  9.  */
  10.  
  11. int main( int argc, char *argv[]) {
  12.  
  13.   int i, N_spaces;
  14.   char c;
  15.   char * in_fname, * out_fname;
  16.   FILE * in_fptr = NULL, * out_fptr = NULL;
  17.  
  18.   if ( argc < 2 ) {
  19.      printf("Use:\n tab in_file out_file\n tab in_file out_file N_spaces\n");
  20.      goto failure;
  21.   }
  22.  
  23.   in_fname = argv[1];
  24.  
  25.   if ( argc > 3 ) {
  26.      N_spaces = atoi( argv[3] );
  27.      if ( N_spaces < 1 )
  28.         N_spaces = 3;
  29.      }
  30.   else
  31.      N_spaces = 3;
  32.  
  33.   if ( ( in_fptr = fopen( in_fname, "r" ) ) == NULL ) {
  34.      printf( "No existe o no se pudo abrir '%s'\n", in_fname );
  35.      goto failure;
  36.   }
  37.  
  38.   /* toma stdout si falta fichero de salida */
  39.   if ( argc < 3 )
  40.      out_fptr = stdout;
  41.   else   {
  42.      out_fname = argv[2];
  43.      if ( ( out_fptr = fopen( out_fname, "w" ) ) == NULL ) {
  44.         printf( "Imposible crear, abrir o escribir en '%s'\n", out_fname );
  45.         goto failure;
  46.      }
  47.   }
  48.  
  49.   /* reemplazando TAB por N_spaces caracteres ' ' */
  50.   while ( ( c = fgetc( in_fptr ) ) != EOF ) {
  51.      if ( c != '\t' )
  52.         fputc( c, out_fptr );
  53.      else
  54.         for ( i = 0; i < N_spaces; i++ )
  55.            fputc( ' ', out_fptr );
  56.   }
  57.  
  58.   if ( in_fptr != NULL ) fclose( in_fptr);
  59.   if ( out_fptr != NULL ) fclose( out_fptr);
  60.   return 0;
  61.  
  62. failure:
  63.   if ( in_fptr != NULL ) fclose( in_fptr);
  64.   if ( out_fptr != NULL ) fclose( out_fptr);
  65.   return -1;
  66. }

NOTA. Una alternativa es la utilería "sed" (UNIX), pero no se si tiene alternativa Windows.


En línea

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


Desconectado Desconectado

Mensajes: 455



Ver Perfil
Re: Utilería, reemplazar TAB por " "
« Respuesta #1 en: 11 Marzo 2014, 04:57 am »

Gracias por compartir :)


En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Utilería, reemplazar TAB por " "
« Respuesta #2 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
En línea

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


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Utilería, reemplazar TAB por " "
« Respuesta #3 en: 11 Marzo 2014, 11:56 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.
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Utilería, reemplazar TAB por " "
« Respuesta #4 en: 11 Marzo 2014, 12:44 pm »

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.

se denominan "beautifier" y hacen bastantes más cosas aparte de indentar el código.
¿Que más hacen esos programas a parte de indentar?
En línea

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


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Utilería, reemplazar TAB por " "
« Respuesta #5 en: 11 Marzo 2014, 13:12 pm »

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 :)
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Utilería, reemplazar TAB por " "
« Respuesta #6 en: 11 Marzo 2014, 15:57 pm »

De 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
En línea

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

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: Utilería, reemplazar TAB por " "
« Respuesta #7 en: 12 Marzo 2014, 00:35 am »

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.
« Última modificación: 12 Marzo 2014, 04:29 am por yoel_alejandro » En línea

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


Desconectado Desconectado

Mensajes: 1.248


Ver Perfil
Re: Utilería, reemplazar TAB por " "
« Respuesta #8 en: 12 Marzo 2014, 08:17 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.
En línea

Yoel Alejandro

Desconectado Desconectado

Mensajes: 254



Ver Perfil WWW
Re: Utilería, reemplazar TAB por " "
« Respuesta #9 en: 13 Marzo 2014, 00:55 am »

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
En línea

Saludos, Yoel.
P.D..-   Para mayores dudas, puedes enviarme un mensaje personal (M.P.)
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines