1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
| #!/usr/bin/perl
# But : Parsing d'un fichier de type C
use warnings;
use strict;
use Regexp::Common qw /comment/;
use Perl6::Slurp;
# Englobe le fichier .h
my $CodeFichierC = slurp "pub_serv.h";
#ouverture du fichier *.txt en mode Ecriture
open WRITER, '>', "decode2.txt" or die "Le fichier ne peut être édité !\n";
# Suppression des commentaires C
my $RegexComment = $RE{comment}{'C++'}; #C++ pour supprimer /* */ ET //
$CodeFichierC =~ s{$RegexComment}{}g;
# Recupère tous les define du fichier
my @define = $CodeFichierC =~ m{
^\s* # La ligne commence par un espace ou non
\#define # suivi de #define
\s* # espace ou non
([^\n]+)\s* # contenu define
\n # se termine par un retour chariot
}mgix;
# Dans le hash, la cle sera le nom d'un define et la valeur celle du define.
my %VariableDefine;
foreach my $Define (@define) {
my ( $var, $value ) = split( /\s+/, $Define );
$VariableDefine{$var} = $value || '';
}
print WRITER "Defines: \n\n";
foreach my $var ( keys %VariableDefine ) {
print WRITER "$var = $VariableDefine{$var}\n";
}
print WRITER "\n============\n\n";
# Recupère tous les bloc enum avec le nom de l'enum (le tout dans @typedef)
# Si le bloc ne match pas avec la regex, il ne sera pas dans @BlocEnum
my @BlocEnum = $CodeFichierC =~ m/
(
enum[^{]+{ # Ligne enum suivi de tous sauf une accolade + accolade
[^}]+ # contenu tout sauf accolade fermante
} # accolade fermante
[^;]+; # suivi du nom de l'enum plus virgule
)
/mgix;
# On va maintenant traiter chaque bloc enum
my %EnumData;
foreach my $DonneeEnum (@BlocEnum) {
my ( $ContenuBloc, $NomEnum ) = $DonneeEnum =~ m/
{
([^}]+) # contenu du bloc (tout sauf accolade)
}
([^;]+);$ # Nom enum
/mgix;
# On enleve les retour chariot et espace
$NomEnum =~ s{[\n\s]}{}g;
$ContenuBloc =~ s{[\n\s]}{}g;
# Recupération des constances dans $ContenuBloc
my %Constante;
foreach my $Enumerateur ( split( ',', $ContenuBloc, -1 ) ) {
my ( $Nomvariable, $Valeur ) = split( '=', $Enumerateur, -1 );
$Constante{$Nomvariable} = $Valeur || 0;
}
# A chaque enum, on associ un hash contenant ces constance
$EnumData{$NomEnum} = \%Constante;
}
# Affichage des enum avec cnostances
print WRITER "Constantes definies dans les typedef: \n\n";
while ( my ( $Enum, $RefConstances ) = each %EnumData ) {
print WRITER "$Enum\n";
while ( my ( $constante, $valeur ) = each %{$RefConstances} ) {
print WRITER "\t- $constante = $valeur \n";
}
}
close(WRITER); |
Partager