/************************************************************************\ |* *| |* 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 #include // 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 ); }