/*--------------------------------------------------------------------------*\ * Filter.c - Supprimer les accents et les tabulations d'un fichier. *-------------------------------------------------------------------------- * Copyright (c) 1990-2000 AbyreSoft. Written by BRy. *-------------------------------------------------------------------------- * Creation : 20/02/01 * Evolutions : * les constantes MAXCAR et MAXCHAINE ont ete augmentees * Remarque : * le code est complexe mais la commandes rend bien des les services * demandes \*--------------------------------------------------------------------------*/ #include #include #include #include /* _getche */ #include /* _finddata_t _findfirst ,_findnext, _findclose */ /*--------------------------------------------------------------------------*/ #define MAXCAR 256 /* Max de caracteres dans un nom de fichier */ #define MAXLISTE 100 /* Max de fichiers a traiter dans un liste */ #define MAXCHAINE 256 /* Longueur max des chaines */ /*--------------------------------------------------------------------------*/ /* Boolean definition */ #define boolean unsigned char #define false ((boolean)0) #define true (!false) /*--------------------------------------------------------------------------*/ /* Debug functions */ #ifndef NDEBUG # include "pmTrace.h" # define as_printf pm_trace0 #else # define as_printf printf # define FilterMain main #endif /*--------------------------------------------------------------------------*/ static int FiltrerTabulation( FILE *fileIn, FILE *fileOut, int sizeTab ); static int FiltrerAccent( FILE *fileIn, FILE *fileOut ); static void DemandeParametres( void ); /*--------------------------------------------------------------------------*/ int FilterMain( int argc, char *argv[] ) { FILE *file_in, *file_out1, *file_out2 = NULL; struct _finddata_t file_infos; long handle_file; char chaine_taille_tab[MAXCHAINE]; int taille_tab = 4; int nb_tabulation = 0, nb_accent = 0; char liste_files[MAXLISTE][MAXCAR]; char liste_fichiers[MAXLISTE][MAXCAR]; boolean filtrer_tabulation = false, filtrer_accent = false; boolean demande_confirmation = false; int i,j; /* Initialisations */ for ( i = 0 ; i < MAXLISTE ; i++ ) { liste_files[i][0] = '\x0'; liste_fichiers[i][0] = '\x0'; } /* Traiter les parametres */ if ( argc < 2 ) { DemandeParametres(); } for ( i = 1, j = 0 ; i < argc; i++ ) /* argv[0] : nom du programme en cours */ { /* argc : compteur des arguments */ if ( strcmpi( argv[i], "?") == 0 ) { DemandeParametres(); } else if ( strncmp( argv[i], "-t=", 3) == 0 ) { /* Entree utilisateur : taille des tabulations */ strcpy( chaine_taille_tab , &argv[i][3]); taille_tab = atoi( chaine_taille_tab ); if ( taille_tab < 1 || taille_tab > 80 ) { taille_tab = 4; } filtrer_tabulation = true; } else if ( strncmp( argv[i], "-a", 2) == 0 ) { filtrer_accent = true; } else if ( strncmp( argv[i], "-c", 2) == 0 ) { demande_confirmation = true; } else { /* Si ce n'est pas une option, c'est un fichier */ strcpy( liste_files[j],argv[i] ); j = j + 1; } }/* fin du for ( argc ) */ if ( ! filtrer_accent && ! filtrer_tabulation ) DemandeParametres(); /* Constituer la liste des fichiers a filtrer */ if ( liste_files[0][0] != '\x0' ) /* la liste n'est pas vide */ { as_printf("Liste des fichiers a filtrer :\n"); } i = 0; j = 0; while ( liste_files[i][0] != '\x0' ) /* fin de la liste */ { handle_file = _findfirst( liste_files[i], &file_infos ); if( handle_file == -1L ) { as_printf("Pas de fichier %s dans le repertoire courant !\n", liste_files[i] ); break; } else { do { /* Les fichiers . et .. ne sont pas a traiter */ if ( ( strcmpi( file_infos.name, "." ) != 0 ) && ( strncmp( file_infos.name, "..", 2 ) != 0 ) ) { as_printf(" %s\n", file_infos.name ); strcpy( liste_fichiers[j++], file_infos.name ); } } while ( _findnext( handle_file, &file_infos ) == 0 ); _findclose( handle_file ); i++; } } if ( j == 0 ) { as_printf("Pas de fichiers trouves.\n"); exit( EXIT_SUCCESS ); } /* Demander confirmation a l'utilisateur pour traiter les fichiers */ if ( demande_confirmation ) { printf("Voulez vous continuer ? : "); if ( _getche() == 'n' ) { exit( EXIT_SUCCESS ); } printf("\n"); } /* Effectuer le traitement des fichiers trouves */ i = 0; while ( liste_fichiers[i][0] != '\x0' ) /* fin de la liste */ { as_printf("Fichier %s : ", liste_fichiers[i] ); /* Demander confirmation pour traiter ce fichier */ if ( demande_confirmation ) { printf("Voulez vous continuer ? : "); if ( _getche() == 'n' ) { exit( EXIT_SUCCESS ); } printf("\n"); } /* Ouvrir le fichier a traiter */ file_in = fopen( liste_fichiers[i], "rb" ); if ( file_in == NULL ) { as_printf("Impossible d'ouvrir le fichier %s\n", liste_fichiers[i] ); exit(EXIT_FAILURE); } /* Ouvrir le fichier temporaire 1 */ file_out1 = fopen( "temp1", "w" ); if ( file_out1 == NULL ) { as_printf("Impossible d'ouvrir le fichier temporaire 1 !\n"); exit( EXIT_FAILURE ); } /* S'il faut filtrer les accents et les tabulations */ if ( filtrer_tabulation && filtrer_accent ) { /* Ouvrir le fichier temporaire 2 */ file_out2 = fopen( "temp2", "w" ); if ( file_out2 == NULL ) { as_printf("Impossible d'ouvrir le fichier temporaire 2 !\n"); exit( EXIT_FAILURE ); } nb_tabulation = FiltrerTabulation( file_in, file_out2, taille_tab ); fclose( file_out2 ); /* Reouvrir le fichier temporaire 2 pour traiter les accents */ file_out2 = fopen( "temp2", "rb" ); if ( file_out2 == NULL ) { as_printf("Impossible d'ouvrir le fichier temporaire 2 !\n"); exit( EXIT_FAILURE ); } nb_accent = FiltrerAccent( file_out2, file_out1 ); } else if ( filtrer_tabulation ) { nb_tabulation = FiltrerTabulation( file_in, file_out1, taille_tab ); } else if ( filtrer_accent ) { nb_accent = FiltrerAccent( file_in, file_out1 ); } /* Fermer les fichiers avant remove() et rename() */ fclose( file_out1 ); fclose( file_in ); /* Y a-t-il des tabulations et des accents */ if ( ( nb_tabulation == 0 ) && ( nb_accent == 0 ) ) { as_printf(" est propre.\n"); /* Supprimer le fichier temporaire 1 */ if ( remove( "temp1" ) == -1 ) { as_printf("Impossible de supprimer le fichier temp1 ! \n"); exit( EXIT_FAILURE ); } } else { /* Supprimer le fichier de depart */ if ( remove( liste_fichiers[i] ) == -1 ) { as_printf("Impossible de supprimer le fichier : %s !\n", liste_fichiers[i] ); exit( EXIT_FAILURE ); } /* Rennomer le fichier temporaire 1 */ if ( rename( "temp1", liste_fichiers[i] ) != 0 ) { as_printf("Renommage du fichier temporaire 1 impossible !\n"); exit( EXIT_FAILURE ); } /* Afficher les resultats */ if ( ( nb_tabulation != 0 ) && ( nb_accent != 0 ) ) { as_printf("%3d tabulations %3d accents.\n", nb_tabulation, nb_accent ); } else if ( nb_tabulation != 0 ) { as_printf("%3d tabulations.\n", nb_tabulation); } else if ( nb_accent != 0 ) { as_printf("%3d accents.\n", nb_accent ); } } /* S'il a ete cree, supprimer le fichier temporaire 2 */ if ( file_out2 ) { fclose( file_out2 ); /* obligatoire avant remove() */ if ( remove( "temp2" ) == -1 ) { as_printf("Impossible de supprimer le fichier temp2 ! \n"); exit( EXIT_FAILURE ); } } /* Passer au fichier suivant */ i = i + 1; } //getche(); // attendre l'utilisateur return EXIT_SUCCESS; }/* fin du main() */ /*--------------------------------------------------------------------------*\ * Remplace les tabulations par des espaces. * sizeTab : nombre d'espaces a mettre a la place d'une tab * file_in : fichier a traiter * file_out : fichier de sortie * retourne le nombre de tabulations remplacees \*--------------------------------------------------------------------------*/ static int FiltrerTabulation( FILE *fileIn, FILE *fileOut, int sizeTab ) { int c; int i = 0; /* numero de colonne du caractere */ int nb_tab = 0; while ( ( c = getc( fileIn ) ) != EOF ) { switch ( c ) { case '\t' : do { putc(' ', fileOut ); } while ( ++i % sizeTab != 0 ); nb_tab++; break; case '\r' : /* ne pas remettre les CR dans le fichier */ break; case '\n' : /* putc('\n') est equivalent a */ i = 0; /* remettre CR-LF dans le fichier */ putc( c, fileOut ); break; default : i++; putc( c, fileOut ); break; } } return nb_tab; } /*--------------------------------------------------------------------------*/ static int FiltrerAccent( FILE *fileIn, FILE *fileOut ) { int c; int nb_accent = 0; while ( ( c = getc( fileIn ) ) != EOF ) { if ( c < 128 ) { if ( c != '\r' ) /* Ne pas remettre les CR dans le fichier de sortie */ putc( c, fileOut ); } else { switch( (char)c ) { /* Minuscule */ case 'à' : case 'â' : case 'ä' : c = 'a'; nb_accent++; break; case 'é' : case 'è' : case 'ê' : case 'ë' : c = 'e'; nb_accent++; break; case 'ï' : case 'î' : c = 'i'; nb_accent++; break; case 'ö' : case 'ô' : c = 'o'; nb_accent++; break; case 'ù' : case 'û' : case 'ü' : c = 'u'; nb_accent++; break; case 'ÿ' : c = 'y'; nb_accent++; break; /* Majuscules */ case 'À' : case 'Â' : case 'Ä' : c = 'A'; nb_accent++; break; case 'É' : case 'È' : case 'Ê' : case 'Ë' : c = 'E'; nb_accent++; break; case 'Ï' : case 'Î' : c = 'I'; nb_accent++; break; case 'Ö' : case 'Ô' : c = 'O'; nb_accent++; break; case 'Ù' : case 'Û' : case 'Ü' : c = 'U'; nb_accent++; break; case 'Ÿ' : c = 'Y'; nb_accent++; break; /* Special caracters */ case 'ç' : c = 'c'; nb_accent++; break; case 'Ç' : c = 'C'; nb_accent++; break; }/* fin du switch ( c ) */ putc( c, fileOut ); } } return nb_accent; } /*--------------------------------------------------------------------------*/ void DemandeParametres( void ) { as_printf("\n"); as_printf("Supra Couche DOS - BRy - Version 3.0\n\n"); as_printf("Supprimer les accents et les tabulations.\n\n"); as_printf("Syntax:\n\n>filter [-cat=n]*.txt *.c *.* fichier.ext ... \n\n"); as_printf("n : nombre d'espaces a la place d'une tabulation (n=4 par defaut)\n"); as_printf("\t-c : demande de confirmation pour le traitement des fichiers\n"); as_printf("\t-a : filtrer uniquement les accents\n"); as_printf("\t-t=n : filtrer uniquement les tabulations a la taille n\n"); as_printf("\t-a -t=n : filtrer les accents et les tabulations a la taille n\n"); exit( EXIT_SUCCESS ); }/* fin de DemandeParametres() */