244 lines
6.8 KiB
C++
244 lines
6.8 KiB
C++
/************************************************************************\
|
||
|* *|
|
||
|* Programa para poner bonito el c¢digo fuente de los otros programas... *|
|
||
|* *|
|
||
|* Jos‚ David Guill‚n *|
|
||
|* *|
|
||
|* Historia *|
|
||
|* Hay veces que empiezo a escribir un programa que creo que no *|
|
||
|* me va a servir para nada y cuando me doy cuenta lo estoy re- *|
|
||
|* escribiendo o adaptandolo, pero es un Spagetti-Code tan *|
|
||
|* grande que pierdo un buen rato sangrandolo. Bien, pues se *|
|
||
|* acabo el 'frotar' ya tengo 'bonitron'.... *|
|
||
|* *|
|
||
\************************************************************************/
|
||
|
||
#include <stdio.h>
|
||
#include <string.h>
|
||
|
||
// los corchetes son '{' y '}'
|
||
#define DESPLAZAMIENTO_CORCHETE 2
|
||
// Considero etiquetas a los 'case' de switch();
|
||
#define DESPLAZAMIENTO_ETIQUETA 12
|
||
|
||
// Mayor longitud de palabra compleja
|
||
#define PALABRA_MAXIMA 14
|
||
|
||
void main( int argc, char *argv[] )
|
||
{
|
||
FILE *ORIGEN, *DESTINO;
|
||
int i;
|
||
int charR, OcharR;
|
||
int NivelActual, NivelEtiqueta;
|
||
char DetectadoEOL,
|
||
DetectadoComm;
|
||
char BufferPalabra[PALABRA_MAXIMA + 1];
|
||
|
||
|
||
if ( argc != 3 )
|
||
{
|
||
printf( "\nError, n§ de parametros erroneo\n" );
|
||
return;
|
||
}
|
||
|
||
if ( ( ORIGEN = fopen( argv[1], "rt" ) ) == NULL ||
|
||
( DESTINO = fopen( argv[2], "wt" ) ) == NULL )
|
||
{
|
||
printf( "\nError abriendo el origen o destino\n" );
|
||
return;
|
||
}
|
||
|
||
NivelEtiqueta = 0;
|
||
NivelActual = 0;
|
||
DetectadoEOL = 0;
|
||
DetectadoComm = 0;
|
||
BufferPalabra[0] = '\0';
|
||
|
||
charR = 0;
|
||
while ( !feof(ORIGEN) )
|
||
{
|
||
OcharR = charR;
|
||
charR = fgetc(ORIGEN);
|
||
|
||
switch( charR )
|
||
{
|
||
// Cuidadin con esto
|
||
case '\n':
|
||
case '\r':
|
||
BufferPalabra[0] = '\0';
|
||
|
||
DetectadoComm = 0;
|
||
|
||
DetectadoEOL = 1;
|
||
|
||
fputc( charR, DESTINO );
|
||
break;
|
||
case '=':
|
||
case '<':
|
||
case '>':
|
||
case '!':
|
||
case '+':
|
||
case '-':
|
||
case '/':
|
||
case '*':
|
||
case '^':
|
||
case ']':
|
||
case ')':
|
||
case '[':
|
||
case '(':
|
||
case '"':
|
||
// Si antes no hab¡a un espacio, ni un caracter de los anteriores
|
||
// me parece mas est‚tico un espacio antes.
|
||
if ( OcharR != ' ' &&
|
||
OcharR != '=' && OcharR != '*' &&
|
||
OcharR != '<' && OcharR != '^' &&
|
||
OcharR != '>' && OcharR != '[' &&
|
||
OcharR != ']' && OcharR != '(' &&
|
||
OcharR != '!' && OcharR != ')' &&
|
||
OcharR != '+' && OcharR != '-' &&
|
||
OcharR != '/' )
|
||
{
|
||
fputc( ' ', DESTINO );
|
||
}
|
||
fputc( charR, DESTINO );
|
||
DetectadoEOL = 0;
|
||
break;
|
||
// Veamos las etiquetas
|
||
case ':':
|
||
if ( !DetectadoComm )
|
||
{
|
||
if ( !DetectadoEOL )
|
||
fputc( 13, DESTINO );
|
||
NivelActual += DESPLAZAMIENTO_ETIQUETA;
|
||
NivelEtiqueta += DESPLAZAMIENTO_ETIQUETA;
|
||
fputc( ':', DESTINO );
|
||
}
|
||
DetectadoEOL = 0;
|
||
break;
|
||
// Corchetes de entrada
|
||
case '{':
|
||
if ( !DetectadoComm )
|
||
{
|
||
if ( !DetectadoEOL )
|
||
fputc( 13, DESTINO );
|
||
for ( i = 0; i < NivelActual; i++ )
|
||
fputc( ' ', DESTINO );
|
||
fputc( '{', DESTINO );
|
||
NivelActual+=DESPLAZAMIENTO_CORCHETE;
|
||
}
|
||
DetectadoEOL = 0;
|
||
break;
|
||
// Corchetes de Salida
|
||
case '}':
|
||
if ( !DetectadoComm )
|
||
{
|
||
if ( !DetectadoEOL )
|
||
fputc( 13, DESTINO );
|
||
NivelActual-=DESPLAZAMIENTO_CORCHETE;
|
||
for ( i = 0; i < NivelActual; i++ )
|
||
fputc( ' ', DESTINO );
|
||
fputc( '}', DESTINO );
|
||
}
|
||
DetectadoEOL = 0;
|
||
break;
|
||
case ';':
|
||
if ( OcharR == '}' )
|
||
fputc( ' ', DESTINO );
|
||
fputc( ';', DESTINO );
|
||
DetectadoEOL = 0;
|
||
break;
|
||
// Salvamos el EOL, para los corchetes
|
||
case ' ':
|
||
// Nos saltamos todos los espacios blancos
|
||
if ( !DetectadoEOL )
|
||
fputc( charR, DESTINO );
|
||
BufferPalabra[0] = '\0';
|
||
break;
|
||
|
||
// No sabemos procesar el simbolo
|
||
default:
|
||
if ( NivelActual < 0 )
|
||
NivelActual = 0;
|
||
PROCESA_CARACTER_POR_DEFECTO:
|
||
if ( DetectadoEOL )
|
||
for ( i = 0; i < NivelActual/*+DESPLAZAMIENTO_CORCHETE*/; i++ )
|
||
fputc( ' ', DESTINO );
|
||
DetectadoEOL = 0;
|
||
|
||
switch ( OcharR )
|
||
{
|
||
case '=':
|
||
case '<':
|
||
case '>':
|
||
case '!':
|
||
case '+':
|
||
case '-':
|
||
case '/':
|
||
case '*':
|
||
case '^':
|
||
case ']':
|
||
case '[':
|
||
case '(':
|
||
case ')':
|
||
// Si el carater actual no es ninguno de estos, ni un espacio
|
||
// quedaria muy bien un espacio detras de aqui...
|
||
if ( charR != ' ' &&
|
||
charR != '=' && charR != '*' &&
|
||
charR != '<' && charR != '^' &&
|
||
charR != '>' && charR != '[' &&
|
||
charR != ']' && charR != '(' &&
|
||
charR != '!' && charR != ')' &&
|
||
charR != '+' && charR != '-' &&
|
||
charR != '/' )
|
||
{
|
||
fputc( ' ', DESTINO );
|
||
}
|
||
fputc( charR, DESTINO );
|
||
break;
|
||
default:
|
||
fputc( charR, DESTINO );
|
||
}
|
||
|
||
// Procesado de palabras complejas
|
||
i = strlen(BufferPalabra);
|
||
BufferPalabra[ i ] = (char)charR;
|
||
BufferPalabra[ i+1] = '\0';
|
||
|
||
// Detectado 'break'
|
||
if ( strcmp( BufferPalabra, "break;" ) == 0 )
|
||
{
|
||
NivelEtiqueta -= DESPLAZAMIENTO_ETIQUETA;
|
||
if ( NivelEtiqueta >= 0 )
|
||
NivelActual -= DESPLAZAMIENTO_ETIQUETA;
|
||
fputc( 13, DESTINO );
|
||
|
||
BufferPalabra[0] = '\0';
|
||
}
|
||
|
||
if ( strcmp( BufferPalabra, "//" ) == 0 )
|
||
{
|
||
BufferPalabra[0] = '\0';
|
||
DetectadoComm = 0;
|
||
}
|
||
|
||
if ( strlen( BufferPalabra ) == PALABRA_MAXIMA )
|
||
BufferPalabra[0] = '\0';
|
||
|
||
break;
|
||
}
|
||
|
||
|
||
}
|
||
|
||
|
||
|
||
fclose( ORIGEN );
|
||
fclose( DESTINO );
|
||
|
||
}
|
||
|
||
|
||
|
||
|
||
|