Sophie

Sophie

distrib > Mandriva > 9.2 > i586 > by-pkgid > 0bf74b6493241ea2388028ea27a3655d > files > 18

ispell-fr-1.0-15mdk.noarch.rpm

#! /usr/bin/perl

# Ce programme permet de répartir les mots d'un fichier dans plusieurs
# autres fichiers (un mot par ligne).  On peut interrompre l'opération et
# la reprendre plus tard.  Attention : le fichier d'origine est modifié
# à la fin de la session !  Les mots qui ont été répartis en sont retirés.
# Le nombre maximum de fichiers est fixé à 10.
#
# Ce programme utilise le module Term::ReadKey (2.12), disponible sur CPAN.

use Term::ReadKey;
use FileHandle;
use strict;

# ------------------------------------------------------------

my $MAX_FICHIERS = 8;  # Attention, si vous augmentez ce nombre, il faut
                       # modifier le reste du programme

# ------------------------------------------------------------

# Précaution...
$SIG{INT} = \&ctrl_C;  # Pour éviter de laisser le terminal inutilisable


# Vérif. du nbre d'args
if (@ARGV < 3 || @ARGV > $MAX_FICHIERS + 1) {
  print STDERR "\
repartmots: SYNTAXE: repartmots fichier_orig fichier_1 fichier_2
                                [... fichier_$MAX_FICHIERS]\n";
  exit (2);
}


# Ouvert. des fichiers
unless (open LISTE_MOTS, $ARGV[0]) {
  print STDERR "repartmots: impossible d'ouvrir le fichier $ARGV[0] !\n";
  exit (3);
}

my @fichier;
for (my $i = 1; $i < @ARGV; $i++) {
  $fichier[$i] = new FileHandle;
  unless ($fichier[$i]->open(">>$ARGV[$i]")) {
    print STDERR "\
repartmots: impossible d'ouvrir le fichier $ARGV[$i]
            pour lui ajouter des données !\n";
    exit (4);
  }
}

# Boucle principale
my ($mot, $sauv, $touche, $no_fichier);

$sauv = 0;
for (;;) {
  print "****************************************************************\n\n";
  unless ($sauv) { # si on vient de sauver, on ne lit pas de nouvelle ligne
    if (eof LISTE_MOTS) {
      print "\nFin du fichier atteinte !\n";
      last;
    }
    else {
      $mot = <LISTE_MOTS>;
    }
  }
  print "MOT SUIVANT : $mot\n\n";
  print "Choisissez :\n";
  print "------------\n\n";
  for (my $i = 1; $i < @ARGV; $i++) {
    print "$i : envoyer vers le fichier $ARGV[$i]\n";
  }
  print "i : ignorer le mot\n";
  unless ($sauv) { # ne pas proposer l'option si on vient de sauvegarder
    print "s : sauvegarder le travail accompli jusqu'ici\n";
  }
  print "q : quitter\n\n";

  for (;;) {
    ReadMode 3;
    $touche = ReadKey;
    ReadMode 0;

    if ($touche eq "i") { # IGNORER
      $sauv = 0;
      last;
    }
    elsif ($touche eq "s") { # SAUVEGARDER
      if ($sauv) { # on vient d'effectuer une sauvegarde, alors beep...
	print "\a";
      }
      else {
	print "Sauvegarde en cours... Patience...\n";
	unless (open FICHIER_PROV, ">$ARGV[0]-prov") {
	  print STDERR "repartmots: impossible de créer un fichier ";
	  print STDERR "temporaire pour la sauvegarde !\n";
	  print STDERR "            La sauvegarde n'a pas pu être ";
	  print STDERR "effectuée !\n";
	  exit (6);
	}
	unless (print FICHIER_PROV $mot) {
	  print STDERR "repartmots: impossible d'écrire dans le fichier ";
	  print STDERR "temporaire pour la sauvegarde !\n";
	  print STDERR "            La sauvegarde n'a pas pu être ";
	  print STDERR "effectuée !\n";
	  exit (6);
	}
	while (<LISTE_MOTS>) {
	  unless (print FICHIER_PROV $_) {
	    print STDERR "repartmots: impossible d'écrire dans le fichier ";
	    print STDERR "temporaire pour la sauvegarde !\n";
	    print STDERR "            La sauvegarde n'a pas pu être ";
	    print STDERR "effectuée !\n";
	    exit (6);
	  }
	}
	close LISTE_MOTS;
	close FICHIER_PROV;
	unless (rename "$ARGV[0]-prov", $ARGV[0]) {
	  print STDERR "repartmots: impossible de remplacer le fichier ";
	  print STDERR "$ARGV[0] original !\n";
	  print STDERR "            La sauvegarde n'a pas pu être ";
	  print STDERR "complétement effectuée !\n";
	  print STDERR "            Vous pouvez cependant utiliser le ";
	  print STDERR "fichier $ARGV[0]-prov.\n";
	  exit (7);
	}
	unless (open LISTE_MOTS, $ARGV[0]) {
	  print STDERR "repartmots: impossible de réouvrir le fichier ";
	  print STDERR "$ARGV[0] !\n";
	  exit (8);
	}
	$sauv = 1;
	last;
      }
    }
    elsif ($touche eq "q") { # QUITTER
      if ($sauv) { # Sauvegarde effectuée, on quitte sans autre...
	for (my $i = 1; $i < @ARGV; $i++) {
	  $fichier[$i]->close();
	}
	close LISTE_MOTS;
	exit(0);
      }
      else {
	print "Désirez-vous effectuer une sauvegarde du travail accompli";
	print " (o/n) ?\n";
	while ($touche ne "o" && $touche ne "n") {
	  ReadMode 3;
	  $touche = ReadKey;
	  ReadMode 0;
	}
	if ($touche eq "n") {
	  exit(0);
	}
	else {
	  print "Sauvegarde en cours... Patience...\n";
	  unless (open FICHIER_PROV, ">$ARGV[0]-prov") {
	    print STDERR "repartmots: impossible de créer un fichier ";
	    print STDERR "temporaire pour la sauvegarde !\n";
	    print STDERR "            La sauvegarde n'a pas pu être ";
	    print STDERR "effectuée !\n";
	    exit (6);
	  }
	  unless (print FICHIER_PROV $mot) {
	    print STDERR "repartmots: impossible d'écrire dans le fichier ";
	    print STDERR "temporaire pour la sauvegarde !\n";
	    print STDERR "            La sauvegarde n'a pas pu être ";
	    print STDERR "effectuée !\n";
	    exit (6);
	  }
	  while (<LISTE_MOTS>) {
	    unless (print FICHIER_PROV $_) {
	      print STDERR "repartmots: impossible d'écrire dans le fichier ";
	      print STDERR "temporaire pour la sauvegarde !\n";
	      print STDERR "            La sauvegarde n'a pas pu être ";
	      print STDERR "effectuée !\n";
	      exit (6);
	    }
	  }
	  close LISTE_MOTS;
	  close FICHIER_PROV;
	  unless (rename "$ARGV[0]-prov", $ARGV[0]) {
	    print STDERR "repartmots: impossible de remplacer le fichier ";
	    print STDERR "$ARGV[0] original !\n";
	    print STDERR "            La sauvegarde n'a pas pu être ";
	    print STDERR "complétement effectuée !\n";
	    print STDERR "            Vous pouvez cependant utiliser le ";
	    print STDERR "fichier $ARGV[0]-prov.\n";
	    exit (7);
	  }
	  for (my $i = 1; $i < @ARGV; $i++) {
	    $fichier[$i]->close();
	  }
	  exit(0);
	}
      }
    }
    elsif (ord($touche) >= ord('1') && ord($touche) < ord('1') + @ARGV - 1) {
      $sauv = 0;
      $no_fichier = ord($touche) - ord('1') + 1;
      unless ($fichier[$no_fichier]->print($mot)) {
	print STDERR "repartmots: impossible d'écrire dans le fichier ";
	print STDERR "$ARGV[$no_fichier] !\n";
	exit (5);
      }
      last;
    }
    else { # MAUVAISE TOUCHE
      print "\a";
    }
  }
}

# Fermeture des fichiers
for (my $i = 1; $i < @ARGV; $i++) {
  $fichier[$i]->close();
}
close LISTE_MOTS;

# ------------------------------------------------------------

sub ctrl_C {
  ReadMode 0;  # au cas où le programme est arrêté brutalement,
               # on remet le terminal « en état »
  print STDERR "Traitement interrompu...\n";
  exit (1);
}