INDEXM/BONITRON.CPP
2021-09-08 21:23:56 +02:00

244 lines
6.8 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/************************************************************************\
|* *|
|* Programa para poner bonito el c¢digo fuente de los otros programas... *|
|* *|
|* Jos David Guilln *|
|* *|
|* 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 esttico 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 );
}